Package: lanzou
- 蓝奏云API -简介本库封装了对蓝奏云的基本操作: 登录、列出文件、下载文件、上传文件、删除文件(夹)、
清空回收站、恢复文件、创建文件夹、设置文件(夹)访问密码此外，还解决了蓝奏云的上传格式限制和单文件最大 100MB 的限制，同时增加了批量上传/下载的功能。如果有任何问题或建议，欢迎提 issue。最后，求一个 star (≧∇≦)ﾉv2.2.1更新说明API 发布到 PyPI ，直接使用pip install lanzou-api即可安装依赖v2.2更新说明修复了文件和文件夹 id 冲突的问题(导致部分 API 接口参数变化)修复了蓝奏云网页变化导致文件(夹)无法下载的问题#4修复了上传 rar 分卷文件被 ban 的问题修复了无后缀文件上传出错的问题修复了文件中空白字符导致上传和解压失败的问题修复偶尔出现的 SSL 握手错误v2.1更新说明修复了蓝奏云分享链接格式变化导致无法获取直链的问题v2.0更新说明修复了登录时formhash错误的问题解决了多次上传大文件被限制的问题#3细化 API 接口的功能，某些接口被取消、更名操作网盘时会进行检查，屏蔽蓝奏云不合理的设计支持批量上传/下载上传大文件不再直接将数据分段，改用 RAR 分卷压缩#2取消使用种子文件下载大文件，自动识别分卷压缩文件并解压上传/下载时支持使用回调函数显示进度#1不再向上抛异常，而是返回错误码注册蓝奏云蓝奏云注册安装依赖pip install lanzou-api设置压缩工具为了绕过蓝奏云对上传大文件的限制，本程序使用 RAR 分卷压缩的方式将大文件拆分成 100MB 的小块。所以，安装依赖后还需要下载解压工具:Windows 平台下载项目文件中的/tools/rar.exe作为解压工具，将它放到你的项目中即可Linux 平台使用sudo apt install rar安装解压工具，然后通过whereis rar查看可执行文件路径使用set_rar_tool()设置解压工具路径，详情参考 API 文档API 文档.login(username, passwd)登录蓝奏云参数类型说明必填usernamestr用户名Ypasswdstr登录密码Y示例 :from lanzou.api import LanZouCloud

lzy = LanZouCloud()
code = lzy.login('username', 'passwd')
if code == LanZouCloud.SUCCESS:
    print('登录成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.logout()注销当前账号示例 :code = lzy.logout()
if code == LanZouCloud.SUCCESS:
    print('注销成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.get_dir_list(folder_id)获取子文件夹name-id列表参数类型说明必填备注folder_idint文件夹idN默认-1(根目录)示例 :# 列出 id 为 1037070 的文件夹的子文件夹
sub_dirs = lzy.get_dir_list(1037070)
print(sub_dirs)返回值：{
    "娱乐": 1037080,
    "科幻": 1037083,
    "纪录片": 1037084,
    "游戏改": 1037085
}.get_file_list(folder_id)获取文件详细信息列表参数类型说明必填备注folder_idint文件夹idN默认-1(根目录)示例 :file_list = lzy.get_file_list(1037070)
print(file_list)注意 : 添加了伪装后缀名的文件，伪装后缀会被自动去除返回值 :{
    "Valentin - A Little Story.mp3":{
        "id": 12741016,     # 文件 id
        "name": "Valentin - A Little Story.mp3",    # 文件名
        "time": "昨天15:27",      # 上传时间
        "size": "8.0 M",    # 文件大小
        "downs": 6,         # 下载次数
        "has_pwd": False, # 是否设置提取码
        "has_des": True   # 是否设置描述
    },
    "小清水亜美 - 玻璃の空.mp3":{
        "id": 12740874,
        "name": "小清水亜美 - 玻璃の空.mp3",
        "time": "昨天15:24",
        "size": "10.7 M",
        "downs": 0,
        "has_pwd": False,
        "has_des": False
    }
}.get_file_list2(folder_id)获取子文件名-id列表参数类型说明必填备注folder_idint文件夹idN默认-1(根目录)示例 :file_list = lzy.get_file_list2(1037070)
print(file_list)返回值 :{
    "Valentin - A Little Story.mp3": 12741016,
    "小清水亜美 - 玻璃の空.mp3": 12740874
}.get_full_path(folder_id)获取文件夹的绝对路径参数类型说明必填备注folder_idint文件夹idN默认-1(根目录)示例 :# 路径: /视频/电影/娱乐     "娱乐"文件夹 id 为 1037080
full_path = lzy.get_full_path(1037080)
print(full_path)返回值 :{
    "LanZouCloud": -1,
    "视频": 1033205,
    "电影": 1037070,
    "娱乐": 1037080
}.delete(fid, is_file=True)把网盘的文件(夹)放到回收站参数类型说明必填备注fidint文件(夹)idY-is_filebool是否为文件idN默认True示例 :code = lzy.delete(12741016)
if code == LanZouCloud.SUCCESS:
    print('删除成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED注 :无法删除含有子文件夹的文件夹,但含有文件的可以删除。重复删除同一个 id 仍返回 :LanZouCloud.SUCCESS删除不存在的 id 也返回 :LanZouCloud.SUCCESS这都是蓝奏云的锅，与我无关 :(.move_file(file_id, folder_id)移动文件到指定文件夹参数类型说明必填备注file_idint文件idY-folder_idint文件夹idN默认-1(根目录)示例 :# 把 id=12741016 的文件移动到 id=1037083 的文件夹
code = lzy.move_file(12741016, 1037083)
if code == LanZouCloud.SUCCESS:
    print('恢复成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.upload_file(file_path, folder_id, call_back)上传文件到网盘的指定文件夹参数类型说明必填备注file_pathstr本地文件路径Y使用绝对路径folder_idint网盘文件夹idN默认-1(根目录)call_backfunc回调函数N默认None返回值 :上传成功返回 :LanZouCloud.SUCCESS上传失败返回 :LanZouCloud.FAILED压缩过程异常返回 :LanZouCloud.ZIP_ERROR注意 :上传一个网盘中已经存在的文件，默认执行覆盖操作不支持的文件会自动添加伪装后缀名，下载时自动去除大文件使用 RAR 分卷压缩，保留 5% 恢复记录上传大文件会自动在网盘创建文件夹以保存分卷回调函数 : 该函数用于跟踪上传进度参数类型说明file_namestr上传文件名total_sizeint文件总字节数now_sizeint已上传字节数示例:# 显示上传进度条的回调函数
def show_progress(file_name, total_size, now_size):
        """显示进度条的回调函数"""
        percent = now_size / total_size
        bar_len = 40  # 进度条长总度
        bar_str = '>' * round(bar_len * percent) + '=' * round(bar_len * (1 - percent))
        print('\r{:.2f}%\t[{}] {:.1f}/{:.1f}MB | {} '.format(
            percent * 100, bar_str, now_size / 1048576, total_size / 1048576, file_name), end='')
        if total_size == now_size:
            print('')  # 下载完成换行

code = lzy.upload_file(r"D:\test\DJ Okawari - Luv Letter.mp3", -1, show_progress)
if code != LanZouCloud.SUCCESS:
    print('上传失败!')结果 :.upload_dir(dir_path, folder_id, call_back)上传一个文件夹参数类型说明必填备注dir_pathstr本地文件夹路径Y使用绝对路径folder_idint网盘文件夹idN默认-1(根目录)call_backfunc回调函数N默认None返回值 : 同.upload_file()注意 : 上传的文件夹中，不能存在子文件夹回调函数 : 同.upload_file()示例 :code = lzy.upload_dir(r"D:\test\music", -1, show_progress)
if code != LanZouCloud.SUCCESS:
    print('上传失败!')结果 :.is_file_url(share_url)判断分享链接是否为文件参数类型说明必填share_urlstr分享链接Y返回值 : 是文件返回True,否则返回False.is_folder_url(share_url)判断分享链接是否为文件夹参数类型说明必填share_urlstr分享链接Y返回值 : 是文件夹返回True,否则返回False.set_rar_tool(bin_path)设置 RAR 压缩工具二进制文件路径参数类型说明必填bin_pathstr压缩工具路径Y返回值 :设置成功返回 :LanZouCloud.SUCCESS文件不存在返回 :LanZouCloud.ZIP_ERROR.download_file(share_url, pwd, save_path, call_back)通过分享链接下载文件参数类型说明必填备注share_urlstr文件分享链接Y-pwdstr提取码N默认空save_pathstr文件保存路径N默认当前路径call_backfunc回调函数N默认None返回值 :链接非法返回 :LanZouCloud.URL_INVALID文件已取消返回 :LanZouCloud.FILE_CANCELLED全部成功返回 :LanZouCloud.SUCCESS下载失败返回 :LanZouCloud.FAILED缺少提取码返回 :LanZouCloud.LACK_PASSWORD提取码错误返回 :LanZouCloud.PASSWORD_ERROR示例 :code = lzy.download_file('https://www.lanzous.com/i6qxywb', '6666', r'D:\test\download', show_progress)
if code == LanZouCloud.FAILED:
    print('失败!')结果 :.download_file2(fid, save_path, call_back)登录用户通过id下载文件参数类型说明必填备注fidint文件idY-save_pathstr文件保存路径N默认当前路径call_backfunc回调函数N默认None返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED回调函数 : 同.download_file().download_dir(share_url, dir_pwd, save_path, call_back)通过分享链接下载文件夹参数类型说明必填备注share_urlstr文件夹分享链接Y-dir_pwdstr提取码N默认空save_pathstr文件保存路径N默认./downcall_backfunc回调函数N默认None返回值 :链接非法返回 :LanZouCloud.URL_INVALID文件已取消返回 :LanZouCloud.FILE_CANCELLED全部成功返回 :LanZouCloud.SUCCESS下载失败返回 :LanZouCloud.FAILED缺少提取码返回 :LanZouCloud.LACK_PASSWORD提取码错误返回 :LanZouCloud.PASSWORD_ERROR解压失败返回 :LanZouCloud.ZIP_ERROR注意 :不能下载多级文件夹，只会下载一个文件夹下的所有文件分卷压缩文件下载完成后自动解压出原文件解压异常时不会自动删除分卷文件，可尝试使用解压软件手动修复示例 :code = lzy.download_dir('https://www.lanzous.com/b0f142z0d/', '6666', r'D:\test\download', show_progress)
if code == LanZouCloud.LACK_PASSWORD:
    print('大人！您没给我没填提取码啊！')
elif code == LanZouCloud.PASSWORD_ERROR:
    print('我好难啊，提取码不对！')结果 :.download_dir2(fid, save_path, call_back)登录后通过id下载文件夹参数类型说明必填备注fidint文件夹idY-save_pathstr文件保存路径N默认./downcall_backfunc回调函数N默认None返回值 : 同.download_dir()示例 :code = lzy.download_dir2(1056513, r'D:\test\download', show_progress)
if code != LanZouCloud.SUCCESS:
    print('艾玛，失败了??不可能!!')示例 :code = lzy.mkdir(-1, 'my_music', '音乐分享')
if code == LanZouCloud.SUCCESS:
    print('创建成功')返回值 :创建成功返回 :LanZouCloud.SUCCESS目标已存在返回 :LanZouCloud.SUCCESS创建失败返回 :LanZouCloud.FAILED.mkdir(parent_id, folder_name, description)创建文件夹并返回 id参数类型说明必填备注parent_idint父文件夹idY-1表根目录folder_namestr文件夹名Y自动删除非法字符descriptionstr文件夹描述N默认无示例 :code = lzy.mkdir(-1, 'my_music', '音乐分享')
if code != LanZouCloud.MKDIR_ERROR:
    print('文件夹id:' + str(code))返回值 :创建成功返回 :文件夹ID目标已存在返回 :文件夹ID创建失败返回 :LanZouCloud.MKDIR_ERROR注意 : 蓝奏云支持创建同名文件夹，但本方法会阻止这种操作，以防出现混淆.rename_dir(folder_id, folder_name, description)重命名文件夹(和描述)参数类型说明必填备注folder_idint文件夹idN默认-1(根目录)folder_namestr文件夹名Y非法字符自动删除descriptionstr文件夹描述N默认无示例 :code = lzy.rename_dir(1037070, 'soft-music', '轻音乐分享')
if code == LanZouCloud.SUCCESS:
    print('修改成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.list_recovery()列出回收站文件(夹)示例 :deleted_files = lzy.list_recovery()
print(deleted_files)返回值 :{
    "folder_list": {
        "杂物": "1037324",
        "相册": "1037324"
    },
    "file_list": {
        "java模拟器.zip": "1037324",
        "Valentin - A Little Story.mp3": "12741016",
        "小清水亜美 - 玻璃の空.mp3": "12740874"
    }
}.recovery(fid, is_file=True)从回收站恢复文件（夹）参数类型说明必填备注fidint文件(夹)idY-is_filebool是否为文件idN默认True示例 :code = lzy.recovery(12741016)
if code == LanZouCloud.SUCCESS:
    print('恢复成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.clean_recycle()清空回收站示例 :code = lzy.clean_recycle()
if code == LanZouCloud.SUCCESS:
    print('清空成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.get_share_info(fid, is_file=True)获取文件(夹)分享信息参数类型说明必填备注fidint文件(夹)idY-is_filebool是否为文件idN默认True示例 :info = lzy.get_share_info(1033203)

if info['code'] == LanZouCloud.SUCCESS:
    print('分享链接:' + info['share_url'])返回值 :{
    "code": 0,      # 状态码
    "share_url": "https://www.lanzous.com/i6q0fli",    # 分享链接
    "passwd": "6666"          # 提取码
}状态码 code:获取成功 :LanZouCloud.SUCCESS获取失败 :LanZouCloud.FAILEDfid参数错误 :LanZouCloud.ID_ERROR.set_share_passwd(fid, passwd, is_file=True)设置文件(夹)分享密码参数类型说明必填备注fidint文件(夹)idY-passwdstr分享密码N2-6个字符,默认空(无密码)is_filebool是否为文件idN默认True示例 :code = lzy.set_share_info(1033203, 'fuck')
if code == LanZouCloud.SUCCESS:
    print('设置成功')返回值 :成功返回 :LanZouCloud.SUCCESS失败返回 :LanZouCloud.FAILED.get_direct_url(share_url, pwd)获取文件下载直链参数类型说明必填备注share_urlstr文件分享链接Y-pwdstr提取码N默认空示例 :info = lzy.get_direct_url('https://www.lanzous.com/i6qxywb', '6666')

if info['code'] == LanZouCloud.SUCCESS:
    print('直链地址:' + info['direct_url'])
elif info['code'] == LanZouCloud.LACK_PASSWD:
    print('缺少提取码')返回值 :{
    "code": 0,
    "name": "Git-2.23.0-64-bit.exe",
    "direct_url": "https://development5.baidupan.com/100420bb/2019/10/03/41c4117570de8c0ce02d7e7ddc838135.mp3?st=o22S3uwv063cbklsDWh50w&e=1570193627&b=CAwBYFA8UzNXbAclADkAagN2WisNLAVCUSIBQFM9B3FTdQ5iUDVYfVVTVHYEOwF3VXkAcgFtA3VSMg_c_c&fi=12741016&up="
}状态码 code :获取成功 :LanZouCloud.SUCCESS分享链接非法 :LanZouCloud.URL_INVALID缺少提取码 :LanZouCloud.LACK_PASSWORD提取码错误 :LanZouCloud.PASSWORD_ERROR文件已取消 :LanZouCloud.FILE_CANCELLED注意 :本方法会检查分享链接合法性直链有效期约 30 分钟.get_direct_url2(fid)登录后通过id获取文件下载直链参数类型说明必填备注fidint文件idY-返回值 :  同.get_direct_url()