Python 一键获取百度网盘提取码的方法


Posted in Python onAugust 01, 2019

Python 一键获取百度网盘提取码的方法

该 GIF 图来自于官网,文末有给出链接。

描述

依托于百度网盘巨大的的云存储空间,绝大数人会习惯性的将一些资料什么的存储到上面,但是有的私密链接需要提取码,但是让每个想下载私密资源的人记住每一个提取码显然是不现实的。这个时候,云盘万能钥匙 诞生了,我们通过安装相应的浏览器插件就可以自动获获取相应链接的提取码。我在 Github 上看了一下,有 Web JS 版的, python 版的貌似还没有找到,所以我参照了JS 版本和官网的请求接口写了两种方式的获取脚本。

实现

下述两种方式的具体实现就不做代码解释了,思路都是一样,通过请求接口,拿到数据,然后返回即可。

v1

"""
Author:hippieZhou
Date:20190608
Description: Get BaiDuYun shared link's Code 
"""
import argparse
import re
import requests
import json
import time

VERSION = "VERSION 1.0.0"


def checkUrl(url: str) -> str:
  m1 = re.match(
    "https?:\/\/pan\.baidu\.com\/s\/1([a-zA-Z0-9_\-]{5,22})", url)
  m2 = re.match(
    "https?:\/\/pan\.baidu\.com\/share\/init\?surl=([a-zA-Z0-9_\-]{5,22})", url)
  if not m1 and not m2:
    print("参数不合法")
    return False
  else:
    return True


def getKey(url: str) -> bool:
  if checkUrl(url):
    try:
      req = requests.get(f"https://node.pnote.net/public/pan?url={url}")
      code = req.status_code
      if code == 200:
        data = dict(json.loads(req.text))
        status = data.get("status", False)
        if status:
          return data.get("access_code", "未能查询到该链接的提取码,可能原因是:该链接不需要提取码或已过期")
        else:
          return data.get("messages", "为能查询到提取码")
      elif code == 404:
        return "不存在该链接的记录"
    except Exception as e:
      return f"请求服务器失败,错误代码:[code]"


def get_parser():
  parser = argparse.ArgumentParser()
  parser.description = "百度网盘提取码一键获取器"
  parser.add_argument('urls', metavar="urls", type=str, nargs="*",
            help='设置要获取提取码的链接(多个链接请用空格分隔)')
  parser.add_argument('-v', '--version', action='store_true',
            help='版本号')
  return parser


def command_line_runner():
  parser = get_parser()
  args = vars(parser.parse_args())
  if args['version']:
    print(VERSION)
    return

  s_time = time.time()
  if len(args['urls']) > 1:
    for item in args["urls"][1:]:
      print(f"{item}:\r\n\t{getKey(item)}")
    e_time = time.time()
    print(f"\n\n操作完毕,总耗时:{e_time-s_time} 秒")


def main():
  command_line_runner()


if __name__ == "__main__":
  main()

运行效果如下图所示:

Python 一键获取百度网盘提取码的方法

v2

"""
Author:hippieZhou
Date:20190608
Description: Get BaiDuYun shared link's Code 
"""

import argparse
import time
import re
import requests
from datetime import datetime
import json

accessKey = "4fxNbkKKJX2pAm3b8AEu2zT5d2MbqGbD"
clientVersion = "web-client"


def getPid(url: str) -> str:
  matches = re.match(
    "https?:\/\/pan\.baidu\.com\/s\/1([a-zA-Z0-9_\-]{5,22})", url)
  return matches[1] if matches else None


def getUuid(pid: str) -> str:
  return f"BDY-{pid}"


def getKey(url: str) -> str:
  pid = getPid(url)
  uuid = getUuid(pid)
  headers = {
    "type": "GET",
    "data": '',
    "dataType": "json"
  }
  url = f"http://ypsuperkey.meek.com.cn/api/items/{uuid}?access_key={accessKey}&client_version={clientVersion}&{datetime.utcnow()}"
  try:
    req = requests.get(url, headers=headers)
    code = req.status_code
    if code == 200:
      data = json.loads(req.text)
      accessCode = data.get("access_code", None)
      return "没找到提取密码,o(???)o" if (accessCode == "undefined" or accessCode == None or accessCode == "") else accessCode
    elif code == 400:
      return " 服务器不理解请求的语法"
    elif code == 404:
      return "不存在该链接的记录"
    else:
      return f"请求服务器失败,错误代码:[code]"
  except Exception as e:
    return e


def get_parser():
  parser = argparse.ArgumentParser()
  parser.description = "百度网盘提取码一键获取器"
  parser.add_argument('urls', metavar="urls", type=str, nargs="*",
            help='设置要获取提取码的链接(多个链接请用空格分隔)')
  parser.add_argument('-v', '--version', action='store_true',
            help='版本号')
  return parser


def command_line_runner():
  parser = get_parser()
  args = vars(parser.parse_args())
  if args['version']:
    print(VERSION)
    return

  s_time = time.time()
  if len(args['urls']) > 1:
    for item in args["urls"][1:]:
      print(f"{item}:\r\n\t{getKey(item)}")
    e_time = time.time()
    print(f"\n\n操作完毕,总耗时:{e_time-s_time} 秒")


def main():
  command_line_runner()


if __name__ == "__main__":
  main()

运行效果如下图所示:

Python 一键获取百度网盘提取码的方法

总结

v1 版本和 v2 版本是通过请求不同的接口方式来实现的, v2 接口的数据要相对更准确一些。具体可查阅具体的代码实现。

如果你觉得上述代码不错的话,欢迎访问对应的仓库地址: baidupankey 进行 star 、fork 和 follow。

相关参考

  • 云盘万能钥匙
  • JS 版

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
小结Python用fork来创建子进程注意事项
Jul 03 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
介绍Python的@property装饰器的用法
Apr 28 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
python中正则表达式 re.findall 用法
Oct 23 Python
如何实现Django Rest framework版本控制
Jul 25 Python
Flask框架单例模式实现方法详解
Jul 31 Python
对YOLOv3模型调用时候的python接口详解
Aug 26 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
python不同系统中打开方法
Jun 23 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
Django中的静态文件管理过程解析
Aug 01 #Python
pycharm 批量修改变量名称的方法
Aug 01 #Python
python腾讯语音合成实现过程解析
Aug 01 #Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 #Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 #Python
Python中list的交、并、差集获取方法示例
Aug 01 #Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 #Python
You might like
php配合jquery实现增删操作具体实例
2013/12/12 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
动态添加option及createElement使用示例
2014/01/26 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python网络编程学习笔记(四):域名系统
2014/06/09 Python
python 排序算法总结及实例详解
2016/09/28 Python
多版本Python共存的配置方法
2017/05/22 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
Python 如何创建一个线程池
2020/07/28 Python
美国智能家居专家:tink
2019/06/04 全球购物
如何写一个自定义标签
2012/12/28 面试题
青年志愿者活动总结
2014/04/26 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
2015年清明节活动总结
2015/02/09 职场文书
教师工作证明范本
2015/06/12 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
python图像处理 PIL Image操作实例
2022/04/09 Python
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript