全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 5009|回复: 18

[疑问] 阿里云盘秒传小工具

[复制链接]
发表于 2021-2-24 18:30:04 | 显示全部楼层 |阅读模式
本帖最后由 逸笙 于 2021-2-25 13:57 编辑

很多人有阿里云盘了,(不是讲的teambition)
阿里云盘还没开放分享文件,但可以秒传别人传过的文件,基于此,做了个小工具
代码如下:
  1. #/bin/bash/

  2. # Aliyundrive rapid upload
  3. # by 逸笙
  4. # 保存sha1的文件,需要以  文件名,sha1,字节大小  的格式一行一个
  5. # 会临时保存refresh token在下方文件中,注意删除

  6. tokenTmpfile="AliyundriveRapidUpload.tokenTmp"

  7. authUrl='https://websv.aliyundrive.com/token/refresh'
  8. apiUrl='https://api.aliyundrive.com/v2'

  9. function inputRefreshToken
  10. {
  11.   refreshToken=`cat "${tokenTmpfile}"`
  12.   if [ g"${refreshToken}" = g"" ]; then
  13.     read -p "输入refresh_token: " refreshToken
  14.   fi
  15. }

  16. function getAccessToken
  17. {
  18.   res=`curl -s "${authUrl}" \
  19.             -H 'Content-Type: application/json; charset=utf-8' \
  20.             -d '{"refresh_token": "'"${refreshToken}"'"}'`
  21. #  echo ${res}
  22.   if [[ "${res}" =~ "access_token" ]]; then
  23.     accessToken=`echo ${res} | awk -F 'access_token' '{print $2}' | awk -F '"' '{print $3}'`
  24.     refreshToken=`echo ${res} | awk -F 'refresh_token' '{print $2}' | awk -F '"' '{print $3}'`
  25.     driveId=`echo ${res} | awk -F 'default_drive_id' '{print $2}' | awk -F '"' '{print $3}'`
  26.     #echo "refreshToken=\'${refreshToken}\'" > ${tokenTmpfile}
  27.     echo "${refreshToken}" > ${tokenTmpfile}
  28.   else
  29.     echo 'Error in getting access token: '
  30.     echo ${res}
  31.     exit
  32.   fi
  33. }

  34. # $1 parentId
  35. # $2 folder name
  36. function createFolder
  37. {
  38.   url="${apiUrl}/file/create"
  39.   fid="$1"
  40.   n="$2"
  41.   if [[ "${n}" =~ "/" ]]; then
  42.     folder=${n%/*}
  43.     n=${n##*/}
  44.     fid=`createFolder "${fid}" "${folder}"`
  45.   fi
  46.   res=`curl -s "${url}" \
  47.             -H 'Content-Type: application/json; charset=utf-8' \
  48.             -H 'authorization: Bearer '"${accessToken}" \
  49.             -d '{
  50.               "check_name_mode": "refuse",
  51.               "drive_id": "'"${driveId}"'",
  52.               "parent_file_id": "'"${fid}"'",
  53.               "type": "folder",
  54.               "name": "'"${n}"'"
  55.             }'`
  56.   #echo ${res}
  57.   if [[ "${res}" =~ "file_id" ]]; then
  58.     fileId=`echo "${res}" | awk -F '"file_id' '{print $2}' | awk -F '"' '{print $3}'`
  59.     echo ${fileId}
  60.   else
  61.     echo ${res}
  62.     exit
  63.   fi
  64. }

  65. # $1 parentId
  66. # $2 file name
  67. # $3 file sha1
  68. # $4 file size
  69. function createFile
  70. {
  71.   url="${apiUrl}/file/create"
  72.   res=`curl -s "${url}" \
  73.             -H 'Content-Type: application/json; charset=utf-8' \
  74.             -H 'authorization: Bearer '"${accessToken}" \
  75.             -d '{
  76.   "check_name_mode": "refuse",
  77.   "content_hash": "'"$3"'",
  78.   "content_hash_name": "sha1",
  79.   "content_type": "",
  80.   "drive_id": "'"${driveId}"'",
  81.   "ignoreError": false,
  82.   "parent_file_id": "'"$1"'",
  83.   "type": "file",
  84.   "size": '"$4"',
  85.   "name": "'"$2"'",
  86.   "part_info_list": [{"part_number": 1}]
  87.                }'`
  88.   echo ${res}
  89. }

  90. function main
  91. {
  92.   inputRefreshToken
  93.   getAccessToken

  94.   if [ g"$1" = g"" ]; then
  95.     read -p "输入文件:" sha1filename
  96.   else
  97.     sha1filename=$1
  98.   fi

  99.   # 预留指定目录
  100.   # 目前根目录
  101.   parentId="root"  

  102.   while read line
  103.   do
  104.     #echo $line
  105.     rapid=0
  106.     oname=`echo ${line} | awk -F ',' '{print $1}'`
  107.     sha1=`echo ${line} | awk -F ',' '{print $2}'`
  108.     size=`echo ${line} | awk -F ',' '{print $3}'`
  109.     if [[ "${oname}" =~ "/" ]]; then
  110.       folder=${oname%/*}
  111.       name=${oname##*/}
  112.       folderId=`createFolder "${parentId}" "${folder}"`
  113.       #echo ${folder},${name},${folderId}
  114.     else
  115.       folderId=${parentId}
  116.       name=${oname}
  117.     fi

  118.     result=`createFile "${folderId}" "${name}" "${sha1}" "${size}"`
  119.     # 预留access token过期
  120.     #if []; then
  121.     #  getAccessToken
  122.     #  result=`createFile "${folderId}" "${name}" "${sha1}" "${size}"`
  123.     #fi

  124.     rapid=`echo ${result} | awk -F 'rapid_upload":' '{print $2}' | awk -F ',' '{print $1}'`
  125.     if [ g"${rapid}" = g"true" ]; then
  126.       echo "  秒传 ${oname}"
  127.     else
  128.       if [[ "${result}" =~ "upload_url" ]]; then
  129.         echo "无人上传 ${oname}"
  130.       else
  131.         exist=`echo ${result} | awk -F 'exist":' '{print $2}' | awk -F ',' '{print $1}' | awk -F '}' '{print $1}'`
  132.         if [ g"${exist}" = g"true" ]; then
  133.           echo "  已有 ${oname}"
  134.         else
  135.           echo "${result}"
  136.         fi
  137.       fi
  138.     fi
  139.   done < ${sha1filename}

  140. }

  141. main "$1"

复制代码


用法:bash /root/AliyunRapidUpload.sh /root/filesha1.txt
或:bash /root/AliyunRapidUpload.sh 再输入sha1文件

从目标文件中读取 文件名,sha1,大小,然后尝试秒传(目前上传到根目录)
此目标文件里面的格式为   文件名(英文逗号)文件的sha1(英文逗号)文件的字节大小,一行放一个,如:
WePE_64_V2.0.exe,C2648E0A0003681102F1D790EAC93CA2978CD91E,217464180
aaaaaaaaaaaaa.exe,C2648E0A0003681102F1D790EAC93CA2978CD91E,217464180
bbbbbbbbbbbb.exe,C2648E0A0003681102F1D790EAC93CA2978CD91E,217464180

其实就是csv。

让你输入的token会保存在最开始指定的那个临时文件中,注意安全。

具体sha1文件就要靠大家集中提供了。

另写了个配套生成sha1文件的东东:
https://scfonedrive.github.io/Aliyundrive/getSha1.html


发表于 2021-2-24 18:30:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2021-2-24 18:34:12 | 显示全部楼层
感谢楼主分享
发表于 2021-2-24 18:34:47 | 显示全部楼层
本帖最后由 host5217 于 2021-2-24 18:36 编辑

阿里云盘没有自带秒传效果吗
发表于 2021-2-24 18:35:14 | 显示全部楼层
阿里云盘上传的时候会校验SHA1 如果有的话就是秒传,如果没有的话就是直连COS上传  没必要做工具的吧
发表于 2021-2-24 18:36:40 来自手机 | 显示全部楼层
感谢分享 前几天李恒道好像也做了一个
发表于 2021-2-24 18:38:32 | 显示全部楼层
我已经传了700多G上去
 楼主| 发表于 2021-2-24 18:38:46 | 显示全部楼层
师太 发表于 2021-2-24 18:35
阿里云盘上传的时候会校验SHA1 如果有的话就是秒传,如果没有的话就是直连COS上传  没必要做工具的吧 ...

但这样可以在我本身没有这个文件的情况下上传上去,只要有人提供这个sha1跟字节。
 楼主| 发表于 2021-2-25 13:53:54 | 显示全部楼层
文件名中可以含目录名了,如:
saenai2路人女主2/02.mp4,8913404cf31bad87598fa82aa77260879bbeb7fe,163228932
saenai2路人女主2/10.mp4,4b76feb0bb7d00851dee2755de858265e9f3abd2,140593782
saenai2路人女主2/04.mp4,9d390ab83aeeacc66f1d28f9e5d594bd49ecc181,272638489
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-11-23 07:23 , Processed in 0.063972 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表