如何提取网盘资源?自动解析分享链接的完整流程

采集到分享链接只是第一步,如果能让用户搜索到资源,还需要:解析分享链接,提取真实文件列表

本文拆解:如何通过开发者工具拆解请求流程?如何识别失效、过期、删除等异常状态?如何用代码模拟请求,批量获取资源列表?所有内容基于网盘资源搜索项目实战。

拆解请求过程:用浏览器开发者模式分析接口

打开浏览器的开发者工具(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', ''))

以下是夸克网盘完整类的代码(可根据实际情况进行调试和调整)

登录后,阅读剩余内容