Что я пытаюсь сделать: я пытаюсь автоматизировать процесс загрузки видео с YouTube с помощью определенного веб-сайта. Идея состоит в том, что веб-сайт дает мне источник видео, которое я ввел, и я загружаю его. Сайт: https://en.savefrom.net/1-youtube-video-downloader-4/. Вот поле ввода текста, определенное в HTML
:
<input type = "text" name = "sf_url" value = "" autofocus = "" placeholder = "Paste your video link here" onfocus = "if (this.value && this.select){this.select()}" id = "sf_url">
Я пытался:
import requests
payload = {"sf_url": "https://thewikihow.com/video_jNQXAC9IVRw&vl=en"}
response = requests.post("https://en.savefrom.net/1-youtube-video-downloader-4/", payload)
print(response.text)
Источник видео не указан в HTML
, не работает.
Вопрос 1: Как отправить данные в поле ввода с помощью POST-запроса? (как мне найти правильный ключ, пары значений и т. д.)
Вопрос 2: Как найти пары ключ-значение для POST-запроса?
Проведя около получаса поиска, я нашел способ получить ответ
Начало анализа(Код в конце):
сначала вы должны сделать запрос POST, используя этот формат
POST https://en.savefrom.net/savefrom.php
Accept: */*
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
cache-control: no-cache
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%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DjNQXAC9IVRw%26vl%3Den&sf_submit=&new=1&lang=en&app=&country=cn&os=Windows&browser=Chrome
убедитесь, что вы изменили параметр sf_url
на целевой URL YouTube
и тогда вы можете получить текст (под шифрованием), подобный этому
<html>
<head>
<meta name = "robots" content = "noindex">
</head>
<body>
<script type = "text/javascript">
(function () {
this._a = function (a, b, c, d, e) {
var f = Array.prototype.slice.call(arguments, 4);
return a ? b.apply(d, f) : c.apply(d, f)
};
this._b = function (a, b, c) {
return a.apply(b, Array.prototype.slice.call(arguments, 2))
};
this._c = function (a) {
return unescape(a)
};
this._d = function (a) {
return a.split("").reverse().join("")
};
this._e = function (a, i, j) {
a[i % a.length] = a.splice(j % a.length, 1, a[i % a.length])[0];
};
this._f = function (a, b) {
a = a.split(".");
for (var c = b, d; d = a.shift();) if (null != c[d]) c = c[d]; else return null;
return c
};
this._g = function (a) {
var b = typeof a;
if ("object" == b) if (a) {
if (a instanceof Array) return "array";
if (a instanceof Object) return b;
var c = Object.prototype.toString.call(a);
if ("[object Window]" == c) return "object";
if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) return "array";
if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) return "function"
} else return "null"; else if ("function" == b && "undefined" == typeof a.call) return "object";
return b
};
this._h = function (a) {
var b = parseInt(a);
if (isNaN(b)) return parseInt(a, 16);
return b;
};
this._i = function (d) {
for (var b = "", c = 0; c < d.length; c++) {
var a = d.charAt(c);
this.chars[a] && (a = this.chars[a]);
b += a
}
return b
};
this._j = function (a) {
var b = "", e, c, h, f, g, d = 0, a = a.replace(/[^A-Za-z0-9\+/\=]/g, "");
64 == this.key.length && (this.key += " = ");
for (a += ["", "== = ", "= = ", " = "][a.length % 4]; d < a.length;) e = this.key.indexOf(a.charAt(d++)), c = this.key.indexOf(a.charAt(d++)), f = this.key.indexOf(a.charAt(d++)), g = this.key.indexOf(a.charAt(d++)), e = e << 2 | c >> 4, c = (c & 15) << 4 | f >> 2, h = (f & 3) << 6 | g, b += String.fromCharCode(e), 64 != f && (b += String.fromCharCode(c)), 64 != g && (b += String.fromCharCode(h));
return b
};
this._k = function (a, b) {
b = a.length - b;
return a.substr(b) + a.substr(0, b)
};
this._l = function (a, b) {
var c = Array.prototype.slice.call(arguments, 1);
return function () {
var b = c.slice();
b.push.apply(b, arguments);
return a.apply(this, b)
}
};
this._m = function (a, b) {
return a.concat.apply(a, arguments)
};
this._n = function (a) {
eval(a)
};
this._o = function (d) {
for (var b = "", a = 0, c = c1 = c2 = 0; a < d.length;) c = d.charCodeAt(a), 128 > c ? (b += String.fromCharCode(c), a++) : 191 < c && 224 > c ? (c2 = d.charCodeAt(a + 1), b += String.fromCharCode((c & 31) << 6 | c2 & 63), a += 2) : (c2 = d.charCodeAt(a + 1), c3 = d.charCodeAt(a + 2), b += String.fromCharCode((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63), a += 3);
return b
};
this._p = function (a, b) {
[]["filter"]["constructor"](b).call(a);
};
this._q = function (a, b) {
var c = a;
a = b;
b = c
};
this._r = function (a, i, v) {
a[i] = v
};
$e = this;
var $d = "owg12wA72nal9UBC9UBC9UBt9UBO9UBron/honGF9UBt9UBrmUBrmUBrmUBt9UBfX3/1bO/N0OBlZ6qjowmdXC/nowmj0SfsS70BoraMVrbMYURMTcRMRONy2Cm1B3eBXOgBo3RikOfsS7qjowm103NnkcRMV3B5kFqG9UBrm1BO9UBUZ3eBkF51ow0BkFehX1RMTrgMTnAd03YFS7fsS7h72nNdZ6ghX3/1bO/N0OBlZ6RjkF5FowXd03llS7YFS7asS7hsS7bsS7Gi03/nonGhoFbsS7asS7H1S7DsS7asS7ghX3/1bO/N0OBlZ6RjkF5FowXd03asS70jonaBEFfsS7asS70BoraMVrbMYURMTvRy2raMTraMYybMTraMYybMTraMVrgMTcRMYFIdkcRMYFRik35l9UBG9UBrE3559UBCowllS7Y1S7bsS7bsS7asS7H1S7asS7mDoCasS7Rd0FllS7YFS7llS7hsS7g12n91oFgd9UBz9UBCowllS7Y1S7hsS7fsS7IiknllS7llS7HFS7YFS7hsS7R72nfsS7W1kF51oraMYybMTraMYybMTraMYybMTraMVrgMTnN7EFH1S7g12n91oFgdHUBsmUBG9UBMoFRyEURMRrRMR1RMYF/N0CN1b201b1RMYcRMYFqio3BDoyBD0C5honqCXOqrZ3B72CahRFey03/F2raMVrgMVrgMTcRMYybMY3IiZ3l1S7RsS7G50URMRrRMY3IiZ3l1S7RsS7G1ZURMRrRMVURMV1gUZURMTrgMVURMVFR1ZURMRrRMTUaHSrgMVURMRnqBkFgjkwRsS7x7S7HiS7HFS7RsS7gz9nGiSUbGSnmMSUgt9UNr0Ubt9ngr01Bio197gU570URMTrgMVURMV3BAX3mjN30howRsS7x7S7HFS7RsS7RsS7l1S7RsS7g12CI10URMRrRMVURMYUmsxURMTrgMYF5N0OenkURMR3ByowX79UBHmUBs9UBMk3mBkFRsS7YFS7l1S7RsS7RyEF579UBUGUBO9UNtScbHmUBs9UBM0v/12nIB0nRsS7x7S7RsS7fH9URMTrgMVURMRn5y2wRsS7x7S7B1E35norgMVURMR3/yoF5jN3q79UBUGUBMXOId0nl1S7RsS7eBknNd0URMRrRMVURMYUms9URMTrgMVURMTvmBk35i2ORs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",
$b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", $c = {
"R": "A",
"A": "R",
"r": "a",
"a": "r",
"b": "n",
"n": "b",
"5": "u",
"u": "5",
"9": "8",
"8": "9",
"e": "x",
"x": "e",
"y": "P",
"P": "y",
"7": "Y",
"Y": "7",
"q": "m",
"m": "q",
"o": "+",
"+": "o",
"G": "p",
"p": "G",
"c": "/",
"/": "c",
"f": "F",
"F": "f",
"Z": "T",
"T": "Z",
"d": "4",
"4": "d",
"M": "w",
"w": "M",
"j": "V",
"V": "j",
"i": "l",
"l": "i",
"k": "U",
"U": "k",
"L": "B",
"B": "L",
"K": "O",
"O": "K",
"W": "2",
"2": "W",
"C": "D",
"D": "C",
"h": "s",
"s": "h",
"6": "t",
"t": "6",
"1": "H",
"H": "1",
"z": "0",
"0": "z",
"N": "3",
"3": "N",
"X": "J",
"J": "X",
"Q": "S",
"S": "Q",
"I": "v",
"v": "I",
"g": "E",
"E": "g"
};
var $k = _i.call({chars: $c}, $b);
var $a = _j.call({key: $k}, "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");
this.$d = $d;
this.$b = $b;
this.$c = $c;
this.$k = $k;
this.$a = $a;
$a = _c($a);
$a = _o($a);
_p.apply($e, [$e, $a]);
})();
</script>
</body>
</html>
если вы зайдете на эту страницу сейчас, вы ничего не увидите
таким образом, мы должны расшифровать этот текст
ответ скрыт в последних нескольких строках этого кода
так
...
$a = _c($a);
$a = _o($a);
...
так что в этом случае _c($a)
— это функция расшифровки, а _o($a)
— функция шифрования.
а в другом случае код может понравиться
...
$d = _e($d);
$d = _j($d);
...
поэтому функция расшифровки в этом случае _e($d)
, _j($d)
— шифрование
таким образом, в этом случае, после того, как мы используем _c($a)
в консоли, результирующий текст представляет собой расшифрованный текст, подобный этому
(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|147\.135\.223\.128|(?: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.show({"id":"jNQXAC9IVRw","cipher":false,"meta":{"title":"Me at the zoo","source":"https://thewikihow.com/video_jNQXAC9IVRw","duration":"0:19","tags":"me at the zoo,jawed karim,first youtube video","subtitle":{"token":"cfcb94426152cf59cb4139fff33ac957","language":["en"]}},"thumb":"https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg","itags":["18","133","140","160","242","249","250","251","278","394","395"],"video_quality":["240","144"],"url":[{"url":"https://r2---sn-2uuxa3vh-230e.googlevideo.com/videoplayback?expire=1610272446&ei=Xnr6X4GRE7HJ4-EP2_aluAE&ip=36.68.35.229&id=o-AJmp6N02GLwhuSs8TgmiMVrSs0PH0SPhFwrj_J0gq8hZ&itag=18&source=youtube&requiressl=yes&mh=VD&mm=31%2C29&mn=sn-2uuxa3vh-230e%2Csn-npoe7nek&ms=au%2Crdu&mv=m&mvi=2&pl=21&initcwndbps=306250&vprv=1&mime=video%2Fmp4&ns=yCO9T2W7YMUD3s7rLaJgvE4F&gir=yes&clen=790527&ratebypass=yes&dur=18.993&lmt=1524502661914999&mt=1610250510&fvip=2&c=WEB&n=6JAfI9JZ12N5Iw&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AOq0QJ8wRgIhAIScJy8-hGMBklAiO5RLNTQzefnRw44uda_t_x0Ak9NGAiEA9dz6yqVB-4qOInY8EUOFYWwsqWNu_qlDcRNf3FfgpnM%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgIMdxrO7Sxk4mK9upDOC32ZGI22mten0zM04v3YsE4DICICQ5qvWidCywY0kTMCf4kFIWY73pz8_Z55X6tuGDjMUm","name":"MP4","subname":"240","info_url":"https://r2---sn-2uuxa3vh-230e.googlevideo.com/videoplayback?expire=1610272446&ei=Xnr6X4GRE7HJ4-EP2_aluAE&ip=36.68.35.229&id=o-AJmp6N02GLwhuSs8TgmiMVrSs0PH0SPhFwrj_J0gq8hZ&itag=18&source=youtube&requiressl=yes&mh=VD&mm=31%2C29&mn=sn-2uuxa3vh-230e%2Csn-npoe7nek&ms=au%2Crdu&mv=m&mvi=2&pl=21&initcwndbps=306250&vprv=1&mime=video%2Fmp4&ns=yCO9T2W7YMUD3s7rLaJgvE4F&gir=yes&clen=790527&ratebypass=yes&dur=18.993&lmt=1524502661914999&mt=1610250510&fvip=2&c=WEB&n=6JAfI9JZ12N5Iw&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AOq0QJ8wRgIhAIScJy8-hGMBklAiO5RLNTQzefnRw44uda_t_x0Ak9NGAiEA9dz6yqVB-4qOInY8EUOFYWwsqWNu_qlDcRNf3FfgpnM%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgIMdxrO7Sxk4mK9upDOC32ZGI22mten0zM04v3YsE4DICICQ5qvWidCywY0kTMCf4kFIWY73pz8_Z55X6tuGDjMUm","type":"mp4","ext":"mp4","downloadable":false,"quality":"240","audio":false,"no_audio":false,"itag":"18","filesize":790527,"attr":{"title":"video format: 240","class":""},"info_token":"ba32c5ee6d3f072d5203154e9715df83"}],"hosting":101,"srv":"s36","sd":null,"hd":null});;
window.parent.sf.enableElement('sf_submit', true);
success=true;
}
}
}
catch(err){}
del();
if (!success)
{
var alt = '';
if (alt) alert(alt);
}
}
try {
if (typeof navigator.permissions != 'undefined') {
navigator.permissions.query({name:'notifications'}).then(function(permissionStatus) {
if (Notification.permission === 'denied' && permissionStatus.state === 'prompt') {
} else {
showResult();
}
});
} else {
showResult();
}
}
catch (err) {
showResult();
}
})();
И вы можете видеть, что URL-адрес в этом фрагменте (около строки 22) является нашим целевым URL-адресом.
...
,"url":[{"url":"https://r2---sn-2uuxa3vh-230e.googlevideo.com/videoplayback?expire=1610272446&ei=Xnr6X4GRE7HJ4-EP2_aluAE&ip=36.68.35.229&id=o-AJmp6N02GLwhuSs8TgmiMVrSs0PH0SPhFwrj_J0gq8hZ&itag=18&source=youtube&requiressl=yes&mh=VD&mm=31%2C29&mn=sn-2uuxa3vh-230e%2Csn-npoe7nek&ms=au%2Crdu&mv=m&mvi=2&pl=21&initcwndbps=306250&vprv=1&mime=video%2Fmp4&ns=yCO9T2W7YMUD3s7rLaJgvE4F&gir=yes&clen=790527&ratebypass=yes&dur=18.993&lmt=1524502661914999&mt=1610250510&fvip=2&c=WEB&n=6JAfI9JZ12N5Iw&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AOq0QJ8wRgIhAIScJy8-hGMBklAiO5RLNTQzefnRw44uda_t_x0Ak9NGAiEA9dz6yqVB-4qOInY8EUOFYWwsqWNu_qlDcRNf3FfgpnM%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgIMdxrO7Sxk4mK9upDOC32ZGI22mten0zM04v3YsE4DICICQ5qvWidCywY0kTMCf4kFIWY73pz8_Z55X6tuGDjMUm","name":"MP4",
...
НАКОНЕЦ-ТО я допилил!!!(может через 4 часа)
вот мое решение (почти 100 строк)
# -*- coding: utf-8 -*-
# @Time: 2021/1/10
# @Author: Eritque arcus
# @File: Youtube.py
# @License: MIT
# @Environment:
# - windows 10
# - python 3.6.2
# @Dependence:
# - jsdom in npm(windows also can use)
# - requests, execjs, re, json in python
import requests
import execjs
import re
import json
def gethtml(url):
# set the headers or the website will not return information
# the cookies in here you may need to change
headers = {
"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=030393eb0776d20d0975f99b523a70d4; x-requested-with=; "
"PHPSESSUD=islilfjn5alth33j9j8glj9776; _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"}
# set the parameter, we can get from chrome
kv = {"sf_url": url,
"sf_submit": "",
"new": "1",
"lang": "en",
"app": "",
"country": "cn",
"os": "Windows",
"browser": "Chrome"}
# do the POST request
r = requests.post(url = "https://en.savefrom.net/savefrom.php", headers=headers,
data=kv)
r.raise_for_status()
# get the result
return r.text
if __name__ == '__main__':
# target(youtube address) url
url = "https://thewikihow.com/video_YPvtz1lHRiw"
# get the target text
reo = gethtml(url)
# Remove the code from the head and tail (we need the javascript part, information store with encryption in js part)
reo = reo.split("<script type=\"text/javascript\">")[1].split("</script>")[0]
# override the alert function, because in the code there has one place using
# and we cannot do the alerting in execjs(it is meaningless) however, if we donnot override, the code will raise a error
reo = reo.replace("(function(){", "(function(){\nthis.alert=function(){};")
# split each line(help us find the decrypt function in last few line)
reA = reo.split("\n")
# get the depcrypt function
name = reA[len(reA) - 3].split(";")[0] + ";"
# add jsdom into the execjs because the code will use(maybe there is a solution without jsdom, but i have no idea)
addition = """
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
"""
# use execjs to execute the js code, and the cwd is the result of `npm root -g`(the path of npm in your computer)
ct = execjs.compile(addition + reo, cwd=r'C:\Users\19308\AppData\Roaming\npm\node_modules')
# do the decryption
text = ct.eval(name.split(" = ")[1].replace(";", ""))
# get the result in json
result = re.search('show\((.*?)\);;', text, re.I | re.M).group(0).replace("show(", "").replace(");;", "")
# use `json` to load json
j = json.loads(result)
# the selection of video(in this case, num=1 mean the video is
# - 360p known from j["url"][num]["quality"]
# - MP4 known from j["url"][num]["type"]
# - audio known from j["url"][num]["audio"]
num = 1
downurl = j["url"][num]["url"]
# do some download
# thanks :)
# - EOF -
И будьте осторожны с этим (в https://en.savefrom.net/terms.html #Ваше использование веб-сайта и услуг#)
Вы соглашаетесь не осуществлять доступ (или пытаться получить доступ) к Услугам любыми способами, кроме средств, предоставляемых SaveFrom или его авторизованными партнерами. Вы соглашаетесь не осуществлять доступ (или пытаться получить доступ) к Услугам с помощью автоматизированных средств и не будете заниматься какой-либо деятельностью, которая мешает или нарушает работу Услуг (или серверов и сетей, которые подключены к Услугам).
Для этого я пишу уроки на китайском, здесь