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的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
vscode 远程调试python的方法
Dec 01 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
如何在python中写hive脚本
Nov 08 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 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
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
php实现微信模板消息推送
2018/03/30 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
Python Property属性的2种用法
2015/06/21 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python里dict变成list实例方法
2019/06/26 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
人事主管的岗位职责
2013/11/16 职场文书
五一口号
2014/06/19 职场文书
新闻传播专业求职信
2014/07/22 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
导游词之山海关
2019/12/10 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis