python爬虫---批量分享链接保存/百度api

2023-05-16

参考文章:

百度网盘开放平台:https://pan.baidu.com/union/document/entrance

第三方百度百度网盘库(baidupcsapi):
https://github.com/ly0/baidupcsapi

import requests
import json
import re
import queue
import os
import time
from tqdm import tqdm
from  selenium.webdriver import ChromeOptions
from  selenium.webdriver import Chrome
def convert_cookie(chrome_cookie):
    """从chrome.get_cookies()中获取必要cookie信息
    
    :param chrome_cookie: chrome_cookie:由selenium产生的cookie
    :return: 返回为string,cookie字符,供requests使用
    """
    cookie = ""
    for i in chrome_cookie:
        if ("BDUSS" == i['name']):
            cookie += "BDUSS=" + i['value'] + ";"
        if ("STOKEN" == i['name']):
            cookie += "STOKEN=" + i['value'] + ";"
        if ("BDCLND" == i['name']):
            cookie += "BDCLND" + i['value'] + ";"
    return cookie

def check_file(cookie,filename):
    """检查文件是否被被存储
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :param filename: 查询的文件名
    :return: True已被存储,False没有被存储
    
    """
    F = search_file(cookie,filename)
    if(len(F)!=0):
        return True
    else:
        return False

def save_share(cookie,url,password=None,path=""):
    """保存分享链接(注意:cookie必须包含BDCLND(当浏览器保存一次分享链接后会在cookie中出现))
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :param url: 分享链接的完整地址
    :param password: 链接提取码
    :param path: 保存路径(绝对路径)
    :return: 0 储存成功, 1 分享链接错误,12 文件保存失败(储存空间不足),-21 链接失效,-9 pwd错误。
    """
    R = r'pan.baidu.com/s/1(\S+)'
    try:
        surl = re.findall(R,url)[0]
    except:
        return 1
    """外链验证"""
    url = "https://pan.baidu.com/share/verify?surl=" + surl
    data = {
            "pwd": password,
        }
    params = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
            'Referer':'pan.baidu.com'
        }
    r=requests.post(url,data=data,headers=params)
    JS = json.loads(r.content)
    """外链验证结果"""
    if(JS['errno']!=0):
        return JS['errno']
    sekey=JS['randsk']
    """获取链接信息"""
    url="https://pan.baidu.com/share/list?shareid={0}&shorturl={1}&sekey={2}&root=1".format('',surl,sekey)
    r=requests.get(url,headers=params)
    file = json.loads(r.content)
    """提取fsid列表"""
    fsid=[]
    if(file['errno']!=0):
        return file['errno']
    for i in file['list']:
        fsid.append(eval(i['fs_id']))
    """转储必要信息为字典"""
    url = "https://pan.baidu.com/share/transfer?shareid={0}&from={1}&sekey={2}".format(file['share_id'],file['uk'],JS['randsk'])
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie'] = cookie
    post = {
        'fsidlist': json.dumps(fsid),
        'path':path
    }
    try:
        Z = requests.post(url, headers=header, data=post).text
        r = json.loads(Z)
    except:
        red(Z)
        return -100
    if(r['errno']==12):
        for i in file['list']:
            if(check_file(cookie,i['server_filename'])==False):
                M = check_free(cookie)
                M = (M['total'] - M['used'])/1024/1024/1024
                if(M>20):
                    return -100
                else:
                    return 12
        return 0
    return r['errno']

def load_cookie():
    """加载本地cookie

    :return: 返回为储存在本地的chrome cookie
    """
    Cookie = []
    try:
        with open('Cookie.json', 'r', encoding='utf-8') as f:
            for i in json.loads(f.read()):
                try:
                    del i['expiry']
                except:
                    pass
                Cookie.append(i)
    except:
        print('加载Cookie失败!')
    return Cookie

def get_file_name(file_name="", Char=""):
    """去除文件夹的名称中的不合法字符为Char,默认为空

    :param Char:替换成的字符
    :param file_name: 
    :return: 
    """
    for i in '<>|*?,/:':
        file_name = file_name.replace(i, Char)
    return file_name

def build_chrome(cookie=None):
    """构建浏览器

    :param cookie: selenium list类型的cookie
    :return: 返回构建完成的chrome浏览器
    """
    chrome_options = ChromeOptions()
    chrome = Chrome(chrome_options=chrome_options)
    chrome.get('http://pan.baidu.com')
    if (cookie != None or cookie != []):
        for i in cookie:
            try:
                del i['expiry']
            except:
                pass
            chrome.add_cookie(i)
    chrome.refresh()
    return chrome

def load_url_list():
    """加载本地分享链接数据(百度分享链接.txt)

    :return: 返回list类型的链接列表
    """
    data = []
    try:
        with open("百度分享链接.txt", 'r', encoding='utf-8') as f:
            for i in f.read().split('\n'):
                i=i.replace('?','')
                F = i.split('|')
                F[0]=get_file_name(F[0])
                data.append(F)
        print("加载数据成功!\n共计 {0}条".format(len(data)))
    except:
        print("加载数据失败!")
    return data

def create_folder(cookie, path, isdir=1):
    """创建文件/文件夹

            :param path:文件绝对路径(含需要创建文件/目录)

            :param isdir: 0 文件、1 目录
            
            :return 返回创建好的文件的绝对路径
            """
    data = {
        "path": '/' + path,
        "isdir": isdir,
        "size": "",
        "block_list": "[]",
        "method": "post"
    }
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
        # 'cookie':'BDUSS=lyS3lOWVg4VjIxbmNOeWFUTnhqd3Z2NX5meE1nc0VoWVgyOEx6dXNkY2NySnhkRVFBQUFBJCQAAAAAAAAAAAEAAAA1bYmSaWhiNTQyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwfdV0cH3VdR3; STOKEN=9a1a4c2ca3a9711e77da92afd089f69a1732ef786a77488c38f12397e21c4103; '
    }
    header['cookie'] = cookie
    url = "https://pan.baidu.com/api/create?a=commit&channel=chunlei&app_id=250528"
    r = requests.post(url=url, headers=header, data=data).text
    return json.loads(r)['path']

def delete_files(cookie,path):
    """删除文件
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :param path: 这个为要删除的文件的绝对路径(可以传递路径列表,也可以传递单一 string绝对路径)
    :return: 返回errno,目前没有意义
    """
    url = 'https://pan.baidu.com/api/filemanager?opera=delete&async=2&onnest=fail&channel=chunlei&web=1&app_id=250528&clienttype=0'
    header = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer':'pan.baidu.com'
    }
    header['cookie'] = cookie
    if(type(path)!=list):
        filelist = [path]
    else:
        filelist = path
    data={
    'filelist': json.dumps(filelist)
    }
    r = requests.post(url=url,data=data,headers = header).text
    return  json.loads(r)['errno']

def share_files(cookie,fid_list, pwd, days=7):
    """创建分享
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :param fid_list: 文件id列表
    :param pwd:  分享密码(4位不同的数字或字母)
    :param days: 外链有效期,0 永久、1 1天、7 7天,默认0
    :return: 响应
    """
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie']=cookie
    url = "https://pan.baidu.com/share/set?channel=chunlei&clienttype=0&web=1&channel=chunlei&web=1&app_id=250528&clienttype=0"
    data = {
        'schannel': '4',
        'channel_list': json.dumps([]),
        'period': days,
        'pwd': pwd,
        'fid_list': json.dumps(fid_list)
    }
    r = requests.post(url=url, headers=header, data=data).text
    return json.loads(r)

def convert_size(number):
    """转换网盘容量

            :param number: 整数

            :return: 返回string
            """
    if (number < 1024):
        return '{0:.2f} Byte'.format(number)
    number /= 1024
    if (number < 1024):
        return '{0:.3f} KB'.format(number)
    number /= 1024
    if (number < 1024):
        return '{0:.3f} MB'.format(number)
    number /= 1024
    if (number < 1024):
        return '{0:.3f} GB'.format(number)
    number /= 1024
    return '{0:.3f} TB'.format(number)

def user_name(cookie):
    """获取用户信息(测试cookie有效性)
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :return: 用户名
    """
    url = 'https://passport.baidu.com/center'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie'] = cookie
    r = requests.get(url=url, headers=header).content.decode('utf-8')
    f = re.findall(r'"displayUsername"\s+title="(.*?)">', r)
    return f[0]

def check_free(cookie):
    """获取网盘容量
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到
    :return: 结果例子:{"errno":0,"total":2204391964672,"request_id":5929092093134126170,"expire":null,"used":2203832252091}
    """
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie'] = cookie
    page = requests.get('https://pan.baidu.com/api/quota?chckfree=1&checkexpire=1', headers=header).text
    return json.loads(page)

def get_file_list(cookie, path="/"):
    """获取用户文件列表
    
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到       
    :param path: 获取文件路径   
    :return: 返回None为失败
    """
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie'] = cookie
    header['dir'] = path
    url = 'https://pan.baidu.com/api/list?'
    r = requests.get(url=url, headers=header).content.decode('utf-8')
    F = None
    try:
        F = json.loads(r)
    except:
        pass
    return F['list']

def search_file(cookie,file_name):
    """文件搜索

    :param file_name: 搜索的关键字
    :param cookie: 由get_cookie()函数转换chrome得到,或者通过浏览器抓包得到  
    :return: 返回:file_list
    结果:[{'category': 6, 'unlist': 0, 'isdir': 1, 'oper_id': 1066838869, 'server_ctime': 1568999679, 'local_mtime': 1568999679, 'size': 0, 'server_filename': '\ufeff《死在文兰DeadInVinland》中文版nsp下载', 'share': 0, 'path': '/\ufeff《死在文兰DeadInVinland》中文版nsp下载', 'local_ctime': 1568999679, 'server_mtime': 1568999679, 'fs_id': 99524860442047}]
    """
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Referer': 'pan.baidu.com'
    }
    header['cookie'] = cookie
    url = 'https://pan.baidu.com/api/search?key={0}'.format(file_name)
    r = requests.get(url=url, headers=header).content.decode('utf-8')
    return json.loads(r)['list']

def save_chrome_cookie(cookie):
    """保存Cookie到本地

    :param cookie: selenium产生的cookie 
    :return: 返回bool类型值,true成功,false失败
    """
    try:
        with open('Cookie.json', 'w', encoding='utf-8') as f:
            f.write(json.dumps(cookie))
        return True
    except:
        return False

def Blue(text,T=False):
    """背景蓝
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if(T):
        print("\033[1;46m{0}\033[0m".format(text),end="")
    else:
        print("\033[1;46m{0}\033[0m".format(text))

def blue(text,T=False):
    """蓝字
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if(T):
        print("\033[1;36m{0}\033[0m".format(text),end="")
    else:
        print("\033[1;36m{0}\033[0m".format(text))

def Green (text,T=False):
    """背景绿
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if (T):
        print("\033[1;42m{0}\033[0m".format(text), end="")
    else:
        print("\033[1;42m{0}\033[0m".format(text))

def green (text,T=False):
    """绿字
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if (T):
        print("\033[1;32m{0}\033[0m".format(text), end="")
    else:
        print("\033[1;32m{0}\033[0m".format(text))

def yellow(text,T=False):
    """黄字
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if (T):
        print("\033[1;33m{0}\033[0m".format(text), end="")
    else:
        print("\033[1;33m{0}\033[0m".format(text))

def red(text,T=False):
    """红字
    
    :param text: 
    :param T: 是否换行
    :return: 
    """
    if (T):
        print("\033[1;31m{0}\033[0m".format(text), end="")
    else:
        print("\033[1;31m{0}\033[0m".format(text))

def code(code):
    if(code==-21):
        return "分享的文件已经被取消"
    if (code ==12):
        return "储存已满"
    if (code ==105):
        return "外链地址错误"
    if (code ==-12):
        return "参数错误"
    if (code ==-9):
        return "pwd错误"
    if (code ==110):
        return "文件命中频控策略"
    if (code ==-7):
        return "shareid不存在"
    if (code ==115):
        return "文件命中黑名单禁止分享"
    if (code ==-70):
        return "分享文件存在病毒"
    if (code ==0):
        return "成功"
    if(code==-100):
        return "文件过大"
    if(code==1):
        return "错误链接"
    return str(code)
def safe_writer(f,i):
    if(i==[]):
        return 
    if(len(i)==1):
        f.write(i[0]+"||\n")
    elif(len(i)==2):
        f.write(i[0]+"|"+i[1]+"|\n")
    else:
        f.write(i[0]+"|"+i[1]+"|"+i[2]+"\n")

url = load_url_list()
C = load_cookie()
chrome = build_chrome(cookie=C)
input("继续:")
cookie = convert_cookie(chrome.get_cookies())
save_chrome_cookie(chrome.get_cookies())
FF = True
count =1
size = len(url)
for i in url:
    G = None
    if(len(i)!=1):
        try:
            print("链接:{0}\n进度:{1}/{2} = {3:.2f}%".format(i[1],count,size,count*100/size))
        except:
            print("ERROR_Mage:{0}".format(i))
    else:
        continue
    count+=1
    if(FF):
        if(len(i)==3):
            G = create_folder(cookie=cookie,path=i[0])
            C = save_share(cookie=cookie, url=i[1], password=i[2], path=G)
        else:
            print("错误链接!")
            with open('BAD_URL.txt', 'a', encoding='utf-8') as f:
                safe_writer(f, i)
            print('')
            continue
        print("文件", end='    ')
        print(i[0], end='    ')
        print("存储在", end='    ')
        print(G)
        print("状态:",end='  ')
        print(code(C))
        print("")
        if (C == 0):
            continue
        if (C == -100):
            with open('BIG_FILE.txt', 'a', encoding='utf-8') as f:
                safe_writer(f,i)
        elif (C == -9):
            with open('pwd错误.txt', 'a', encoding='utf-8') as f:
                safe_writer(f, i)
        else:
            with open('BAD_URL.txt', 'a', encoding='utf-8') as f:
                safe_writer(f, i)
        delete_files(cookie, G)
    else:
        with open('NO_SAVE.txt','a',encoding='utf-8') as f:
            safe_writer(f, i)
        continue
    if(C == 12 and FF==True):
        FF = False
        print("写入NO_SAVE.txt")
input("退出:")
chrome.quit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫---批量分享链接保存/百度api 的相关文章

随机推荐

  • linux/ubuntu取消sudo输入密码的办法

    Linux Ubuntu sudo不用输入密码的方法 通常我们并不以root身份登录 xff0c 但是当我们执行某些命令 command 时需要用到root权限 xff0c 我们通常都是用 34 sudo command 34 来执行com
  • verilog通过中+:与-:解决变量内固定长度数据位的动态选取

    在FPGA设计过程 xff0c 尤其是算法实现时hi xff0c 有时往往需要选取某个变量的动态范围地址 xff0c 而verilog中常规的向量标识方法a MSB LSB 往往会发生错误 xff0c 在此可借用a BASE WIDTH 的
  • IDEA配置Hadoop插件

    一 安装插件 1 1搜索的方式安装 xff1a setting中找到plugins插件 xff0c 然后搜索big Data 如下图 xff1a 如果找不到可以修改几个配置试一下 xff1a 如果还是不行 xff0c 你可以在cmd里面 p
  • linux的进程突然没有了

    这几天在linux服务器上跑实验 xff0c 进程占用的空间比较大 xff0c 而且占用的时间也比较长 xff0c 有时候会发现进程突然没有了 这个时候去翻了翻系统的内核日志 xff0c var log 路径下会有一个kern log的日志
  • IDEA建hadoop项目

    一 新建项目project 选择maven xff1b 填写maven的坐标 xff0c groupId xff0c artifactId xff0c 以及 version xff0c 其中groupId是公司域名的反写 xff0c 而ar
  • OpenWRT路由器-中继模式下无线接入

    本文主要介绍刷入了OpenWRT系统的路由器如何作为二级路由器 xff0c 通过wifi接入上一级路由以及发出wifi供本局域网下的设备连接 二级路由器可以增强现有的信号 现在的路由器一般都是双频路由器 xff0c 双频路由器往往是两块网卡
  • XSS(Reflected) 反射型跨站攻击

    今天我学习一下反射型XSS 打开DVWA网站 xff0c 先切换到low级别 xff0c 选择XSS xff08 Reflected xff09 先查看其源代码 xff1a lt php header 34 X XSS Protection
  • Notepad++离线安装NppFTP

    文章目录 第一步 下载第二步 安装第三步 重启Notepad 43 43 后即可使用 第一步 下载 下载地址 xff1a https github com ashkulz NppFTP releases 选择对应版本解压 xff0c x86
  • nested exception is com.microsoft.sqlserver.jdbc.SQLServerException

    今天在写一个数据库语句的时候 xff0c 出现了一个错误 xff0c 话不多说 xff0c 上图 nested exception is com microsoft sqlserver jdbc SQLServerException 仅当使
  • 一文搞懂SpringSecurity,spring-security配置文件详解,史上最全

    一 认证和授权概念 1 在生产环境下我们如果不登录系统是否能对业务进行操作 xff1f 答案显然是否定的 xff0c 要操作这些功能必须首先登录到系统才可以 2 是不是所有用户 xff0c 只要登录成功就都可以操作所有功能呢 xff1f 答
  • map.computeIfAbsent() 详解

    computeIfAbsent 1 首先会判断map中是否有对应的Key xff1b 2 1 如果没有对应的Key xff0c 则会创建一个满足Value类型的数据结构放到Value的位置中 xff1b 2 2 如果有对应的Key xff0
  • SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能

    Spring Security 一 简介 Spring Security是Spring家族中的一个安全管理框架 xff0c 一般Web应用都需要 认证 和 授权 认证 xff1a 验证当前访问系统的是不是本系统的用户 xff0c 并且要确认
  • Java一维数组与二维数组的转换

    准备 现有一个一维数组 xff1a 1 2 3 4 5 6 7 8 9 转为 3 3 的二维数组 xff1a 1 2 3 4 5 6 7 8 9 我们不难看出 xff1a 一维数组第1个元素在数组中为 arr 0 0 一维数组第3个元素在数
  • 采用JSP+Servlet+JDBC完成的一个产品信息管理系统

    项目架构 项目整体采用 xff1a Maven 43 Servlet 43 JSP 43 JDBC 43 bootstrap 43 javascript完成 数据库表设计 t manager 管理员ID 用户名 密码 manager id
  • Python并发学习

    Python并发 1 多进程 和多线程的方式类似 2 多线程 2种编写方式 2 1 submit方式2 2 map方式 3 异步 xff08 协程 xff09 3 1 调用方式3 1 1 在协程函数里去调用协程3 1 2 在非协程函数里去调
  • 动态规划思想《从入门到放弃》

    动态规划的定义 将原问题拆解成若干子问题 xff0c 同时保存子问题的答案 xff0c 使得每个子问题只求解一次 xff0c 最终获得原问题的答案 动态规划的一般流程 例子1 xff1a 一维空间的动态规划 题目 xff1a 求斐波那契数列
  • ubuntu如何输入中文

    右上角设置 gt 区域与语言 gt 输入源 gt 点击 43 号添加 中文 xff08 智能拼音 xff09
  • c++随机数

    计算机的运行是通过代码来进行的 xff0c 而代码的执行需要确定的数字 xff0c 即计算机的运行过程是一个确定的过程 xff0c 计算机的运行过程是一个确定的过程 xff0c 所以不可能产生一个真正有意义的数字 xff0c 即计算机只能产
  • Unicode的简单使用

    Unicode编码中包含了很多字符和形状 xff0c 如果想在再编码中使用 xff0c 可以参见文档 xff1a https www unicode org Public 14 0 0 charts CodeCharts pdf 使用方法
  • python爬虫---批量分享链接保存/百度api

    参考文章 xff1a 百度网盘开放平台 xff1a https pan baidu com union document entrance 第三方百度百度网盘库 xff08 baidupcsapi xff09 xff1a https git