吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5649|回复: 6
上一主题 下一主题
收起左侧

[Python 转载] python 百度网盘文件批量重命名原创源码

[复制链接]
跳转到指定楼层
楼主
天空宫阙 发表于 2019-12-22 20:10 回帖奖励
本帖最后由 天空宫阙 于 2019-12-22 21:09 编辑

百度网盘文件批量重命名脚本

1.使用cookie登录

2.支持递归到最深一层文件夹重命名文件夹中文件,但不重名文件夹

3.使用正则表达式,随心所欲重命名





登录信息配置





BDTOKEN可在请求的params中找到





COOKIE可在请求的headers中找到





dir为操作文件的目录,谨慎设置为根目录,否则后果自负例如dir = '%2F我的资源%2F烦人xiu仙转(大灰狼)[1631回]32Kbps'可在地址栏path='''找到,同时支持urldecode后的

如dir = '/六级真题/2018年12月CET6/第二套'

PATTERN和REPLACE分别为要替换的字符和替换成的字符pattern支持正则表达式



完整代码
[Python] 纯文本查看 复制代码
# [Callback] 百度网盘errno错误代码汇总对照表 https://blog.leiyun.org/mix/baiduerrno.html

import requests
import json
import time
import re
import urllib.parse


# 配置信息
# 操作的百度云目录
dir = '%2F我的资源%2F烦人xiu仙转(大灰狼)[1631回]32Kbps'
# # 是否urlencode都可以
# dir = '/六级真题/2018年12月CET6/第二套'

# BDTOKEN可在请求的params中找到
BDTOKEN = ''
# COOKIE可在请求的headers中找到
COOKIE = ''
# PATTERN和REPLACE分别为要替换的字符和替换成的字符
PATTERN = '烦人xiu仙转'
REPLACE = '凡人修仙传'



headers={
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': COOKIE,
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
}
 
def list_name_desc(dir):
    """
        查询指定dir的文件,以列表方式返回文件信息
        input - dir
        return - file_info_list
    """
    dir = urllib.parse.unquote(dir)
    apilist_url = 'https://pan.baidu.com/api/list'
    params = {
        'dir': dir,
    }
    response = requests.get(apilist_url,params=params,headers=headers)
    response.raise_for_status()
    if response.json()['errno'] ==0:
        file_list = response.json()['list']
        file_info_list = []
        for file in file_list:
            server_filename = file['server_filename']
            isdir = file['isdir']
            path = file['path']
            if 'dir_empty' in file.keys():
                dir_empty = file['dir_empty']
            else:
                dir_empty = 0
            each_file_info ={
                'server_filename':server_filename,
                'isdir':isdir,
                'path':path,
                'dir_empty':dir_empty
            }
            file_info_list.append(each_file_info)
        return file_info_list


def baiduyun_rename(rename_list):
    '''
        按rename_list向接口https://pan.baidu.com/api/filemanager发送重命名请求
        input - rename_list
        print - result
        rename_list格式[{"path":PATH,"newname":NEWNAME},{"path":PATH,"newname":NEWNAME},]
        特别注意用rename_list构造post请求的data时,rename_list需要json.dumps转成字符串
    '''
    try_max = 5
    try_count = 0
    params = {
    'opera': 'rename',
    'async': '2',
    'onnest': 'fail',
    'channel': 'chunlei',
    'web': '1',
    'app_id': '250528',
    'bdstoken': BDTOKEN,
    # 'logid':get_logid() ,
    'clienttype': '0',
    }
    if not rename_list==[]:
        # ensure_ascii=False 加不加都可以,但key "filelist" 对应的 value 必须用json.dumps()转成字符串类型
        data = {"filelist" : json.dumps(rename_list,ensure_ascii=False)}
        url = 'https://pan.baidu.com/api/filemanager'
        response = requests.post(url,params=params,data=data,headers=headers)
        response.raise_for_status()
        errno = response.json()['errno']
        if errno ==0:
            print('[info] : rename successfully!')
        elif errno==12:
            print('[warning]: 批量处理错误,5s后重试')
            try_count+=1
            if try_count <=try_max:
                time.sleep(5)
                baiduyun_rename(rename_list)
            else:
                print('[error] : 批量处理错误且达到最大重试上限')
        else:
            print(response.json())
    else:
        pass
        # print('[error] : rename_list is empty')

def rename_file_in_dir(dir,renameDirChildren=True):
    """
        调用函数list_name_desc(dir)查询
        调用函数baiduyun_rename(rename_list)重命名
        renameDirChildren=True 如果为文件夹将会迭代,即按相同的规则重命名文件夹中的文件

    """
    file_info_list = list_name_desc(dir)
    rename_list = []
    for each in file_info_list:
        if each['isdir'] == 0:
            rename_dict = {
                'path': each['path'],
                'newname':create_new_name(old_name=each['server_filename'],pattern=PATTERN,replace=REPLACE) ,
            }
            rename_list.append(rename_dict)
        if renameDirChildren and each['isdir'] == 1 and each['dir_empty'] ==0:
            time.sleep(2)
            rename_file_in_dir(each['path'],renameDirChildren=True)
    baiduyun_rename(rename_list)
    
def create_new_name(old_name,prefix=None,extension_name=None,pattern=None,replace=None):
    # old_name必要参数
    # prefix 用于添加前缀
    # extension_name 用于改扩展名
    # pattern和replace 用于正则替换
    '''
    old_name = 'mytest.doc'
    # 添加前缀test
    newname1 = create_new_name(old_name,prefix='test')
    # 改扩展名为pdf
    newname1 = create_new_name(old_name,extension_name='pdf')
    # 正则替换 test 改为 aemon
    newname2 = create_new_name(old_name,pattern='test',replace='aemon')
    '''
    new_name = ''
    if old_name:
        if prefix:
            new_name = prefix + old_name
        elif extension_name:
            new_name = old_name[:-3] + extension_name
        elif pattern:
            new_name = re.sub(pattern,replace,old_name,re.S)
        if not new_name =='':
            return new_name
        else:
            raise Exception('create_new_name error')
    else:
        raise Exception('old_name 缺失')

if __name__ == "__main__":
    # for file in list_name_desc(dir):
    #     print(file)
    # renameDirChildren=True 如果为文件夹将会迭代,即按相同的规则重命名文件夹中的文件
    rename_file_in_dir(dir,renameDirChildren=True)



py文件下载地址 :https://www.lanzouj.com/i87lhbe

练手之作就不封装了,必定有许多不完善的地方,欢迎大佬指点其实这个功能已经有人做过软件了(更加简单易用),这次用python写一遍算是练习吧
百度云的文件管理api和文件查询api
https://pan.baidu.com/api/filemanager
https://pan.baidu.com/api/list
做的不错,返回了内容也比较人性化并且验证的信息不多,本来logid我已经从js中扣出来了发现没有也行。
另外https://pan.baidu.com/api/filemanager也可以用来批量删除文件,没有这样的需求就没有写

看在我注释写这么详细的份上,免费评下分鼓励一下吧

最后感谢这位大佬的文章 [Callback] 百度网盘errno错误代码汇总对照表 https://blog.leiyun.org/mix/baiduerrno.html

效果


免费评分

参与人数 7吾爱币 +11 热心值 +6 收起 理由
户冢彩加 + 1 + 1 谢谢@Thanks!
嵇康 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
azxzgzs + 1 + 1 热心回复!
hshcompass + 1 热心回复!
zxcscm + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
spll6 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
 楼主| 天空宫阙 发表于 2019-12-22 20:21 |楼主
本帖最后由 天空宫阙 于 2019-12-22 21:23 编辑

代码中的注释,迭代应该是递归
另外cookie和bdtaken一次配置可以用很久的,还算方便吧
3#
zhl19881211 发表于 2019-12-22 22:24
4#
flyprotoss 发表于 2019-12-27 18:44
5#
dominic-duan 发表于 2020-3-11 12:58
谢谢分享!学习了
头像被屏蔽
6#
duanhaoming 发表于 2020-3-27 01:03
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽
7#
沐雨红尘 发表于 2020-3-27 22:35
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 01:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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