如何提取网盘资源?自动解析分享链接的完整流程
采集到分享链接只是第一步,如果能让用户搜索到资源,还需要:解析分享链接,提取真实文件列表。
本文拆解:如何通过开发者工具拆解请求流程?如何识别失效、过期、删除等异常状态?如何用代码模拟请求,批量获取资源列表?所有内容基于网盘资源搜索项目实战。
拆解请求过程:用浏览器开发者模式分析接口
打开浏览器的开发者工具(F12),并打开 Network(网络)面板,并勾选 Preserve log(保存日志)选项,访问一个有效的夸克网盘分享链接,观察所有请求。
比如分析夸克网盘分享链接的关键请求:
请求 | 说明 |
---|---|
/token?pr=ucpro&fr=pc | 获取请求的 token,如果分享链接有提取码,需要传入提取码 |
/detail?pwd_id=%s&stoken=%s&pdir_fid=%s&_page=%s&pr=ucpro&fr=pc&force=0&_size=50&_fetch_total=1&_sort=file_type:asc,updated_at:desc | 获取资源详情和文件列表 |
分析请求的参数和响应特征:
获取 token 的请求(/token?pr=ucpro&fr=pc):
{
"pwd_id": "73a6c6b9fdd2",
"passcode": "",
"support_visit_limit_private_share": true
}
获取 token 的完整响应:
{
"status": 200,
"code": 0,
"message": "ok",
"timestamp": 1759476679,
"data": {
"subscribed": false,
"stoken": "NH6wHAexJ8c/ehtUr/MVfpFW/vdvHK4H1rw0S8Sgm6c=",
"share_type": 0,
"author": {
"member_type": "SUPER_VIP",
"avatar_url": "http://image.quark.cn/o/uop/1Ht08/;;0,uop/g/uop/avatar/a516a54248e629e7a3bddbc709441da8.jpg;3,160",
"nick_name": "欢蹦*跳的海豹"
},
"url_type": 1,
"expired_type": 1,
"expired_at": 4102416000000,
"title": "暴风圈"
},
"metadata": {
"_t_group": "0:_s_vp:1",
"_g_group": "2:_s_bp:1;1:_s_ap:0;0:_s_vp:1;3:_s_vtp:1;4:_s_wl:1"
}
}
识别异常情况:检测分享链接是否有效
不能只处理“成功”情况。必须能识别网盘分享链接的各种异常,比如:
- 带提取码的网盘分享链接
- 已过期的网盘分享链接
- 已被删除的网盘分享链接
- 已失效的网盘分享链接
- 已被取消的网盘分享链接
- 超多资源需要分页的网盘分享链接
比如夸克网盘已过期的资源,获取 token 时,响应的 status 为 404
{
"status": 404,
"code": 41019,
"message": "分享地址已过期",
"req_id": "95s416-278405697d8ed2",
"timestamp": 1759478943,
"metadata": {
"_t_group": "0:_s_vp:1",
"_g_group": "2:_s_bp:1;1:_s_ap:0;0:_s_vp:1;3:_s_vtp:1;4:_s_wl:1"
}
}
编写代码:模拟请求,获取完整文件列表
依旧推荐使用 Python requests、re、json、retrying(用于接口不稳定的情况下自动重试),开发效率会比较高。推荐每个网盘实现一个类,实现解析网盘分享链接的所有方法,以夸克网盘为例:
import requests, re, json
from retrying import retry
from urllib.parse import quote
class Quark(object):
def __init__(self):
self.session = requests.session()
self.apiHeaders = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
'accept': 'application/json;charset=UTF-8',
'origin': 'https://pan.quark.cn',
'referer': 'https://pan.quark.cn',
}
# 不需要提取码,强行传提取码也OK
def getToken(self, panId, pwd):
pass
def getShareInfo(self, url, pwd):
pass
def getDetail(self, pwd_id, stoken, pdir_fid='0', page=1):
pass
if __name__ == '__main__':
quark = Quark()
print(quark.getShareInfo('https://pan.quark.cn/s/5556d012da26', ''))
以下是夸克网盘完整类的代码(可根据实际情况进行调试和调整)
登录后,阅读剩余内容