用python做youtube自动化下载器 思路

根据 savefrom条例
本实例及教程只用于学习交流用,权利归savefrom.net所有

0. 思路

使用python从savefrom平台上获取指定youtube视频下载链接进行下载,不过savefrom的数据是用javascript加密的,这也是难度所在
本教程主要介绍制作思路,下一篇会介绍制作python
本教程根据stakoverflow 回答制作

1.准备

i.savfrom.net

一个网站可以免费下载youtube视频

2. 探索并规划获取方式

i.总览

打开https://en.savefrom.net/1-youtube-video-downloader-4/可以看见页面主要就一个from表单输入框和提交按钮组成
video

ii. 获取该网页取到下载url的请求

在chrome或其他浏览器按F12打开开发者控制台,点开Network选项卡
Network
接下来模拟正常的用户流程,在输入框输入一个youtube视频地址,比如这个https://www.youtube.com/watch?v=IjJmTeBSEzU,然后点击Download提交url获取下载url,然后我们可以发现下面已经出现了下载链接。然后我们在network选项卡内可以发现一个特殊的申请saveform.php(如果没发现可以多提交几次,就会发现每次提交都有这个请求或者看html里的form元素的src地址就是savform.php)
saveform
我们就可以确定关于下载链接会出现在这个请求的返回值内。

iii. 在本地获取请求

在本地用IDE的http工具或者python构建出post请求代码,笔者用的是pycharm的httpClient(按2下左Shift,然后输入Tools,然后回车进入菜单,然后点击httpClient下的第一个)
httpclient
把请求里第二个headers的内容全部复制然后格式化然后构建post请求
headers
然后把下面的formdata的参数也复制进来,记得和headers换行
formdata

POST https://en.savefrom.net/savefrom.php
cache-Control: no-cache
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
content-type: application/x-www-form-urlencoded
cookie: lang=en; country=CN; uid=fd94a82a406a8dd4; sfHelperDist=72; reference=14; clickads-e2=90; poropellerAdsPush-e=63; promoBlock=64; helperWidget=92; helperBanner=42; framelessHdConverter=68; inpagePush2=68; popupInOutput=9; _ga=GA1.2.799702638.1610248969; _gid=GA1.2.628904587.1610248969; PHPSESSID=4aojkm49oj7h3de65pekqii337; x-requested-with=; PHPSESSUD=122fb7e10af37e23d99e896fd188744f; _gat_helperWidget=1; _gat_inpagePush2=1
origin: https://en.savefrom.net
pragma: no-cache
referer: https://en.savefrom.net/1-youtube-video-downloader-4/
sec-ch-ua: "Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"
sec-ch-ua-mobile: ?0
sec-fetch-dest: iframe
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36

sf_url=https://www.youtube.com/watch?v=YPvtz1lHRiw&sf_submit=&new=1&lang=en&app=&country=cn&os=Windows&browser=Chrome

如果配置没错,这个时候你运行后会显示出和在浏览器里一样的结果,然后可以发现参数里的sf_url就是需要下载的youtube地址

iv.解析请求结果

把取到的结果保存在本地然后在浏览器打开保存的本地文件,然后弹出一个弹窗后会发现这个页面什么都没有,但其实如果你在console输入window会发现有很多变量和函数,其中就有我们需要的加密后的url和解密函数
window
经过弹窗提示我们可以发现是这个html的js发现了我们不在他的网站上然后删除了显示下载url的代码所以我们才什么都看不到,打开source选项卡或者用IDE打开源代码查看
sources
扫一下这个源代码,我们可以看见一些加密解密函数,被加密的乱码信息,哈希对照表,和一些奇怪的赋值操作,如图
code
我们可以看见,js部分由一个大闭包组成

  • 第3行到第9行是声明函数
  • 第10行是给$b赋值this也就是window
  • 第11到第13行是赋值3个变量
  • 第14,15行是对变量执行一些操作,这个也是我们重点关注的,毕竟执行加密,解密方法只可能在这

第14,15行格式化后如下

this.$d = $d;
this.$a = $a;
this.$e = $e;
this.$k = $k;
this.$c = $c;
$c = _q($c);
$c = _b($c);
_m($b, $c);

去掉前5行没有意义的变量互换值,加密解密函数存在的范围就在最后3行

$c = _q($c);
$c = _b($c);
_m($b, $c);

然后开始一个个试
先在console里输入第一行
console
然后就出现了明文,所以我们就确定这个是我们需要的解密函数
接下来输入第二行
console2
发现出现了和上面一模一样的明文,所以这个也是解密函数
接下来输入第三行
发现这个执行了那段代码,这个应该是执行函数,所以我们现在就找到了解密函数位于js部分的最后几行

v.解析解密后的结果

console里用解密函数解密出的结果复制出来会得到一个JavaScript脚本

(function(){
   
function del(){
   while(document.body.firstChild){
   document.body.removeChild(document.body.firstChild);}};
if(window.location.hostname.search(/(?:^|\.|@)(savefrom\.net|sfrom\.net|savefrom\.com\.au|51\.159\.57\.158|(?:fe\d*|test)-front\.sf-apps\.com)$/i) == -1)
{
   
alert('Please go to http://savefrom.net/ to get direct links');
del();
return;
}

function showResult(){
   
var success = false;
try
{
   
var d = window.parent.document;
if(d && d.getElementById)
{
   
var e = d.getElementById('sf_result');
if(e && e.innerHTML)
{
   
window.parent.sf.finishRequest(true);;
e.innerHTML = '';
window.parent.sf.videoResult.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值