Coder Social home page Coder Social logo

aliyunpan's Introduction

aliyunpan

Build Status GitHub PyPI GitHub all releases wiki


阿里云盘cli
环境要求: python 3.7 通过测试
低版本环境运行报错参考issue9

安装

pip install aliyunpan

更新

pip install aliyunpan --upgrade

运行

aliyunpan-cli

pyinstaller打包

最新版下载 (GitHub Actions打包,glibc版本较高 #42)
第三方下载 (更新较慢)

克隆项目

  • --recurse-submodules 用于克隆子模块,部分功能需要(可选)
git clone https://github.com/wxy1343/aliyunpan --recurse-submodules

获取refresh_token

token

注意

  • web端获取的refresh_token有防盗链检测
  1. 可以指定账号密码登入
  2. 可以通过手机端查找日志获取refresh_token

/sdcard/Android/data/com.alicloud.databox/files/logs/trace/userId/yunpan/latest.log

  • 登录api加入了ua检测,需要运行混淆的js代码来获取ua
  • 推荐安装 node.jsjsdom 模块来运行js代码
  • 目前阿里云盘修改了ua的算法,加入了鼠标移动之类的信息,如果有解决方法的欢迎来pr
npm install jsdom

配置refresh_token

echo "refresh_token: 'xxxxx'"  >  ~/.config/aliyunpan.yaml

配置账号(可选)

echo "username: 'xxxxx'"  >  ~/.config/aliyunpan.yaml
echo "password: 'xxxxx'"  >>  ~/.config/aliyunpan.yaml

配置aria2(可选)

cat >> ~/.config/aliyunpan.yaml <<EOF
aria2:
  'host': 'http://localhost'
  'port': 6800
  'secret': ''
EOF

功能介绍

指令 描述
download (d) 下载文件/文件夹
ls (dir,l,list) 列目录
mv (move) 移动文件/文件夹
rm (del,delete) 删除文件/文件夹
rename (r) 重命名文件/文件夹
tree (show,t) 查看文件树
upload (u) 上传文件/文件夹
share (s) 分享文件
mkdir (m) 创建文件夹
cat (c) 显示文件内容
tui 文本用户界面
search 搜索文件/文件夹
sync 同步文件夹
token (r,refresh_token) 查看refresh_token

使用指南

  • 查看帮助
aliyunpan-cli -h
查看详情
参数 描述
-h, --help 查看帮助
--version 查看版本
-c, --config-file 指定配置文件
-t, --refresh-token 指定REFRESH_TOKEN
-u, --username 指定账号
-p, --password 指定密码
-d, --depth 文件递归深度
-T, --timeout 请求超时时间(秒)
-id, --drive-id 指定drive_id
-a, --album 是否访问相册
-s, --share-id 指定分享id
-sp, --share-pwd 指定分享密码
-f, --filter-file 过滤文件(多个)
-w, --whitelist 使用白名单过滤文件
-m, --match 指定使用正则匹配文件
  • 查看指令参数
aliyunpan-cli COMMAND -h
查看详情
指令 参数 描述
download -p, --file 选择文件(多个)
download -s, --share 指定分享的序列文件
download -cs, --chunk-size 分块大小(字节)
download -a, --aria2 发送到aria2
ls,search -l 查看详情
share -p, --file 指定文件(多个)
share -f, --file-id 指定file_id(多个)
share -t, --expire-sec 分享过期时间(秒),默认最大14400
share -l, --share-link 输出分享链接
share -d, --download-link 输出下载链接
share -s, --save 保存序列文件到云盘和本地
share -S, --share-official 官方分享功能(需要账号支持)
upload -p, --file 选择文件(多个)
upload,sync -t, --time-out 分块上传超时时间(秒)
upload,sync -r, --retry 上传失败重试次数
upload -f, --force 强制覆盖文件
upload -s, --share 指定分享的序列文件
upload,sync -cs, --chunk-size 分块大小(字节)
upload -c 断点续传
cat -e, --encoding 文件编码
sync -st, --sync-time 同步间隔时间
sync --no-delete, -n 不删除(云盘/本地)文件(默认)
sync -d, --delete 允许删除(云盘/本地)文件
sync -l, --local 同步云盘文件到本地
token --refresh, -r 刷新配置文件token
token --refresh-time, -t 自动刷新token间隔时间(秒)
token --change, -c 设置新的refresh_token

断点续传

  • 将文件分成多块顺序上传
  • 文件上传进度保存在当前目录下的tasks.yaml
  • 格式
    文件sha1:
      path: 绝对路径
      upload_id: 上传id
      file_id: 文件id
      chunk_size: 分块大小
      part_number: 最后上传的分块编号
  • 文件未上传成功时,CTRL+C会自动保存
  • 断点续传需带上参数-c

分享

  • 由于官方修改秒传接口导致该功能失效
  • 暂时采用在秒传链接中加入直链的方法用以获取proof_code
  • 分享秒传文件时需要通过直链获取文件随机8字节,导致速度较慢
  • 由于直链的局限,秒传链接有效期为4小时

1.分享链接格式

aliyunpan://文件名|sha1|url_base64|文件大小|相对路径

例如

  • 以下秒传链接均已失效,仅供参考
aliyunpan://示例文件.txt|F61851825609372B3D7F802E600B35A497CFC38E|url_base64|24|root

2.文件分享

aliyunpan-cli share 示例文件.txt 

导入

aliyunpan-cli upload "aliyunpan://示例文件.txt|F61851825609372B3D7F802E600B35A497CFC38E|url_base64|24|root"

3.文件夹分享

aliyunpan-cli share 示例文件夹

导入

aliyunpan-cli upload -s "aliyunpan://示例文件夹|80E7E25109D4246653B600FDFEDD8D8B0D97E517|url_base64|970|root"

TUI按键指南

  • 显示菜单(ctrl+x)
  • 退出(ctrl+c)
  • 切换标签(↑↓←→,kjhl,TAB)

环境变量

ALIYUNPAN_CONF 配置文件路径
ALIYUNPAN_ROOT 根目录(log和tasks输出路径)

致谢

感谢 zhjc1124/aliyundrive 的登录接口参考

aliyunpan's People

Contributors

fireinice avatar haoshenqi0123 avatar jiahut avatar sbwml avatar tecyang avatar wxy1343 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aliyunpan's Issues

SystemError: Invalid argument

python main.py upload -p /xxx

Traceback (most recent call last):
  File "/project/liuye/aliyunpan/main.py", line 114, in <module>
    cli()
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/project/liuye/aliyunpan/main.py", line 69, in upload
    commander.upload(path_list, upload_path, time_out, retry, force)
  File "/project/liuye/aliyunpan/aliyunpan/cli/cli.py", line 97, in upload
    self._disk.upload_file(self._path_list.get_path_fid(file[0]), *file[1])
  File "/project/liuye/aliyunpan/aliyunpan/api/utils.py", line 49, in decorated
    return loop.run_until_complete(f(*args, **kwargs))
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/nest_asyncio.py", line 70, in run_until_complete
    return f.result()
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/asyncio/futures.py", line 201, in result
    raise self._exception
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/asyncio/tasks.py", line 256, in __step
    result = coro.send(None)
  File "/project/liuye/aliyunpan/aliyunpan/api/core.py", line 165, in upload_file
    chunk = await f.read(split_size)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/aiofile/utils.py", line 211, in read
    return await self.__read(length)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/aiofile/utils.py", line 205, in __read
    data = await self.file.read_bytes(length, self._offset)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/aiofile/aio.py", line 202, in read_bytes
    return await self.__context.read(size, self.fileno(), offset)
  File "/home/liuye/project/miniconda3/envs/drive/lib/python3.9/site-packages/caio/asyncio_base.py", line 88, in submit
    return op.get_value()
SystemError: Invalid argument

在Releases下载的可执行文件运行错误

我下载并解压了aliyunpan-cli-Windows-x86_64-v2.6.0-96229c9.tar.gz后,将aliyunpan.yaml放在%UserProfiles%\.config\aliyunpan.yaml,运行aliyunpan-cli ls,会报错

错误日志:

Traceback (most recent call last):
  File "main.py", line 179, in <module>
  File "click\core.py", line 829, in __call__
  File "click\core.py", line 782, in main
  File "click\core.py", line 1259, in invoke
  File "click\core.py", line 1066, in invoke
  File "click\core.py", line 610, in invoke
  File "main.py", line 87, in upload
  File "aliyunpan\cli\cli.py", line 250, in upload
  File "aliyunpan\api\core.py", line 339, in upload_file
  File "aliyunpan\api\core.py", line 216, in create_file
  File "aliyunpan\api\core.py", line 44, in <lambda>
  File "aliyunpan\api\core.py", line 575, in _drive_id_gen
  File "aliyunpan\api\core.py", line 558, in get_drive_id
  File "aliyunpan\api\core.py", line 180, in get_user_info
  File "aliyunpan\api\req.py", line 92, in post
  File "aliyunpan\api\req.py", line 62, in _req
  File "aliyunpan\api\core.py", line 42, in <lambda>
  File "aliyunpan\api\core.py", line 548, in _access_token_gen
  File "aliyunpan\api\core.py", line 526, in get_access_token
  File "aliyunpan\api\req.py", line 92, in post
  File "aliyunpan\api\req.py", line 63, in _req
  File "requests\sessions.py", line 590, in post
  File "requests\sessions.py", line 542, in request
  File "requests\sessions.py", line 655, in send
  File "requests\adapters.py", line 439, in send
  File "urllib3\connectionpool.py", line 696, in urlopen
  File "urllib3\connectionpool.py", line 964, in _prepare_proxy
  File "urllib3\connection.py", line 359, in connect
  File "urllib3\connection.py", line 500, in _connect_tls_proxy
  File "urllib3\util\ssl_.py", line 453, in ssl_wrap_socket
  File "urllib3\util\ssl_.py", line 495, in _ssl_wrap_socket_impl
  File "ssl.py", line 500, in wrap_socket
  File "ssl.py", line 997, in _create
ValueError: check_hostname requires server_hostname
[9788] Failed to execute script 'main' due to unhandled exception!

奇怪的是,我在另一台电脑上正常运行

更新新版本2.7.11依旧不能秒传本地文件

大佬,刚才更新后使用你的最新版2.7.11还是无法妙传本地文件,已经在网盘上存在了的文件,以前可以的,阿里修改接口后,听说只是不能空传验证上传,问题是我用实实在在的本地文件还是得重新开始传,不能秒传。提示如下

root@debian:/data/Downloads# aliyunpan upload Unfaithful.2002.1080p.BrRip.x264.BOKUTOX.YIFY.mp4 /
[][hash]Unfaithful.2002.1080p.BrRip.x264.BOKUTOX.YIFY.mp4
[+][hash]Unfaithful.2002.1080p.BrRip.x264.BOKUTOX.YIFY.mp4
[
][upload]Unfaithful.2002.1080p.BrRip.x264.BOKUTOX.YIFY.mp4
upload... [**********] 0.64% 139.39KB/s^C
Aborted!

本地文件上传验证完成hash后,还是会重新传,不会秒传。。大佬,求解决。

是否有选项忽略sync文件夹时读取出错的文件

我用WSL来sync我的OneDrive到阿里云盘,但是OneDrive文件夹里有几个文件是系统的文件,同步到这几个系统文件时就会抛出异常提示"Permission denied"。
是否有选项忽略sync文件夹时读取出错的文件?

异常如下:

Traceback (most recent call last):
File "/home/liqiang/.local/bin/aliyunpan", line 8, in
sys.exit(main())
File "/home/liqiang/.local/lib/python3.9/site-packages/main.py", line 202, in main
cli()
File "/usr/lib/python3/dist-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/lib/python3/dist-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3/dist-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3/dist-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3/dist-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/home/liqiang/.local/lib/python3.9/site-packages/main.py", line 171, in sync
commander.sync(path, upload_path, sync_time, time_out, chunk_size, retry)
File "/home/liqiang/.local/lib/python3.9/site-packages/aliyunpan/cli/cli.py", line 556, in sync
return self.sync(path.absolute(), upload_path, sync_time, time_out, chunk_size, retry, first=first)
File "/home/liqiang/.local/lib/python3.9/site-packages/aliyunpan/cli/cli.py", line 562, in sync
self.upload(path, upload_path, timeout=time_out, chunk_size=chunk_size, retry=retry)
File "/home/liqiang/.local/lib/python3.9/site-packages/aliyunpan/cli/cli.py", line 288, in upload
result = self._disk.upload_file(
File "/home/liqiang/.local/lib/python3.9/site-packages/aliyunpan/api/core.py", line 316, in upload_file
content_hash = get_sha1(path, self._chunk_size)
File "/home/liqiang/.local/lib/python3.9/site-packages/aliyunpan/api/utils.py", line 40, in get_sha1
with open(path, 'rb') as f:
PermissionError: [Errno 13] Permission denied: '/mnt/d/OneDrive/.849C9593-D756-4E56-8D6E-42412F2A707B'

TypeError: unlink() got an unexpected keyword argument 'missing_ok'

Exception ignored in: <bound method Commander.del of <aliyunpan.cli.cli.Commander object at 0x107074c18>>
Traceback (most recent call last):
File "/Users/lujango/Downloads/aliyunpan-main/aliyunpan/cli/cli.py", line 29, in del
File "/Users/lujango/Downloads/aliyunpan-main/aliyunpan/cli/config.py", line 25, in write
TypeError: unlink() got an unexpected keyword argument 'missing_ok'

在分块较大的情况下上传链接过期再上传会导致异常

log参考:

2021-06-25 13:10:43 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 164 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=164&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=VZ9T3InGx4p%2BjTsuutNcjPD8Lm%2FmPRqSrzZHOCzUS7g%3D&x-oss-signature-version=OSS2.
2021-06-25 13:11:00 [req.py:49] _req DEBUG - 200
2021-06-25 13:11:00 [req.py:63] _req DEBUG - 
2021-06-25 13:11:00 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 165 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=165&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=20oVarNjzcU60p0PqWpDcm%2FJ48khSz0uht2XaDWtsOY%3D&x-oss-signature-version=OSS2.
2021-06-25 13:11:20 [req.py:49] _req DEBUG - 200
2021-06-25 13:11:20 [req.py:63] _req DEBUG - 
2021-06-25 13:11:20 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 166 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=166&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=fK8z%2Fw4hkjKSUMp3ZUQYu61V1UKi%2B%2BAqODJhsFnkiyE%3D&x-oss-signature-version=OSS2.
2021-06-25 13:11:41 [req.py:49] _req DEBUG - 200
2021-06-25 13:11:41 [req.py:63] _req DEBUG - 
2021-06-25 13:11:41 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 167 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=167&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=EVMULDEbrsCZzISOKTqKz3EGsZm9DSAhievSS7pZm%2Bw%3D&x-oss-signature-version=OSS2.
2021-06-25 13:11:58 [req.py:49] _req DEBUG - 200
2021-06-25 13:11:58 [req.py:63] _req DEBUG - 
2021-06-25 13:11:58 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 168 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=168&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=UF6nwfVxF%2BTdRLInvKhHqrB58Lckb6rgsUvMGoC5ars%3D&x-oss-signature-version=OSS2.
2021-06-25 13:12:20 [req.py:49] _req DEBUG - 200
2021-06-25 13:12:20 [req.py:63] _req DEBUG - 
2021-06-25 13:12:20 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 169 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=169&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=FUm76ENmZddwbS32ImtInvlL4p7Gc4lBw%2Bixzr2tB6E%3D&x-oss-signature-version=OSS2.
2021-06-25 13:12:37 [req.py:49] _req DEBUG - 200
2021-06-25 13:12:37 [req.py:63] _req DEBUG - 
2021-06-25 13:12:38 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 170 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=170&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=%2FyaJy3jB0XuSw%2BwyEzX9D7JDacUlg%2BcdzCQ%2F0aIomUg%3D&x-oss-signature-version=OSS2.
2021-06-25 13:13:00 [req.py:49] _req DEBUG - 200
2021-06-25 13:13:00 [req.py:63] _req DEBUG - 
2021-06-25 13:13:00 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 171 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=171&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=1%2BCzU2LazryKfhdwTDNTdXs4IrwNa42UUd6VE4UK6PU%3D&x-oss-signature-version=OSS2.
2021-06-25 13:13:17 [req.py:49] _req DEBUG - 200
2021-06-25 13:13:17 [req.py:63] _req DEBUG - 
2021-06-25 13:13:17 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 172 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=172&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=8NXZCWQPULsAbrl%2FQ7Q2pwf0bo63%2BMSAdNNSC71QoO8%3D&x-oss-signature-version=OSS2.
2021-06-25 13:13:33 [req.py:49] _req DEBUG - 200
2021-06-25 13:13:33 [req.py:63] _req DEBUG - 
2021-06-25 13:13:34 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 173 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=173&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=qOIgeU6GD2%2BO1ffUp9RccYDi1RGEHVDvo6pYgPKqW5c%3D&x-oss-signature-version=OSS2.
2021-06-25 13:13:59 [req.py:49] _req DEBUG - 200
2021-06-25 13:13:59 [req.py:63] _req DEBUG - 
2021-06-25 13:13:59 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:13:59 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:03 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:03 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:07 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:08 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:12 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:13 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:17 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:17 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:21 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:21 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:25 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:26 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:30 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:30 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:34 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:34 [core.py:516] upload_file WARNING - Upload timeout.
2021-06-25 13:14:38 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624598029&x-oss-signature=JSkWs%2BnesMGJdtKhALNwQatradyUPz02PYA4AGJIuL4%3D&x-oss-signature-version=OSS2.
2021-06-25 13:14:38 [req.py:49] _req DEBUG - 403
2021-06-25 13:14:38 [req.py:63] _req DEBUG - <?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Request has expired.</Message>
  <RequestId>60D5663EB4E98C373013937B</RequestId>
  <HostId>bj29.cn-beijing.data.alicloudccp.com</HostId>
  <Expires>2021-06-25T05:13:49.000Z</Expires>
  <ServerTime>2021-06-25T05:14:38.000Z</ServerTime>
</Error>

2021-06-25 13:14:38 [core.py:538] upload_file WARNING - Part 174 upload request has expired.
2021-06-25 13:14:40 [req.py:49] _req DEBUG - 401
2021-06-25 13:14:40 [core.py:667] get_access_token INFO - Get ACCESS_TOKEN.
2021-06-25 13:14:40 [req.py:49] _req DEBUG - 200
2021-06-25 13:14:40 [core.py:675] get_access_token DEBUG - eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJhZjBhNWMyNWYxNDc0ZDlhODhlY2JjZTZiMWM3MmIxNyIsImN1c3RvbUpzb24iOiJ7XCJjbGllbnRJZFwiOlwiMjVkelgzdmJZcWt0Vnh5WFwiLFwiZG9tYWluSWRcIjpcImJqMjlcIixcInNjb3BlXCI6W1wiRFJJVkUuQUxMXCIsXCJTSEFSRS5BTExcIixcIkZJTEUuQUxMXCIsXCJVU0VSLkFMTFwiLFwiU1RPUkFHRS5BTExcIixcIlNUT1JBR0VGSUxFLkxJU1RcIixcIkJBVENIXCIsXCJPQVVUSC5BTExcIixcIklNQUdFLkFMTFwiLFwiSU5WSVRFLkFMTFwiLFwiQUNDT1VOVC5BTExcIl0sXCJyb2xlXCI6XCJ1c2VyXCIsXCJyZWZcIjpcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cIn0iLCJleHAiOjE2MjQ2MDUyODAsImlhdCI6MTYyNDU5ODAyMH0.UhxVk4OJWYbvPiW-3gLewpjXAZLrv1CLceXxR6GdGI_e-eeqJjh92LfXo5z43s_XL-LXRkAU_LdbDEs2xKQ7By3Ore8Np8L01pffVLLDz-rmEtNROckHS44nusqJOJqIrsGyxHRoJMB_kJeohXCLMeb0hEtHu-pzfgcsY7GbnzA
2021-06-25 13:14:40 [req.py:49] _req DEBUG - 200
2021-06-25 13:14:40 [core.py:553] upload_file INFO - The upload_url of Part 174 has been refreshed.
2021-06-25 13:14:40 [core.py:556] upload_file DEBUG - https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=wFhhLa3BPgHVGomaebybSt2XI70IEw%2FDgt6oiyKh1S8%3D&x-oss-signature-version=OSS2
2021-06-25 13:14:43 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 174 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=174&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=wFhhLa3BPgHVGomaebybSt2XI70IEw%2FDgt6oiyKh1S8%3D&x-oss-signature-version=OSS2.
2021-06-25 13:15:01 [req.py:49] _req DEBUG - 200
2021-06-25 13:15:01 [req.py:63] _req DEBUG - 
2021-06-25 13:15:02 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 175 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=175&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=qrxbxoodbO81jZfEvsVAStAgf2Tldh5FDMInOinwb%2FA%3D&x-oss-signature-version=OSS2.
2021-06-25 13:15:21 [req.py:49] _req DEBUG - 200
2021-06-25 13:15:21 [req.py:63] _req DEBUG - 
2021-06-25 13:15:21 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 176 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=176&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=46mL4sgalPIPnIZuQlWFabJT9U53v4MaQL%2Fz7Md0vTI%3D&x-oss-signature-version=OSS2.
2021-06-25 13:15:43 [req.py:49] _req DEBUG - 200
2021-06-25 13:15:43 [req.py:63] _req DEBUG - 
2021-06-25 13:15:44 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 177 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=177&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=M%2BQlfq%2BWesJXwLqVFwxD%2FFDH82LqwhZj3FPA%2BUfH0iM%3D&x-oss-signature-version=OSS2.
2021-06-25 13:16:05 [req.py:49] _req DEBUG - 200
2021-06-25 13:16:05 [req.py:63] _req DEBUG - 
2021-06-25 13:16:05 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 178 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=178&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=aw9EO7oFLBqPqNJ6dsLQ1F1GXSff8QcSqg179MDAsjg%3D&x-oss-signature-version=OSS2.
2021-06-25 13:16:24 [req.py:49] _req DEBUG - 200
2021-06-25 13:16:24 [req.py:63] _req DEBUG - 
2021-06-25 13:16:24 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 179 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=179&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=1vVfE8Wi8v%2B24vUecTtknKk1iH0suOHW46GcckoFSLE%3D&x-oss-signature-version=OSS2.
2021-06-25 13:16:48 [req.py:49] _req DEBUG - 200
2021-06-25 13:16:48 [req.py:63] _req DEBUG - 
2021-06-25 13:16:48 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 180 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=180&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=Lu6Qbu83qxLJA%2BMMt8zNXoqJBQVIFS5DQN7yPH5CdEM%3D&x-oss-signature-version=OSS2.
2021-06-25 13:17:10 [req.py:49] _req DEBUG - 200
2021-06-25 13:17:10 [req.py:63] _req DEBUG - 
2021-06-25 13:17:10 [core.py:490] upload_file DEBUG - (upload_id=7852A6F3C4A0451680D16AE0A7833951, file_id=60d557fd36d5e75429994822b88db02c2ad04eff, size=10485760): Upload part of 181 to https://bj29.cn-beijing.data.alicloudccp.com/xSKG4bTk%2F1164371%2F60d557fd36d5e75429994822b88db02c2ad04eff%2F60d557fdbc72e3dac7bf4eaf880b5f7866888ac4?partNumber=181&uploadId=7852A6F3C4A0451680D16AE0A7833951&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1624601680&x-oss-signature=AZv00x7DhBwn%2F4qLKWddKwasDnYDOdfC98fsATfBTSk%3D&x-oss-signature-version=OSS2.

建议修改上传过期触发刷新的逻辑,改成主动触发,例如改成按时间,大约50分钟刷新一次。
因为超时次数过多会导致重传,我昨天就一直在重传。。。导致一个文件都没传上去

另外顺便给所有的api函数请求都加一下重试吧,最近ls也出现了上个issue的超时问题

建议使用refresh_token

为什么不直接使用access_token,因为有效期只有两小时。

获取refresh_token其实没这么麻烦,我们只需要登陆阿里云盘之后,打开开发者工具,切换到Application选项卡,点开Local storage,会有一个token项,点开就可以看到refresh_token了

账号密码登录报错

Traceback (most recent call last):
  File "main.py", line 183, in <module>
    cli()
  File "/Users/weiqi/Library/Python/3.7/lib/python/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/Users/weiqi/Library/Python/3.7/lib/python/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Users/weiqi/Library/Python/3.7/lib/python/site-packages/click/core.py", line 1256, in invoke
    Command.invoke(self, ctx)
  File "/Users/weiqi/Library/Python/3.7/lib/python/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/weiqi/Library/Python/3.7/lib/python/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "main.py", line 31, in cli
    commander.init(config_file=config_file, depth=depth)
  File "/Users/weiqi/Documents/cli/aliyunpan/aliyunpan/cli/cli.py", line 69, in init
    self._disk.login(username, password)
  File "/Users/weiqi/Documents/cli/aliyunpan/aliyunpan/api/core.py", line 92, in login
    raise LoginFailed
aliyunpan.exceptions.LoginFailed

C675363D-C775-4311-B23D-481E227962FE

腾讯云服务器无法使用

aliyunpan-cli-Linux-x86_64-v2.7.10-04864c0.tar.gz

[root@VM-0-3-centos ~]# ./aliyunpan-cli ls
[13088] Error loading Python lib /tmp/_MEIn8257r/libpython3.9.so.1.0

master分支不可用,dev分支可以报错如下

Traceback (most recent call last):
File "main.py", line 8, in
from aliyunpan.cli.cli import Commander
File "/aliyunpan/aliyunpan/cli/init.py", line 1, in
from aliyunpan.cli.cli import Commander
File "/aliyunpan/aliyunpan/cli/cli.py", line 20, in
class Commander:
File "/aliyunpan/aliyunpan/cli/cli.py", line 111, in Commander
def get_path_list(self, path='root') -> list[FileInfo]:
TypeError: 'type' object is not subscriptable

aliyunpan.log的问题

你好开发者,aliyunpan.log和task.yaml能不能在~固定的目录生成?我把此cli工具是我主要生产力工具,问题是,我在那里运行命令,在哪一个目录都会生成aliyunpan.log文件。

上传速度

这个上传大文件速度快么,我这边一直1M/s在上传

上传的时候出现错误

日志:

Traceback (most recent call last):
  File "main.py", line 179, in <module>
  File "click\core.py", line 829, in __call__
  File "click\core.py", line 782, in main
  File "click\core.py", line 1259, in invoke
  File "click\core.py", line 1066, in invoke
  File "click\core.py", line 610, in invoke
  File "main.py", line 87, in upload
  File "aliyunpan\cli\cli.py", line 250, in upload
  File "aliyunpan\api\core.py", line 373, in upload_file
  File "aliyunpan\common.py", line 236, in upload_info
  File "aliyunpan\common.py", line 202, in <lambda>
  File "aliyunpan\common.py", line 149, in <lambda>
  File "aliyunpan\common.py", line 166, in _output_gen
UnicodeEncodeError: 'gbk' codec can't encode character '\u266a' in position 93: illegal multibyte sequence
[10708] Failed to execute script 'main' due to unhandled exception!

文件名是[web Girlfriend (♪)][01][怡萱动漫][www.yxdm.tv].mp4

很好用的脚本,魔改了一下。

增加了下载单个文件的功能,同时加了一点逻辑,可以在命令行中直接用,类似于:

上传:
python3 main.py u /file/to/upload.pdf /path/in/aliyundrive
下载:
python3 main.py d /file/in/aliyundrive.pdf /path/to/sava

代码:

import hashlib
import math
import os
import sys
import time
import urllib
from multiprocessing.dummy import Pool, Queue

import requests

'''
用法:
上传:
python3 main.py u /file/to/upload.pdf /path/in/aliyundrive
下载:
python3 main.py d /file/in/aliyundrive.pdf /path/to/sava
'''

pool = Pool(5)
q = Queue(maxsize=5)


def get_list(access_token, drive_id, parent_file_id='root'):
    """
    获取文件列表
    """
    url = 'https://api.aliyundrive.com/v2/file/list'
    headers = {'User-Agent': None, 'Authorization': access_token}
    json = {"drive_id": drive_id, "parent_file_id": parent_file_id}
    r = requests.post(url, headers=headers, json=json)
    return r.json()

def get_list_clean(access_token, drive_id, parent_file_id='root'):
    raw_info = get_list(access_token, drive_id, parent_file_id)
    list_info = {'folders':[],'files':[]}
    for i in raw_info['items']:
        if i['type'] == 'folder':
            i_name = i['name']
            i_file_id = i['file_id']
            list_info['folders'].append({'name':i_name,'file_id':i_file_id})
        if i['type'] == 'file':
            i_name = i['name']
            i_file_id = i['file_id']
            list_info['files'].append({'name':i_name,'file_id':i_file_id})
    return list_info

def get_download_url(access_token, drive_id, file_id):
    """
    获取单个文件的下载链接
    """
    url = 'https://api.aliyundrive.com/v2/file/get_download_url'
    headers = {'User-Agent': None, 'Authorization': access_token}
    json = {"drive_id": drive_id, "file_id": file_id}
    r = requests.post(url, headers=headers, json=json)
    return r.json()['url']


def litter_seacher(name,f_list):
    for f in f_list:
        if f['name'] == name:
            return f['file_id']
    raise 'PATH ERROR!'

def get_folder_id_by_path(access_token, drive_id, folder_path):
    raw_names = folder_path.rstrip('/').split('/')
    names = list(filter(lambda x:x!='',raw_names))
    if names == []:
        return 'root'
    list_info = get_list_clean(access_token, drive_id)
    file_id   = litter_seacher(names[0],list_info['folders'])
    if len(names) == 1:
        return file_id
    else:
        for folder_name in names[1:]:
            list_info = get_list_clean(access_token, drive_id,file_id)
            file_id   = litter_seacher(folder_name,list_info['folders'])
        return file_id

def get_download_url_by_path(access_token, drive_id, file_path):
    raw_names = file_path.rstrip('/').split('/')
    names = list(filter(lambda x:x!='',raw_names))
    if len(names) == 1:
        list_info = get_list_clean(access_token, drive_id)
        file_id = litter_seacher(names[0],list_info['files'])
        return get_download_url(access_token, drive_id, file_id)
    else:
        list_info = get_list_clean(access_token, drive_id)
        parent_file_id = litter_seacher(names[0],list_info['folders'])
        for folder_name in names[1:-1]:
            list_info = get_list_clean(access_token, drive_id,parent_file_id)
            parent_file_id = litter_seacher(folder_name,list_info['folders'])
        list_info = get_list_clean(access_token, drive_id,parent_file_id)
        file_id = litter_seacher(names[-1],list_info['files'])
        return get_download_url(access_token, drive_id, file_id)

def get_user(access_token):
    """
    获取用户信息
    """
    url = 'https://api.aliyundrive.com/v2/user/get'
    headers = {'User-Agent': None, 'Authorization': access_token}
    r = requests.post(url, headers=headers, json={})
    return r.json()


def refresh(refresh_token):
    """
    获取access_token
    :param refresh_token: 
    :return: access_token
    """
    url = 'https://websv.aliyundrive.com/token/refresh'
    json = {"refresh_token": refresh_token}
    headers = {'User-Agent': None}
    r = requests.post(url, json=json, headers=headers)
    return r.json()['access_token']


def upload_file(access_token, drive_id, parent_file_id='root', path=None):
    """
    上传文件
    """

    def upload(kwargs):
        part_number, upload_url, chunk = kwargs['part_number'], kwargs[
            'upload_url'], kwargs['chunk']
        size = len(chunk)
        if not chunk:
            return
        # 等待上一个线程上传完毕(本来想搞多线程上传的,但是网盘不支持,也懒得改了)
        while True:
            if part_number == 1:
                break
            data = q_pool.get()
            if data == part_number - 1:
                break
            else:
                q_pool.put(data)
        start_time = time.time()
        r = requests.put(upload_url, headers=headers, data=chunk)
        end_time = time.time()
        etag = r.headers['ETag']
        # 通知下一个线程上传
        q_pool.put(part_number)
        # 通知主线程
        q.put({
            'part_info_list': {
                'part_number': part_number,
                'etag': etag
            },
            'size': size,
            'time': end_time - start_time
        })

    split_size = 5242880  # 默认5MB分片大小(不要改)
    file_size = os.path.getsize(path)
    _, file_name = os.path.split(path)
    # 获取sha1
    with open(path, 'rb') as f:
        sha1 = hashlib.sha1()
        count = 0
        while True:
            chunk = f.read(split_size)
            if not chunk:
                break
            count += 1
            sha1.update(chunk)
        content_hash = sha1.hexdigest()
    # 分片列表
    part_info_list = []
    for i in range(count):
        part_info_list.append({"part_number": i + 1})
    json = {
        "name": file_name,
        "type": "file",
        "size": file_size,
        "drive_id": drive_id,
        "parent_file_id": parent_file_id,
        "part_info_list": part_info_list,
        "content_hash_name": "sha1",
        "content_hash": content_hash,
        # 如果文件存在则自动重命名(删了上传会出现名字一模一样的文件)
        "check_name_mode": "auto_rename"
    }
    # 申请创建文件
    url = 'https://api.aliyundrive.com/v2/file/create'
    headers = {'User-Agent': None, 'Authorization': access_token}
    r = requests.post(url, headers=headers, json=json)
    # 如果存在匹配的hash值的文件则不会重复上传
    rapid_upload = r.json()['rapid_upload']
    if rapid_upload:
        print('快速上传成功')
    else:
        # 多线程队列
        q_pool = Queue(maxsize=5)
        upload_id = r.json()['upload_id']
        file_id = r.json()['file_id']
        part_info_list = r.json()['part_info_list']
        part_info_list_new = []
        total_time = 0
        count_size = 0
        k = 0
        sys.stdout.write(f'\r上传中... [{"*" * 10}] %0')
        with open(path, 'rb') as f:
            # 开启多线程上传
            result = pool.map_async(upload, [{
                'part_number': i['part_number'],
                'upload_url': i['upload_url'],
                'chunk': f.read(split_size)
            } for i in part_info_list])
            # 等待线程通知
            while True:
                data = q.get()
                part_info_list_new.append(data['part_info_list'])
                size = data['size']
                total_time += data['time']
                k += size / file_size
                count_size += size
                sys.stdout.write(
                    f'\r上传中... [{"=" * int(k * 10)}{"*" * int((1 - k) * 10)}] %{math.ceil(k * 1000) / 10}'
                )
                if count_size == file_size:
                    break
        # 上传完成保存文件
        url = 'https://api.aliyundrive.com/v2/file/complete'
        json = {
            "ignoreError": True,
            "drive_id": drive_id,
            "file_id": file_id,
            "upload_id": upload_id,
            "part_info_list": part_info_list_new
        }
        r = requests.post(url, headers=headers, json=json)
        if r.status_code == 200:
            total_time = int(total_time * 100) / 100
            print(
                f'\n上传成功,耗时{int(total_time * 100) / 100}秒,平均速度{int(file_size / 1024 / 1024 / total_time * 100) / 100}MB/s'
            )
        else:
            print('\n上传失败')

def down_file(url, path):
    start_time = time.time()
    down_resp = requests.get(url, stream=True)
    if down_resp.status_code != 200:
        raise '启动下载任务失败。'
    raw_file_name = down_resp.headers.get('Content-Disposition').split("'")[-1]
    file_name = urllib.parse.unquote(raw_file_name, encoding='utf-8')
    downloaded = 0
    total = int(down_resp.headers.get('content-length', 0))
    block_size = 1024  # 1 Kibibyte
    totalsize = round(total / 1024 / 1024, 1)
    with open(os.path.join(path, file_name), 'wb') as down_file:
        print(file_name+':')
        for data in down_resp.iter_content(block_size):
            downloaded += len(data)
            down_file.write(data)
            done = int(50 * downloaded / total)
            downsize = round(downloaded / 1024 / 1024, 1)
            speed = '%6s' % str(
                round(downloaded / 1024 / (time.time() - start_time), 1))
            sys.stdout.write('\r[{}{}]  {}MB/{}MB {}KB/s'.format('#' * done, '_' * (50 - done), downsize, totalsize, speed))
            sys.stdout.flush()
        sys.stdout.write('\n')
    return os.path.join(path, file_name)


def main():
    refresh_token = ''
    access_token = refresh(refresh_token)
    user_info = get_user(access_token)
    drive_id = user_info['default_drive_id']
    if sys.argv[1] == 'u':
        parent_file_id = get_folder_id_by_path(access_token,drive_id,sys.argv[3])
        upload_file(access_token, drive_id,parent_file_id=parent_file_id,path=sys.argv[2])
    elif sys.argv[1] == 'd':
        url = get_download_url_by_path(access_token, drive_id, sys.argv[2])
        down_file(url,sys.argv[3])
    else:
        raise 'WRONG CMD!'

if __name__ == '__main__':
    main()

上传不了了吗?

最近上传文件,一直出错,大家有一样的情况吗?前几天还好的。

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 485, in wrap_socket
cnx.do_handshake()
File "/usr/local/lib/python3.8/dist-packages/OpenSSL/SSL.py", line 1828, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "/usr/local/lib/python3.8/dist-packages/OpenSSL/SSL.py", line 1558, in _raise_ssl_error
raise SysCallError(errno, errorcode.get(errno))
OpenSSL.SSL.SysCallError: (104, 'ECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 376, in _make_request
self._validate_conn(conn)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 996, in validate_conn
conn.connect()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 366, in connect
self.sock = ssl_wrap_socket(
File "/usr/lib/python3/dist-packages/urllib3/util/ssl
.py", line 370, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 491, in wrap_socket
raise ssl.SSLError("bad handshake: %r" % e)
ssl.SSLError: ("bad handshake: SysCallError(104, 'ECONNRESET')",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 719, in urlopen
retries = retries.increment(
File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 436, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='auth.aliyundrive.com', port=443): Max retries exceeded with url: /v2/account/token (Caused by SSLError(SSLError("bad handshake: SysCallError(104, 'ECONNRESET')")))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/aliyunpan/main.py", line 183, in
cli()
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/root/aliyunpan/main.py", line 91, in upload
commander.upload(path_list, upload_path, time_out, retry, force, share, chunk_size, c)
File "/root/aliyunpan/aliyunpan/cli/cli.py", line 241, in upload
result = self._disk.upload_file(
File "/root/aliyunpan/aliyunpan/api/core.py", line 326, in upload_file
r = self.create_file(file_name=file_name, parent_file_id=parent_file_id, file_type=True, json=json,
File "/root/aliyunpan/aliyunpan/api/core.py", line 203, in create_file
"drive_id": self.drive_id,
File "/root/aliyunpan/aliyunpan/api/core.py", line 42, in
drive_id = property(lambda self: (self._lock.acquire(), next(self.drive_id_gen), self._lock.release())[1],
File "/root/aliyunpan/aliyunpan/api/core.py", line 559, in _drive_id_gen
drive_id = self.get_drive_id()
File "/root/aliyunpan/aliyunpan/api/core.py", line 542, in get_drive_id
drive_id = self.get_user_info().drive_id
File "/root/aliyunpan/aliyunpan/api/core.py", line 177, in get_user_info
r = self._req.post(url, json={})
File "/root/aliyunpan/aliyunpan/api/req.py", line 76, in post
return self._req('post', *args, **kwargs)
File "/root/aliyunpan/aliyunpan/api/req.py", line 46, in _req
kwargs['headers']['Authorization'] = self._disk.access_token if self._disk else GLOBAL_VAR.access_token
File "/root/aliyunpan/aliyunpan/api/core.py", line 40, in
access_token = property(lambda self: (self._lock.acquire(), next(self.access_token_gen), self._lock.release())[1],
File "/root/aliyunpan/aliyunpan/api/core.py", line 535, in _access_token_gen
access_token = self.get_access_token()
File "/root/aliyunpan/aliyunpan/api/core.py", line 513, in get_access_token
r = self._req.post(url, json=json, access_token=False)
File "/root/aliyunpan/aliyunpan/api/req.py", line 76, in post
return self._req('post', *args, **kwargs)
File "/root/aliyunpan/aliyunpan/api/req.py", line 47, in _req
r = getattr(self._session, method.lower())(*args, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 581, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='auth.aliyundrive.com', port=443): Max retries exceeded with url: /v2/account/token (Caused by SSLError(SSLError("bad handshake: SysCallError(104, 'ECONNRESET')")))

文件上传失败

文件大小:7G
我在完成文件上传的post那里print了一下r.json()
输出内容:{'code': 'InvalidParameter.ContentHash', 'message': 'The input parameter content_hash is not valid. file content hash is not matched with content_hash in complete file request'}
debug模式日志文件:aliyunpan.zip

上传错误

alpine:/home/aliyun# pip install -r requirements.txt
Ignoring windows-curses: markers 'platform_system == "Windows"' don't match your environment
Requirement already satisfied: treelib==1.6.1 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (1.6.1)
Requirement already satisfied: requests~=2.25.1 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 2)) (2.25.1)
Requirement already satisfied: click_aliases==1.0.1 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 3)) (1.0.1)
Requirement already satisfied: rsa==4.0 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 4)) (4.0)
Requirement already satisfied: click==7.1.1 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 5)) (7.1.1)
Requirement already satisfied: ruamel.base==1.0.0 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 6)) (1.0.0)
Requirement already satisfied: ruamel.yaml in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 7)) (0.17.7)
Requirement already satisfied: colorama~=0.4.3 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 8)) (0.4.4)
Requirement already satisfied: npyscreen==4.10.5 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 9)) (4.10.5)
Requirement already satisfied: pyperclip~=1.8.1 in /usr/lib/python3.9/site-packages (from -r requirements.txt (line 11)) (1.8.2)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python3.9/site-packages (from rsa==4.0->-r requirements.txt (line 4)) (0.4.8)
Requirement already satisfied: future in /usr/lib/python3.9/site-packages (from treelib==1.6.1->-r requirements.txt (line 1)) (0.18.2)
Requirement already satisfied: chardet<5,>=3.0.2 in /usr/lib/python3.9/site-packages (from requests~=2.25.1->-r requirements.txt (line 2)) (4.0.0)
Requirement already satisfied: idna<3.3,>=2.5 in /usr/lib/python3.9/site-packages (from requests~=2.25.1->-r requirements.txt (line 2)) (3.2)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib/python3.9/site-packages (from requests~=2.25.1->-r requirements.txt (line 2)) (1.26.6)
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3.9/site-packages (from requests~=2.25.1->-r requirements.txt (line 2)) (2020.12.5)
Requirement already satisfied: ruamel.yaml.clib>=0.1.2 in /usr/lib/python3.9/site-packages (from ruamel.yaml->-r requirements.txt (line 7)) (0.2.2)
alpine:/home/aliyun# python3 main.py u /unraid/xxx /backup/xxx
Traceback (most recent call last):
File "/home/aliyun/main.py", line 168, in
cli()
File "/usr/lib/python3.9/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/home/aliyun/main.py", line 91, in upload
commander.upload(path_list, upload_path, time_out, retry, force, share, chunk_size, c)
File "/home/aliyun/aliyunpan/cli/cli.py", line 248, in upload
raise FileNotFoundError
FileNotFoundError

alpine:/home/aliyun#

上传过程中出现异常

这两个异常都出现了好几次了

第一个:

Traceback (most recent call last):
  File "D:\Python\b站直播姬webhook\FileUpload.py", line 144, in upload
    if not commander.upload(path=file, upload_path=upload_path,
  File "D:\Python\b站直播姬webhook\aliyunpan\cli\cli.py", line 211, in upload
    result = self._disk.upload_file(
  File "D:\Python\b站直播姬webhook\aliyunpan\api\core.py", line 416, in upload_file
    upload_bar.update(ratio=k, refresh_line=True)
  File "D:\Python\b站直播姬webhook\aliyunpan\common.py", line 314, in update
    self.output = Info(upload_info, refresh_line=refresh_line, color=Fore.LIGHTMAGENTA_EX)
  File "D:\Python\b站直播姬webhook\aliyunpan\common.py", line 193, in <lambda>
    lambda self, value: self._print.output.send(value) if self._output else None)
ValueError: generator already executing

FileUpload.py的upload函数是通过线程来启动的,我查过似乎是多线程的问题

第二个:

Traceback (most recent call last):
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 436, in _error_catcher
    yield
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 766, in read_chunked
    chunk = self._handle_chunk(amt)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 710, in _handle_chunk
    value = self._fp._safe_read(amt)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 612, in _safe_read
    data = self.fp.read(amt)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\socket.py", line 669, in readinto
    return self._sock.recv_into(b)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 1241, in recv_into
    return self.read(nbytes, buffer)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 1099, in read
    return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\models.py", line 753, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 571, in stream
    for line in self.read_chunked(amt, decode_content=decode_content):
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 792, in read_chunked
    self._original_response.close()
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\response.py", line 441, in _error_catcher
    raise ReadTimeoutError(self._pool, None, "Read timed out.")
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='api.aliyundrive.com', port=443): Read timed out.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Python\b站直播姬webhook\FileUpload.py", line 144, in upload
    if not commander.upload(path=file, upload_path=upload_path,
  File "D:\Python\b站直播姬webhook\aliyunpan\cli\cli.py", line 211, in upload
    result = self._disk.upload_file(
  File "D:\Python\b站直播姬webhook\aliyunpan\api\core.py", line 309, in upload_file
    r = self.create_file(file_name=file_name, parent_file_id=parent_file_id, file_type=True, json=json,
  File "D:\Python\b站直播姬webhook\aliyunpan\api\core.py", line 214, in create_file
    r = self._req.post(url, json=j)
  File "D:\Python\b站直播姬webhook\aliyunpan\api\req.py", line 76, in post
    return self._req('post', *args, **kwargs)
  File "D:\Python\b站直播姬webhook\aliyunpan\api\req.py", line 47, in _req
    r = getattr(self._session, method.lower())(*args, **kwargs)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 590, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 697, in send
    r.content
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\models.py", line 831, in content
    self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\models.py", line 760, in generate
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.aliyundrive.com', port=443): Read timed out.

这个希望能够给函数create_file的request加重试

关于安装与登录的建议

1、安装
能否把程序提交到python的官方程序库,使用
pip install aliyunpan
这样的命令安装,同时安装的时候处理好依赖库,让安装更加简单。
2、登录
使用命令tokenlogin 用token登录;
示例:
python main.py tokenlogin 'tokenidxxxxxxxxxxxxxxxxxxxxxxxxxxx'

使用命令login 用户名和密码登录;
python main.py login username password

感谢大神,支持大神。。。。。。期待大神。。

【关于登录的问题】如何登录?

您好,今天(20211004)我使用pip命令安装好后,使用命令行登录(手机号是用来说明的,不是真的):

aliyunpan-cli -u 15601445229

结果提示:

Usage: aliyunpan-cli [OPTIONS] COMMAND [ARGS]...
Error: Missing command.

但COMMAND里我没有找到和登录相关的,请问该如何登录?

操作系统:win10
python版本:3.7.1

阿里云ecs用宝塔面板安装,上传文件失败

下载的最新版本 aliyunpan-cli-v2.7.10-04864c0 上传到宝塔面板

终端执行上传文件命令提示这个错误:(~/.config/aliyunpan.yaml 文件token是对的)

./aliyunpan-cli u local.tar.gz /
[27046] Error loading Python lib '/tmp/_MEI7aRoE7/libpython3.9.so.1.0': dlopen: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by /tmp/_MEI7aRoE7/libpython3.9.so.1.0)

另外一个国外服务器可以正常上传,这个程序是要使用国外服务器网络才可以用的吗

refreshtoken失效

已经用过一段时间了没问题,从昨天开始token失效,可能是阿里云盘调整了策略?

Traceback (most recent call last):
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 422, in get_access_token
access_token = r.json()['access_token']
KeyError: 'access_token'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/opt/code/aliyunpan/main.py", line 152, in
cli()
File "/usr/local/lib/python3.6/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.6/site-packages/click/core.py", line 610, in invoke
return callback(args, **kwargs)
File "/opt/code/aliyunpan/main.py", line 87, in upload
commander.upload(path_list, upload_path, time_out, retry, force, share, chunk_size, c)
File "/opt/code/aliyunpan/aliyunpan/cli/cli.py", line 181, in upload
return self.upload_share(share_list, upload_path, force)
File "/opt/code/aliyunpan/aliyunpan/cli/cli.py", line 263, in upload_share
file_id_list = self.mkdir(upload_path / path)
File "/opt/code/aliyunpan/aliyunpan/cli/cli.py", line 128, in mkdir
file_id = self._path_list.get_path_fid(path, update=False)
File "/opt/code/aliyunpan/aliyunpan/api/models.py", line 96, in get_path_fid
self.auto_update_path_list(update, file_id)
File "/opt/code/aliyunpan/aliyunpan/api/models.py", line 125, in auto_update_path_list
return self.update_path_list(file_id, depth=0)
File "/opt/code/aliyunpan/aliyunpan/api/models.py", line 23, in update_path_list
file_list = self._disk.get_file_list(file_id)
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 81, in get_file_list
json = {"drive_id": self.drive_id, "parent_file_id": parent_file_id, 'fields': '
', 'marker': next_marker}
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 34, in
drive_id = property(lambda self: next(self.drive_id_gen),
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 466, in _drive_id_gen
drive_id = self.get_drive_id()
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 449, in get_drive_id
drive_id = self.get_user_info().drive_id
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 157, in get_user_info
r = self._req.post(url, json={})
File "/opt/code/aliyunpan/aliyunpan/api/req.py", line 47, in post
return self._req('post', *args, **kwargs)
File "/opt/code/aliyunpan/aliyunpan/api/req.py", line 37, in _req
kwargs['headers']['Authorization'] = self.disk.access_token if self.disk else GLOBAL_VAR.access_token
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 32, in
access_token = property(lambda self: next(self.access_token_gen),
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 442, in _access_token_gen
access_token = self.get_access_token()
File "/opt/code/aliyunpan/aliyunpan/api/core.py", line 424, in get_access_token
raise InvalidRefreshToken
aliyunpan.exceptions.InvalidRefreshToken: Is not a valid refresh_token.

ModuleNotFoundError: No module named 'ruamel.yaml'

(base) ➜  aliyunpan git:(main) ✗ python main.py -h
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    from aliyunpan.cli.cli import Commander
  File "/Users/tongjun/workspace/aliyunpan/aliyunpan/cli/__init__.py", line 1, in <module>
    from aliyunpan.cli.cli import Commander
  File "/Users/tongjun/workspace/aliyunpan/aliyunpan/cli/cli.py", line 7, in <module>
    from aliyunpan.cli.config import Config
  File "/Users/tongjun/workspace/aliyunpan/aliyunpan/cli/config.py", line 2, in <module>
    from ruamel.yaml import YAML
ModuleNotFoundError: No module named 'ruamel.yaml'
(base) ➜  aliyunpan git:(main) ✗ pip install ruamel_yaml
Requirement already satisfied: ruamel_yaml in /Users/tongjun/anaconda3/lib/python3.7/site-packages (0.15.46)
WARNING: You are using pip version 21.0.1; however, version 21.1.2 is available.
You should consider upgrading via the '/Users/tongjun/anaconda3/bin/python -m pip install --upgrade pip' command.
(base) ➜  aliyunpan git:(main) ✗ python --version
Python 3.7.4

调用多次ls枚举目录后开始抛异常

我是通过from aliyunpan.cli.cli import Commander来初始化并调用文件操作函数
我刚开始的几次ls的调用时没问题的,但是几次之后就开始一直报错,我尝试调试了下也不知道问题在哪(其实是看不懂)
报错如图
image
日志里面混进去了一些我打的log:日志.zip
我写的上传相关的代码FileUpload.py,其中upload方法是通过启动线程调用的
FileUpload.zip
部分改过的地方
image
image
image

针对Linux x86_64 兼容性有问

你好!

本项目之前在开发期间为了方便使用,我也将其编译成单文件二进制程序。今天原本想更新源码重新编译二进制文件,发现 releases 目前已经提供三大平台的可执行文件。

但是我发现一个问题,Releases 上的 linux 86_64 平台的是基于glibc较高版本的Python编译出来的,它无法在比构建平台低版本的glibc环境下运行(如 CentOS 7 x86_64),这无疑大范围降低了程序的兼容性,CentOS 7 目前在云计算平台依然具备不可替代的位置,使用频率还是很高的。

请问作者可否在构建 Linux x86_64 平台的程序时,使用glibc 版本更低的系统来构建呢?因为glibc 具备向下兼容的特性,高版本也同样允许运行低版本构建的程序。

这里是我自己编译的二进制程序,经测试,Ubuntu 20、CentOS 7 & 8、Debian 10 等系统均可正常工作。

https://media.cooluc.com/source/aliyunDrive-cli

账号和密码登陆失败

错误日志

Traceback (most recent call last):
  File "main.py", line 125, in <module>
    cli()
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1256, in invoke
    Command.invoke(self, ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "main.py", line 24, in cli
    commander.init(config_file=config_file, depth=depth)
  File "/root/backup/aliyunpan/aliyunpan/cli/cli.py", line 57, in init
    raise LoginFailed
aliyunpan.exceptions.LoginFailed

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.