Git Product home page Git Product logo

aligo's Introduction

aligo

🚀🔥 简单、易用、可扩展的 阿里云盘 API 接口库 👍👍

wiki 文档 + examples

文档写得很简单,详情请查看 代码提示 + 文档注释

有任何疑问 请 issue 或 加入 aligo交流反馈群 (群二维码在底部)

附带一份文档 阿里云盘开放平台文档

安装

python version Downloads

pip install -U aligo
pip install git+https://github.com/foyoux/aligo.git

Notes: 最近官方更新了接口,导致 get_file_list 无法直接获取下载链接,现在需要单独使用 get_download_url 接口获取下载链接。

对于不常用(没有封装)的接口,可以直接通过 self.post 方法直接发送请求。

接口变动较多,有问题请反馈,我会尽快修复。

快速入门

"""快速入门"""
from aligo import Aligo

if __name__ == '__main__':
    ali = Aligo()  # 第一次使用,会弹出二维码,供扫描登录

    user = ali.get_user()  # 获取用户信息
    print(user.user_name, user.nick_name, user.phone)  # 打印用户信息

    file_list = ali.get_file_list()  # 获取网盘根目录文件列表
    for file in file_list:  # 遍历文件列表
        # 注意:print(file) 默认只显示部分信息,但是实际上file有很多的属性
        print(file.file_id, file.name, file.type)  # 打印文件信息
aligo.mp4

基本功能

  • 完全的代码提示
  • 持久化登录、多帐户登录
  • 福利码兑换
  • 文件夹同步
  • 在线解压缩
  • 支持功能扩展
  • 搜索文件/标签
  • 获取重复文件列表
  • 文件(夹)重命名
  • 文件(夹)上传下载
  • 文件(夹)移动复制
  • 文件(夹)删除恢复
  • 获取文档在线预览接口
  • 文件(夹)分享 保存 收藏
  • 文件(夹)自定义分享(无限制)
  • 获取帐户、云盘(容量)等基本信息
  • 相册 创建 删除 修改 添加文件 获取文件

Notes:

  1. 由于秒传链接的失效,自定分享信息的有效期只有4个小时。
  2. 阿里云盘不同于其他网盘或系统,其定位文件不是基于文件名(路径),而是通过 file_id,这才是唯一定位文件的方式,aligo 中提供了简便函数 get_file_by_path/get_folder_by_path,通过网盘路径获取文件对象,通过 其上的 file_id 属性即可获取所需文件标识。但不建议频繁使用此方法,因为内部是通过 get_file_list 遍历得到的。
  3. 在保存超大分享时(分享中的文件特别多),执行保存全部的方法 - share_file_save_all_to_drive,它会立刻执行完毕,但是文件不会立刻被保存到网盘中,阿里云盘服务器会帮你在后台陆续将所有文件存到你的网盘中;所有当你使用 share_file_save_all_to_drive 保存超大分享时,却只看到一部分文件时,不用疑惑,这是正常情况。

登录

  1. 网页扫码登录

    from aligo import Aligo
    
    # 提供 port 参数即可, 之后打开浏览器访问 http://<YOUR_IP>:<port>
    ali = Aligo(port=8080)
  2. 发送登录二维码到邮箱(推荐)

    最佳实践:建议将邮箱绑定到微信,这样能实时收到提醒,登录过期后也可以第一时间收到登录请求。

    from aligo import Aligo, EMailConfig
    
    if __name__ == '__main__':
        email_config = EMailConfig(
            email='<接收登录邮件的邮箱地址>',
            # 自配邮箱
            user='',
            password='',
            host='',
            port=0,
        )
        ali = Aligo(email=email_config)

如何操作资源盘

from aligo import Aligo

if __name__ == '__main__':
    ali = Aligo()
    
    drives = ali.list_my_drives()
    # resource_drive_id = [drive.drive_id for drive in drives if drive.drive_name == 'resource'][0]
    
    v2_user = ali.v2_user_get()
    resource_drive_id = v2_user.resource_drive_id
    
    # 如果后续默认操作资源盘
    # ali.default_drive_id = resource_drive_id
    
    file_list = ali.get_file_list(drive_id=resource_drive_id)
    for file in file_list:
        print(file)

如何自定义配置文件路径

from aligo import set_config_folder, Aligo

if __name__ == '__main__':
    # 创建 Aligo 对象前,先设置配置文件目录,默认是 <用户目录>/.aligo
    set_config_folder('/home/aligo')
    # 会创建 /home/aligo/小号1.json 配置文件
    ali1 = Aligo(name='小号1')
    # 会创建 /home/aligo/小号2.json 配置文件
    ali2 = Aligo(name='小号2')

关于扩展功能

一般步骤:

1. 使用浏览器或其他抓包工具,观察通信过程;
2. 获取 url/path + 请求体;
3. 继承 `Aligo`, 使用现有的方法 `self._post` 等,进行发送请求;

会自动维护 token, 你只需关注如何发送请求即可

扩展功能举栗🌰 - 配有视频和代码

如何彻底删除文件?

无需先移动文件到回收站

此功能太危险,aligo 未直接提供。不过 这里 扩展了该功能,请小心使用!

声明

此项目仅供学习交流,若有不妥之处,侵联必删。


❤️‍🔥欢迎加入🤝🏼

aligo反馈交流群
😃 添加时,请附上留言消息 “aligo” 😜

本来是群二维码,但是加进来发广告的太多了,所以改成了个人二维码。

aligo's People

Contributors

5high avatar blabra avatar chill-lee avatar jimu5 avatar lemisky avatar qinpan1003 avatar thesoul20 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

aligo's Issues

usedforsecurity不兼容python3.8

操作系统信息

ubuntu 20.04 LTS python v3.8

错误描述

    up_file = ali.upload_file(filePath, folder.file_id, fileName)
27
  File "/home/runner/.local/lib/python3.8/site-packages/aligo/core/Create.py", line 229, in upload_file
28
    part_info = self._pre_hash(file_path=file_path, file_size=file_size, name=name,
29
  File "/home/runner/.local/lib/python3.8/site-packages/aligo/core/Create.py", line 69, in _pre_hash
30
    pre_hash = hashlib.sha1(f.read(1024), usedforsecurity=False).hexdigest()
31
TypeError: openssl_sha1() takes at most 1 argument (2 given)
32
Error: Process completed with exit code 1.

试过把aligo 降级到v4.6.5是没问题的,v4.6.6更新了, 不兼容python3.8

pyw不能工作

操作系统信息

Win7

错误描述

以下内容以py后缀保存并运行,可以正常同步目录,但是如果以pyw保存则不行。需要添加类似Patch里的代码重定向输出才能工作,问题应该出在logging相关部分。

Patch 示意
        if sys.executable.endswith('pythonw.exe'):
            logger.warning('using pythonw.exe, redirect stdout to %s, stderr to %s', stdoutlog, stderrlog)
            sys.stdout = open(stdoutlog, 'w')
            sys.stderr = open(stderrlog, 'w')
文件内容

import sys, logging
from aligo import Aligo

def aligo_test():
local_folder2 = 'c:/Users/FZU/Desktop/c'
# 云盘下的c目录,需要自己改成本人云上的某目录
remote_folder_id = '622a6ffa09e4472cdf821198933437567fcab4cb'
ali = Aligo(level = logging.DEBUG)
ali.sync_folder(local_folder2, remote_folder_id)

def main():
aligo_test()
return 0

if name == 'main':
sys.exit(main())

同步功能建议

新功能请求

同步功能建议,能否增加只对比文件名选项,需要同步的文件都是很大且不会修改的文件,但是每次执行都要重新计算sha1,导致同步很慢,或可以缓存当前文件状态,无变化则跳过计算,希望采纳!

install

新功能请求

aligo根目录没有EXE也没有py文件,有没有办法在CMD中启动?

v2.1.2版本 循环导入包的问题

错误描述
v2.1.2 版本存在循环导入包的问题

>>> from aligo import Aligo
....
ImportError: cannot import name 'BaseFile' from partially initialized module 'aligo.types.BaseFile' (most likely due to a circular import)

一些建议

1.建议将 download_file download_files download_folder
upload_file upload_files upload_folder
合并为downloadupload
同时允许直接传递获取的文件/文件夹对象或文件路径
2.建议后台增加一个字典形式的网盘文件目录缓存来减轻压力(可能会比直接遍历快一点?)

无效下载链接或链接已过期 {resp.url}

操作系统信息

The outout of uname -a:

Linux Matrix.xyz 5.15.0-35-generic #36-Ubuntu SMP Sat May 21 02:24:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

错误描述

无法直接下载分享文件,即使转存之后也不行。
Traceback:

Traceback (most recent call last):
  File "/home/jing/Documents/Code/Shell/scripts/aliyun-share", line 77, in <module>
    ali.download_file(download_path, download_url)
  File "/home/jing/.local/lib/python3.10/site-packages/aligo/apis/Download.py", line 160, in download_file
    return self._core_download_file(file_path, url)
  File "/home/jing/.local/lib/python3.10/site-packages/aligo/core/Download.py", line 96, in _core_download_file
    raise ValueError(f'无效下载链接或链接已过期 {resp.url}')


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/jing/Documents/Code/Shell/scripts/aliyun-share", line 85, in <module>
    ali.download_file(file_id=file_id, local_folder="/tmp")
  File "/home/jing/.local/lib/python3.10/site-packages/aligo/apis/Download.py", line 160, in download_file
    return self._core_download_file(file_path, url)
  File "/home/jing/.local/lib/python3.10/site-packages/aligo/core/Download.py", line 96, in _core_download_file
    raise ValueError(f'无效下载链接或链接已过期 {resp.url}')

我的代码片段如下:

download_url = ali.get_share_link_download_url(
    share_id=share_id, share_token=share_token,
    file_id=file_id).download_url
if download_path == '':
    download_path = '/tmp/' + ali.get_share_file(
        share_id=share_id,
        share_token=share_token.share_token,
        file_id=file_id).name
try:
    ali.download_file(download_path, download_url)
except ValueError:
    file_id = ali.share_file_saveto_drive(
        share_id=share_id,
        share_token=share_token,
        file_id=file_id).file_id
    try:
        ali.download_file(file_id=file_id, local_folder="/tmp")
    finally:
        ali.move_file_to_trash(file_id=file_id)

readme二维码失效

操作系统信息

None

错误描述

image
readme这个二维码假更新吧qaq
现在是2022-9-26 18:32:48就已经进不去 显示失效
不过楼主手动更的话确实麻烦 搞个微信机器人自动更

拉取阿里云盘相册

新功能请求

阿里云盘相册在执行 ali.get_file_list()无法获取。是不是可以加上相册的功能

下载文件夹时有发生错误

操作系统信息

debian 11

python 3.9.2

依赖包版本

Package           Version
----------------- --------------
aligo             2.1.1
arrow             1.2.2
certifi           2020.6.20
chardet           4.0.0
coloredlogs       15.0.1
httplib2          0.18.1
humanfriendly     10.0
idna              2.10
Pillow            9.0.1
pip               20.3.4
pycurl            7.43.0.6
PySimpleSOAP      1.16.2
python-apt        2.2.1
python-dateutil   2.8.2
python-debian     0.1.39
python-debianbts  3.1.0
PyYAML            6.0
qrcode            7.3.1
qrcode-terminal   0.8
reportbug         7.10.3+deb11u1
requests          2.25.1
setuptools        52.0.0
six               1.16.0
tqdm              4.62.3
typing-extensions 4.1.1
urllib3           1.26.5
wheel             0.34.2

错误描述

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/aligo/core/Download.py", line 123, in download_files
    file_path = self._core_download_file(file_path, file.download_url)
  File "/usr/local/lib/python3.9/dist-packages/aligo/core/Download.py", line 86, in _core_download_file
    with requests.get(url, headers={
  File "/usr/lib/python3/dist-packages/requests/api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 528, in request
    prep = self.prepare_request(req)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 456, in prepare_request
    p.prepare(
  File "/usr/lib/python3/dist-packages/requests/models.py", line 316, in prepare
    self.prepare_url(url, params)
  File "/usr/lib/python3/dist-packages/requests/models.py", line 390, in prepare_url
    raise MissingSchema(error)
requests.exceptions.MissingSchema: Invalid URL 'None': No schema supplied. Perhaps you meant http://None?

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/dist-packages/aligo/apis/Download.py", line 84, in download_folder
    return self.__download_folder(folder_file_id, local_folder, drive_id)
  File "/usr/local/lib/python3.9/dist-packages/aligo/apis/Download.py", line 93, in __download_folder
    self.__download_folder(folder_file_id=file.file_id,
  File "/usr/local/lib/python3.9/dist-packages/aligo/apis/Download.py", line 93, in __download_folder
    self.__download_folder(folder_file_id=file.file_id,
  File "/usr/local/lib/python3.9/dist-packages/aligo/apis/Download.py", line 93, in __download_folder
    self.__download_folder(folder_file_id=file.file_id,
  File "/usr/local/lib/python3.9/dist-packages/aligo/apis/Download.py", line 97, in __download_folder
    self.download_files(files, local_folder=local_folder)
  File "/usr/local/lib/python3.9/dist-packages/aligo/core/Download.py", line 126, in download_files
    file_path = self._core_download_file(file_path, file.download_url)
  File "/usr/local/lib/python3.9/dist-packages/aligo/core/Download.py", line 86, in _core_download_file
    with requests.get(url, headers={
  File "/usr/lib/python3/dist-packages/requests/api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 528, in request
    prep = self.prepare_request(req)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 456, in prepare_request
    p.prepare(
  File "/usr/lib/python3/dist-packages/requests/models.py", line 316, in prepare
    self.prepare_url(url, params)
  File "/usr/lib/python3/dist-packages/requests/models.py", line 390, in prepare_url
    raise MissingSchema(error)
requests.exceptions.MissingSchema: Invalid URL 'None': No schema supplied. Perhaps you meant http://None?

pycharm出来的二维码,使用云盘扫描不成功

pycharm出来的二维码,使用云盘扫描不成功
参考代码是入门版的:
from aligo import Aligo

ali = Aligo()

获取用户信息

user = ali.get_user()

获取网盘根目录文件列表

ll = ali.get_file_list()
print(ll)

使用 pip 以及 pipenv 安装aligo失败,Python == 3.6.7

操作系统信息
Ubuntu 20.04
Python版本为 3.6.7
pip版本 21.3.1
pipenv版本 2022.1.8

错误描述
在使用pipenv以及pip安装aligo时会出现 Could not find a version 的错误。

> pip install aligo
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Could not find a version that satisfies the requirement aligo (from versions: none)
ERROR: No matching distribution found for aligo

但是在 https://pypi.tuna.tsinghua.edu.cn/simple/ 网站上能够检索到aligo库。
同时,当使用pipenv 进行安装的时候也会出现同样的错误:

> pipenv install aligo --skip-lock
Installing aligo...
Error:  An error occurred while installing aligo!
Error text: Looking in indexes: https://mirrors.aliyun.com/pypi/simple/

ERROR: Could not find a version that satisfies the requirement aligo (from versions: none)
ERROR: No matching distribution found for aligo

✘ Installation Failed 

同样的,也能够在https://mirrors.aliyun.com/pypi/simple/上检索到aligo的信息。
这该如何解决呢?

token 获取使用手机版获取

新功能请求

目前版本使用的token为pc版本的token,获取下载链接下载时,需要带上 "Referer": "https://www.aliyundrive.com/" 的header,发现使用手机版本的token不需要,建议使用手机版登陆的token来获取下载链接。

支持各大协议妙传链接

aligo协议base64方式过于难用,不方便分享给不会运行代码的人,可考虑更简便方式。兼容115,aliyundrive,小白羊等方式进行导入导出秒传链接

「TypeError: __init__() got an unexpected keyword argument 'domain_id'」错误

情况描述:

  1. 之前已成功登录过1次,登录信息已被保存至 aligo.json,且登录后所有功能都可正常调用。
  2. 上次成功登录1天后,重新打开 Python,重新使用 ali = Aligo() 创建对象,并尝试调用上传文件接口,出现「TypeError: init() got an unexpected keyword argument 'domain_id'」错误,无法上传。
  3. 上述问题怀疑是登录态没有自动更新导致,遂删除「aligo.json」文件,然后重新使用 auth = Auth() 创建对象,打算重新扫描二维码、重新登录。
  4. 在重新扫描二维码登录后,又出现「TypeError: init() got an unexpected keyword argument 'domain_id'」错误,而 auth 对象并未成功创建,无法使用任何功能。

附:重新扫描二维码登录后,打印出来的 Log 如下

23:37:22.128 INFO 等待扫描二维码 ...
23:37:22.129 INFO 已扫描, 等待确认 ...
23:37:24.270 INFO 等待扫描二维码 ...
23:37:24.270 INFO 已确认 (你可以关闭二维码图像了.)
Traceback (most recent call last):
File "", line 1, in
File "/home/han/miniconda3/lib/python3.8/site-packages/aligo/core/Auth.py", line 154, in init
self._login()
File "/home/han/miniconda3/lib/python3.8/site-packages/aligo/core/Auth.py", line 200, in _login
self.token = Token(**response.json())
TypeError: init() got an unexpected keyword argument 'domain_id'

跪请大佬协助解决问题!

扩展功能举栗🌰 - 配有视频和代码

获取推荐的订阅用户

简单实现
"""获取订阅页面推荐用户列表"""
from aligo import Aligo


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self):
        """获取订阅页面推荐用户列表"""
        return self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': 20,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        }).json()['items']


if __name__ == '__main__':
    cali = CustomAligo()
    ll = cali.user_recommend()
    print(ll)
2022-05-14.15-46-37.mp4
优化一下
"""获取订阅页面推荐用户列表"""
from dataclasses import dataclass
from typing import List

from aligo import Aligo


@dataclass
class FollowUser:
    """订阅用户"""
    description: str = None
    avatar: str = None
    user_id: str = None
    nick_name: str = None
    phone: str = None
    is_following: bool = None


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self) -> List[FollowUser]:
        """获取订阅页面推荐用户列表"""
        items = self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': 20,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        }).json()['items']
        return [FollowUser(**item) for item in items]


if __name__ == '__main__':
    cali = CustomAligo()
    ll = cali.user_recommend()
    for f in ll:
        print(f.user_id, f.nick_name, f.is_following)
222.mp4
完善一下
"""获取订阅页面推荐用户列表"""
from dataclasses import dataclass
from typing import List

from aligo import Aligo


@dataclass
class FollowUser:
    """订阅用户"""
    description: str = None
    avatar: str = None
    user_id: str = None
    nick_name: str = None
    phone: str = None
    is_following: bool = None


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self, limit: int = 20) -> List[FollowUser]:
        """获取订阅页面推荐用户列表"""
        resp = self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': limit if limit <= 100 else 100,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        })
        items = resp.json()['items']
        return [FollowUser(**item) for item in items]


if __name__ == '__main__':
    cali = CustomAligo()
    ll = cali.user_recommend()
    for f in ll:
        print(f.user_id, f.nick_name, f.is_following)
333.mp4

订阅用户

订阅用户
"""
1. 获取订阅页面推荐用户列表
2. 订阅用户
"""
from dataclasses import dataclass
from typing import List

from aligo import Aligo


@dataclass
class FollowUser:
    """订阅用户"""
    description: str = None
    avatar: str = None
    user_id: str = None
    nick_name: str = None
    phone: str = None
    is_following: bool = None


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self, limit: int = 20) -> List[FollowUser]:
        """获取订阅页面推荐用户列表"""
        resp = self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': limit if limit <= 100 else 100,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        })
        items = resp.json()['items']
        return [FollowUser(**item) for item in items]

    def follow_user(self, user_id: str) -> bool:
        """订阅用户"""
        resp = self._post('/adrive/v1/member/follow_user', body={
            'user_id': user_id
        })
        return resp.status_code == 200


if __name__ == '__main__':
    cali = CustomAligo()
    # 订阅 3 个用户
    users = cali.user_recommend(3)
    for user in users:
        if not user.is_following:
            result = cali.follow_user(user.user_id)
            print(result)
    # 想起来了,aligo 用的是另一个账户
444_1.mp4
444_2.mp4

取消订阅

取消订阅
"""
1. 获取订阅页面推荐用户列表
2. 订阅用户
3. 取消订阅用户
"""
from dataclasses import dataclass
from typing import List

from aligo import Aligo


@dataclass
class FollowUser:
    """订阅用户"""
    description: str = None
    avatar: str = None
    user_id: str = None
    nick_name: str = None
    phone: str = None
    is_following: bool = None


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self, limit: int = 20) -> List[FollowUser]:
        """获取订阅页面推荐用户列表"""
        resp = self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': limit if limit <= 100 else 100,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        })
        items = resp.json()['items']
        return [FollowUser(**item) for item in items]

    def follow_user(self, user_id: str) -> bool:
        """订阅用户"""
        resp = self._post('/adrive/v1/member/follow_user', body={
            'user_id': user_id
        })
        return resp.status_code == 200

    def unfollow_user(self, user_id: str) -> bool:
        """取消订阅用户"""
        resp = self._post('/adrive/v1/member/unfollow_user', body={
            'user_id': user_id
        })
        return resp.status_code == 200


if __name__ == '__main__':
    cali = CustomAligo()
    # 订阅 3 个用户
    users = cali.user_recommend(3)
    for user in users:
        if not user.is_following:
            result = cali.follow_user(user.user_id)
            print(result)
555.mp4

获取订阅用户列表

获取订阅用户列表
"""
1. 获取订阅页面推荐用户列表
2. 订阅用户
3. 取消订阅用户
4. 获取订阅用户列表
"""
from dataclasses import dataclass, field
from typing import List

from aligo import Aligo


@dataclass
class FollowUser:
    """订阅用户"""
    description: str = None
    avatar: str = None
    user_id: str = None
    nick_name: str = None
    phone: str = None
    is_following: bool = None
    has_unread_message: bool = None
    latest_messages: List[dict] = field(default_factory=list)


class CustomAligo(Aligo):
    """自定义Aligo类"""

    def user_recommend(self, limit: int = 20) -> List[FollowUser]:
        """获取订阅页面推荐用户列表"""
        resp = self._post('/adrive/v1/timeline/user/recommend', body={
            'limit': limit if limit <= 100 else 100,
            'order_by': "updated_at",
            'order_direction': "DESC",
            'user_id': self.user_id,  # 自己的user_id
        })
        items = resp.json()['items']
        return [FollowUser(**item) for item in items]

    def follow_user(self, user_id: str) -> bool:
        """订阅用户"""
        resp = self._post('/adrive/v1/member/follow_user', body={
            'user_id': user_id
        })
        return resp.status_code == 200

    def unfollow_user(self, user_id: str) -> bool:
        """取消订阅用户"""
        resp = self._post('/adrive/v1/member/unfollow_user', body={
            'user_id': user_id
        })
        return resp.status_code == 200

    def list_following(self, limit: int = 20) -> List[FollowUser]:
        """获取订阅用户列表"""
        resp = self._post('/adrive/v1/member/list_following', body={
            "limit": limit, "order_by": "updated_at", "order_direction": "DESC"
        })
        items = resp.json()['items']
        return [FollowUser(**item) for item in items]


if __name__ == '__main__':
    cali = CustomAligo()
    users = cali.list_following()
    for user in users:
        print(user)
666_1.mp4
666_2.mp4

web 浏览器在线视频

新功能请求

能让他在web 浏览器中以url形式在线播放视频吗,但是不要占用服务流量,要的不是转发而是给一个文件的绝对地址

sync_folder的参数file_filter,说明和实际不符

错误描述

sync_folder的参数file_filter,说明中写的“文件过滤函数,参数为 文件绝对路径,返回值为 True 则过滤,可用于实现 只同步 特定文件 或 排除某些文件”。
事实上,参数为文件名。

get_file_list 分页和排序

新功能请求
因为get_file_list 获取大数据时实在是太慢了
不知道能否加个类似于分类,排序的功能

好像只能秒传了,之前没这问题

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 169, in _new_conn
conn = connection.create_connection(
File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 382, in _make_request
self._validate_conn(conn)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 1012, in _validate_conn
conn.connect()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 353, in connect
conn = self._new_conn()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 181, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7fc314b64b80>: Failed to establish a new connection: [Errno 110] Connection timed out

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 755, in urlopen
retries = retries.increment(
File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.aliyundrive.com', port=443): Max retries exceeded with url: /adrive/v3/file/list (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fc314b64b80>: Failed to establish a new connection: [Errno 110] Connection timed out'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/upload.py", line 6, in
remote_folder = ali.get_folder_by_path('download')
File "/usr/local/lib/python3.9/dist-packages/aligo/apis/File.py", line 158, in get_folder_by_path
folders = self.get_file_list(parent_file_id=parent_file_id, drive_id=drive_id, type='folder')
File "/usr/local/lib/python3.9/dist-packages/aligo/apis/File.py", line 97, in get_file_list
return list(result)
File "/usr/local/lib/python3.9/dist-packages/aligo/core/File.py", line 16, in _core_get_file_list
yield from self._list_file(ADRIVE_V3_FILE_LIST, body, GetFileListResponse)
File "/usr/local/lib/python3.9/dist-packages/aligo/core/BaseAligo.py", line 161, in _list_file
response = self._post(PATH, body=body)
File "/usr/local/lib/python3.9/dist-packages/aligo/core/BaseAligo.py", line 93, in _post
return self._auth.post(path=path, host=host, body=body, ignore_auth=ignore_auth)
File "/usr/local/lib/python3.9/dist-packages/aligo/core/Auth.py", line 350, in post
return self.request(method='POST', url=host + path, params=params,
File "/usr/local/lib/python3.9/dist-packages/aligo/core/Auth.py", line 300, in request
response = self.session.request(
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.aliyundrive.com', port=443): Max retries exceeded with url: /adrive/v3/file/list (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fc314b64b80>: Failed to establish a new connection: [Errno 110] Connection timed out'))

download

新功能请求

@lemisky 老师好,在你的帮助下,我已经成功登陆网盘,列出了文件目录。但是要从网盘中某个文件夹,找到一个文件,将其下载到本地指定目录,这个我看了源码注释还是不会。麻烦你再录一个视频,或者给代码和注释也可以。还有群号过期了,我想加。

有些文件有时候会403

错误描述
当我使用file.download_url字段去用postman下载时会403但有时候又可以成功,作者有遇到类似的情况吗
。。。

BUG: Package requests share_token not converted to str

操作系统信息
Linux localhost 5.10.107-android13-4-00004-gf0fe4f768061-ab8935229 on Termux

错误描述
With python 11, share_token in the POST header is not converted to type str and thus cause a type error.

添加一个快捷加密

有时候阿里云盘会吃文件,建议加一个加密模式,仍然能正常操作,但是最终上传的时候只会上传一个加密的压缩文件,所有的文件和文件夹操作都是在这个压缩包中进行的,当然还可以试着再做个快速迁移,把整个云盘里的东西都搬到压缩包里(然后删除原文件?),如果能指定压缩包格式的话更好,谢谢了

启动错误-卡在加载配置文件

操作系统信息
linux环境和windows环境都已测试
linux测试环境:Debian
windows测试环境:win10

错误描述
错误描述
一直卡在以上页面,删除配置文件后重启,问题仍然存在

POST timeout setting

新功能请求

你好,我目前的网络状态不是很好。请问我有没有办法延长每一个 POST 的 timeout 呢?这样的话,即使网络断开几秒种也可以继续。

无法同步文件夹,一直显示被限制

操作系统信息

windows11

错误描述

我刚开始用 aligo,一开始用最前面的例子试了下,是正常的。紧接着用同步功能,就出错了,如下:
image

请问该如何解决?难道是同步功能目前被官方禁了?

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.