使用Python批量给百度网盘中的文件重命名
发布日期:2021-11-15 21:44:08 浏览次数:2 分类:技术文章

本文共 5249 字,大约阅读时间需要 17 分钟。

1、用户需要修改代码中以下变量的值:

(1)dir:dir为百度网盘的目录结构,例如:“%2F自学课%2FVue%2F资料”,可以在路径中path参数的值获取。如下图所示。

在这里插入图片描述
(2)BDTOKEN :在百度网盘的根目录处点击F12打开检查窗口,选择Network,再选择XHR,点击刷新,找到下图③所示的文件,点击后,在右侧header选项卡中出现的信息找到Param,就可以找到bdstoken的值。
在这里插入图片描述
(3)COOKIE :和上文的BDTOKEN 找的方式相同,在此只附一张图片:
在这里插入图片描述
(4)PATTERN :要被替换的内容,比如说:PATTERN =“考研”,意思是,把所有dir目录下的文件的文件名中“考研”两字会被REPLACE 的内容所替换,此变量支持使用正则表达式。
(5)REPLACE :替换为的内容,比如说:REPLACE =“我能行”,意思是,把所有dir目录下的文件的文件名中PATTERN 内容会被替换为 “我能行”。

2、代码:

import requestsimport jsonimport timeimport reimport urllib.parse# 配置信息# 操作的百度云目录dir = ''# # 是否urlencode都可以# dir = '/六级真题/2018年12月CET6/第二套'# BDTOKEN可在请求的params中找到BDTOKEN = ''# COOKIE可在请求的headers中找到COOKIE = ''# PATTERN和REPLACE分别为要替换的字符和替换成的字符PATTERN = '考研'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_listdef 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)

转载地址:https://blog.csdn.net/qq_43419016/article/details/113624811 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:KMP算法代码(C语言)
下一篇:面试题——剥皮函数

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月06日 23时25分05秒