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中编写ORM框架的入门指引
Apr 29 Python
Python中字符串对齐方法介绍
May 21 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
从django的中间件直接返回请求的方法
May 30 Python
Python IDLE清空窗口的实例
Jun 25 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
Python运行DLL文件的方法
Jan 17 Python
Python timeit模块原理及使用方法
Oct 10 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下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
Python查找相似单词的方法
2015/03/05 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
SQL SERVER面试资料
2013/03/30 面试题
外国语学院毕业生自荐信
2013/10/28 职场文书
优秀员工获奖感言
2014/03/01 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python