如何使用python中的请求通过post请求输入数据

2024-04-27 05:00:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试做的事情:我正在尝试使用特定网站自动下载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 &amp;&amp; this.select){this.select()}" id="sf_url">

我试过了

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)

视频源不包括在HTML中,它不工作

问题1:如何通过POST请求将数据发送到输入字段?(如何找到正确的键、值对等)

问题2:如何查找POST请求的键值对


Tags: texthttpsurl视频netyoutubevalue网站
1条回答
网友
1楼 · 发布于 2024-04-27 05:00:20

经过近半个小时的搜索,我终于找到了答案

分析开始(代码在末尾):

首先,您应该使用此格式发出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参数更改为目标youtube url

然后你可以得到这样一个文本(加密)

<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:\/\/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();
}
})();

您可以看到这个片段中的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://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 -

而且,要注意这一点(在使用网站和服务时)

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).

相关问题 更多 >