Russian Qt Forum

Qt => Работа с сетью => Тема начата: rudireg от Июль 14, 2019, 15:43



Название: Как выполнить JS код на QT
Отправлено: rudireg от Июль 14, 2019, 15:43
Привет. Использую Qt5.
Пишу консольную программу парсер сайта https://www.vseinstrumenti.ru/
Использую QNetworkAccessManager.
На сайте стоит защита, при заходе на их страницу они отправляют на сайт прокладку например по адресу
https://ohio8.vchecks.me/share/sWWtMUH7cqM1?sid=2588&scheme=https&host=www.vseinstrumenti.ru&uri=%2f%3futm_referrer%3d&t=1563107574249&sad=v%2fuQ1wLA%3d%3d&uid=s7RKQDx4LDWnaSFq&uct=1563107574249&kct=0&m=2&ver=7&flags=2176&ua=776215760362579538&v=5F5kK4Iq9WBf_xq6ZAsJQQ
Там идет выполнение JS кода, а именно выполняется JS код который генерирует что-то вроде секрета с которым идет перенаправление назад на сайт  https://www.vseinstrumenti.ru/
И таким образом проверка пройдена.

Вопрос №1, почему один и тот же С++ код, скомпилированный на разных ОС, а именно Windows и Linux (Ubuntu)
отдает разный ответ при переходе по выше указанной ссылке.
Разница ответов (Response) в том, что если программа исполняется в Linux то Response НЕ содержит JS функцию отвечающую за генерацию секрета, вместо нее в JS код уже есть готовый результат её генерирования. А вот в Windows наоборот, нет готового секрета, но есть функция которая этот секрет генерирует.
Как такое вообще возможно... код же на с++ один и тот же...

Вопрос № 2
Как в QT можно выполнить JS код полученный в Response  учитывая что программа консольная.
QScriptEngine не помог, видимо JS код для него слишком сложный.


Доп инфо
Так выглядит Response для Linux
Код:
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta http-equiv="refresh" content="10;URL=/ciez2a">
</head>
<body>
  <script type="text/javascript">
    var ipp = {
setCookie:function()
{
document.cookie="ipp_key=v1563109400764/v3394bd940fb9f20d860d271638eca2afa04ab3/LBgoFoc1kjRqgOKpylxeJA==; path=/;";
document.cookie="ipp_uid=1563109400764/XmY5i8ip0xP6CnMe/luPzUft7syB0zcwZ45odDg==; expires=Tue, 31 Dec 2030 23:59:59 GMT; path=/;";
document.cookie="ipp_uid1=1563109400764; expires=Tue, 31 Dec 2030 23:59:59 GMT; path=/;";
document.cookie="ipp_uid2=XmY5i8ip0xP6CnMe/luPzUft7syB0zcwZ45odDg==; expires=Tue, 31 Dec 2030 23:59:59 GMT; path=/;";
},
makeUrl:function(url)
{
url += "fa821dba_ipp_key=v1563109400764%2fv3394bd940fb9f20d860d271638eca2afa04ab3%2fLBgoFoc1kjRqgOKpylxeJA%3d%3d" + "&" + "fa821dba_ipp_uid=1563109400764%2fXmY5i8ip0xP6CnMe%2fluPzUft7syB0zcwZ45odDg%3d%3d" + "&" + "fa821dba_ipp_uid1=1563109400764" + "&" + "fa821dba_ipp_uid2=XmY5i8ip0xP6CnMe%2fluPzUft7syB0zcwZ45odDg%3d%3d";
return url;
}
};

    location.href=ipp.makeUrl("https://www.vseinstrumenti.ru/search_main.php?what=%D0%90%D0%B4%D0%B0%D0%BF%D1%82%D0%B5%D1%80+1/2%22+%D0%A5+8MM+JTC+/1&utm_referrer=https%3a%2f%2fwww.vseinstrumenti.ru%2f&");
  </script>
</body>
</html>

А так выглядит Rsponse для Windows
https://codepen.io/rudireg/pen/GbaQRX





Название: Re: Как выполнить JS код на QT
Отправлено: rudireg от Июль 16, 2019, 23:22
Ответа не нашел...
Но удивительно то, что для разных ОС один и тот же код отдает разные ответы.
Решил запускать через docker контейнер версию Linux, так как выполнение кода в Linux решает проблему с JS


Название: Re: Как выполнить JS код на QT
Отправлено: kambala от Июль 17, 2019, 13:41
возьми любую программа для захвата сетевых пакетов (fiddler, Charles proxy, Wireshark) и посмотри какие запросы (все детали — заголовки и т.д.) отправляются из каждой ОС. Возможно, на каждой ОС разный User-Agent.


Название: Re: Как выполнить JS код на QT
Отправлено: rudireg от Июль 17, 2019, 22:00
возьми любую программа для захвата сетевых пакетов (fiddler, Charles proxy, Wireshark) и посмотри какие запросы (все детали — заголовки и т.д.) отправляются из каждой ОС. Возможно, на каждой ОС разный User-Agent.
User-Agent - передается в коде программы, он не может быть другим на разных ОС, QNetworkAccessManager его определяет.
Но вот по поводу остальных заголовков посмотреть можно.