我们平时会在一些浏览器里看番剧和电视剧,但是这些很少有网站会提供下载功能,当我们乘坐长途火车时,一部保存到本地的番剧既可以缓解旅途的无聊也不用因网络不稳定而引发高血压,下面我将以一个事例和大家讨论如何批量从某网站下载一部番剧(重点是下载思路,此事例只做抛砖引玉,期待各位更好的方案)。


!!!警告:仅为学习交流,切勿用于不正确途径


这部番剧mygo作为本次我们要下载的番剧,目的是批量下载整部13集。

点击播放按钮抓取网络请求,点击视频请求

是一个get请求,观察url我们发现事情不太妙,url内包含sign与t,想必是用作验证的,如果我们想通过此类url批量下载视频获取sign与t便是一件十分困难的事

不要慌张,我们先直接访问这个url看看能不能正常打开视频

很好视频可以正常访问。

原url:https://xxxxxx/2023/2023%E5%B9%B47%E6%9C%88/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_%E7%AC%AC01%E9%9B%86.mp4?sign=66cc6c75020584700fb1f949b20bda4d&t=1721196255

UrlDecode:https://xxxxxx/2023/2023年7月/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_第01集.mp4?sign=66cc6c75020584700fb1f949b20bda4d&t=1721196255

这个url规律十分明显,尝试删除sign与t直接访问url:https://xxxxxx/2023/2023年7月/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_第01集.mp4

访问失败

将01集换成02集不改变sign与t,即url:https://xxxxxx/2023/2023年7月/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_第02集.mp4?sign=66cc6c75020584700fb1f949b20bda4d&t=1721196255

再次访问失败,可以看出sign与t和集数有对应关系

分析视频url的get请求返回的值

尝试在网页源代码中全局搜索关键词“sign”

不太乐观,经过长时间的阅读源代码我并未在js文件中找到sign获取方式,决定改变思路,观察视频url发起程序

MacPlayer.Html = '<iframe border="0" src="/addons/dp/player/index.php?key=0&id=' + MacPlayer.Id + '&from=' + MacPlayer.PlayFrom + '&url=' + MacPlayer.PlayUrl + '" width="100%" height="100%" marginWidth="0" frameSpacing="0" marginHeight="0" frameBorder="0" scrolling="no" vspale="0" noResize></iframe>';
MacPlayer.Show();

查看发起程序源代码可以看出发起程序并不包含sign并且规律明显,同一部番剧发起程序区别仅在集数不同

我决定先赌一波,直接对发起程序发送get请求

# python
import requests

url = 'https://xxxxxx/addons/dp/player/dp.php?key=0&from=m2&id=1372&api=&url=https://video.31dm.com/2023/2023%E5%B9%B47%E6%9C%88/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_%E7%AC%AC01%E9%9B%86.mp4&jump='
x = requests.get(url)
print(x.text)

很好,直接返回了带sign的url,下面就可以进行批量下载了

# python
import requests, json

for i in range(13):
    i = i + 1
    if i < 10:
        url = f'https://xxxxxx/addons/dp/player/dp.php?key=0&from=m2&id=1372&api=&url=https://video.31dm.com/2023/2023%E5%B9%B47%E6%9C%88/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_%E7%AC%AC0{i}%E9%9B%86.mp4&jump='
    else:
        url = f'https://xxxxxx/addons/dp/player/dp.php?key=0&from=m2&id=1372&api=&url=https://video.31dm.com/2023/2023%E5%B9%B47%E6%9C%88/BanG_Dream_Its_MyGO/BanG_Dream_Its_MyGO_%E7%AC%AC{i}%E9%9B%86.mp4&jump='
    x = requests.get(url)
    with open('geturl.txt','w', encoding='utf-8') as fp:
        fp.write(x.text)
    with open('geturl.txt', 'r', encoding='utf-8') as file:
        lines = file.readlines()
        print(lines[25].split('"')[-2])
        url_video = lines[25].split('"')[-2]
        name = url_video.split('?')[0].split('/')[-1]
        print(name)

    jsonreq = json.dumps({'jsonrpc': '2.0', 'id': 'qwer',
                        'method': 'aria2.addUri',
                        'params': [[url_video]]
                        })
    c = requests.post('http://localhost:16800/jsonrpc', jsonreq)
    print(c.text)

大功告成。