使用Python批量给百度网盘中的文件重命名

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

(1)dir:dir为百度网盘的目录结构,例如:“%2F自学课%2FVue%2F资料”,可以在路径中path参数的值获取。如下图所示。
使用Python批量给百度网盘中的文件重命名_第1张图片
(2)BDTOKEN :在百度网盘的根目录处点击F12打开检查窗口,选择Network,再选择XHR,点击刷新,找到下图③所示的文件,点击后,在右侧header选项卡中出现的信息找到Param,就可以找到bdstoken的值。
使用Python批量给百度网盘中的文件重命名_第2张图片
(3)COOKIE :和上文的BDTOKEN 找的方式相同,在此只附一张图片:
使用Python批量给百度网盘中的文件重命名_第3张图片
(4)PATTERN :要被替换的内容,比如说:PATTERN =“考研”,意思是,把所有dir目录下的文件的文件名中“考研”两字会被REPLACE 的内容所替换,此变量支持使用正则表达式。
(5)REPLACE :替换为的内容,比如说:REPLACE =“我能行”,意思是,把所有dir目录下的文件的文件名中PATTERN 内容会被替换为 “我能行”。

2、代码:

import requests
import json
import time
import re
import 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_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)

你可能感兴趣的:(代码小工具)