本帖最后由 天空宫阙 于 2019-12-22 21:09 编辑
百度网盘文件批量重命名脚本
1.使用cookie登录
2.支持递归到最深一层文件夹,重命名文件夹中文件,但不重名文件夹
3.使用正则表达式,随心所欲重命名
登录信息配置
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
效果
|