Как вводить данные через почтовый запрос, используя запросы в 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://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-запроса?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проведя около получаса поиска, я нашел способ получить ответ

Начало анализа(Код в конце):

сначала вы должны сделать запрос 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 или его авторизованными партнерами. Вы соглашаетесь не осуществлять доступ (или пытаться получить доступ) к Услугам с помощью автоматизированных средств и не будете заниматься какой-либо деятельностью, которая мешает или нарушает работу Услуг (или серверов и сетей, которые подключены к Услугам).

Для этого я пишу уроки на китайском, здесь

Eritque arcus 11.01.2021 13:15

Другие вопросы по теме