[ 算法 ] 视频平台请求参数中的校验算法,破解实践记录

前言

我作为一名假视频剪辑师,优质的视频素材是必不可少的,但各大平台的视频资源又不能下载,无奈之下只能自己动手写一些小程序把视频下载。其过程中有一个大问题,每个平台都有自己防止爬取视频真实链接的校验码一类的东西,需要费时、费力、费眼和强制性地学习大佬的手段,才能得以破解。

我将一些平台破解方法记录在这里,仅供学习参考。

爱奇艺

爱奇艺 sign 破解

******* 破解实例 *******
任务简介: 采集爱奇艺作者作品列表
目标作者: https://www.iqiyi.com/u/1335206107/videos
作者作品列表API: https://iqiyihao.iqiyi.com/iqiyihao/entity/get_videos.action
API 请求方式: GET
API 参数简介
agenttype       默认值 118
agentversion    默认值 10.8.5 可能会变化,因为是版本号
authcookie      在Cookie中P00001的值
dfp             在Cookie中__dfp的值不带@和@后面的值
fuid            在作者链接中https://www.iqiyi.com/u/【fuid】/videos
m_device_id     默认值 e7dc7787eac530939a3455c8583129db
page            作品列表页数
size            作品列表每页显示数量
sign            校验值,下面会讲解怎么生成
timestamp       毫秒级时间
callback        回调函数

python

import hashlib
import time

def getParameters(parameters={}):
    """转换成URL参数"""
    paramList = ["{0}={1}".format(i,parameters[i]) for i in parameters.keys()]
    urlParam = "&".join(paramList)
    return urlParam

def getVideosActionSign(authcookie="",dfp="",fuid="",timestamp="",page=1,size=28):
    """生成作者作品列表API的Sign"""
    # 生成Sign的必要参数,以及正确顺序
    parameters = {
        "agenttype":118,
        "agentversion":"10.8.5",
        "authcookie":authcookie,
        "dfp":dfp,
        "fuid":fuid,
        "m_device_id":"e7dc7787eac530939a3455c8583129db",
        "page":page,
        "size":size,
        "timestamp":timestamp
    }
    n = getParameters(parameters)
    e = "iqiyihao.iqiyi.com/iqiyihao/entity/get_videos.action"
    t = "GET"
    i = "{0}{1}?{2}{3}".format(t,e,n,"NZrFGv72GYppTUxO")
    sign = hashlib.md5(i.encode(encoding='UTF-8')).hexdigest()
    return sign

if __name__ == "__main__":
    print(getVideosActionSign(
        authcookie="9dm3ZVwE5ttzy48UBZym2sWm1tPCdIWtFJtFOIhDEm1jfi2m2rt084DRnE7Ns8cQ2fqC4YDdc",
        dfp="a136a1678e9a174e95881d7813dfce8dffcbef2327e33f992d9a633105024fe356",
        fuid="1335206107",
        timestamp="1596258179226",
        page=1,
        size=28
        ))
    # 输出:a09eba7d825a4292c8b218846a752183