问题
What I'm trying to do: I am trying to automize the process of downloading YouTube videos using a particular website. The idea is that the website yields me the source of the video I had input and I download it. The website: https://en.savefrom.net/1-youtube-video-downloader-4/. Here is the input text field defined in the 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">
I tried:
import requests
payload = {"sf_url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&vl=en"}
response = requests.post("https://en.savefrom.net/1-youtube-video-downloader-4/", payload)
print(response.text)
The source of the video is not included in the HTML
, it does not work.
Question 1: How do I send data to an input field with a POST request? (how do I find the proper key, value pairs etc.)
Question 2: How do I find the key-value pairs for a POST request?
回答1:
After doing near half an hour of searching, I got the way to get the answer
Analysis start(The code is in the end):
at first you should make a POST request use this format
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
make sure you change the sf_url
parameter to your target youtube url
and then you can get a text(under encryption) like this
<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>
if you enter this page now, you will see nothing
thus, we should decrypt this text
the answer is hided in last few line of this code
like this
...
$a = _c($a);
$a = _o($a);
...
so in this case, the _c($a)
is the decrypt function and _o($a)
is the encrypt one
and in other case, the code may like this
...
$d = _e($d);
$d = _j($d);
...
so the decrypt function in this case is _e($d)
, _j($d)
is encryption
thus, in this case, after we use the _c($a)
in the console, the result text is the decrypt text like this
(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:\/\/www.youtube.com\/watch?v=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();
}
})();
And you can see the url in this fragment(near the line 22) is our target 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",
...
FINALLY, I finish it!!!(maybe after 4 hours)
here is my solution(uh nearly 100 line)
# -*- 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://www.youtube.com/watch?v=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 -
And, be careful about this(in https://en.savefrom.net/terms.html #Your Use of the Website and Services#)
You agree not to access (or attempt to access) the Services by any means other than through the means provided by SaveFrom or its authorized partners. You agree not to access (or attempt to access) the Services by way of automated means and that you will not engage in any activity that interferes with or disrupts the Services (or the servers and networks which are connected to the Services).
来源:https://stackoverflow.com/questions/65443895/how-to-input-data-via-a-post-request-using-requests-in-python