Парсинг js страниц

  1. 3 г. назад

    По случаю крайних новаций в ЕГАИС возник сабжевый вопрос. Ранее УТМ отдавал статическую html страницу, ее можно было прочитать как текст, разобрать и вынуть все что нужно. В 4-я версии сделали страницу состояния на богомерзком js. Как ее парсить из 1с мне совершенно непонятно. Есть какие-нибудь идеи как решить задачку?

    Ответы: (8)
  2. Там не JSON?

  3. Там скрипт, который при выполнении в браузере генерит страницу.

    Ответы: (3) (5) (6)
  4. (2) А нельзя ее как-нибудь сгенерить, и готовый HTML пропарсить?

  5. qna.habr.com/q/727

  6. 01.06.2021 12:47:24 отредактировано andrewks

    ТеньД Там скрипт, который при выполнении в браузере генерит страницу.

    что значит "генерит"? наверняка ведь запросы к серверу идут, в ответах отдаётся либо готовый html-код, либо json, на основании данных которого скрипт уже составляет html-код

  7. (2) нужно посмотреть что делает js и переписать на 1с
    Или развернуть nodejs

    Ответы: (7) (13) (14)
  8. Курильщик нужно посмотреть что делает js и переписать на 1с

    Похоже наиболее подходящий способ. Спасибо любимому РАРу за наше счастливое детство.

  9. (0) Что за извращение? Зачем что-то парсить? Все делается намного проще, через API.

    Ответы: (9) (10)
  10. (8) Расшифруешь мысль?

    Ответы: (10)
  11. ТеньД (8) Расшифруешь мысль?

    Сперва объясни зачем ты пытаешься что-то парсить, коллега. Я как раз в алкогольной фирме работал одинесником, и делал там обмен данными с ЕГАИСом. Вообще даже мысли не было парсить HTML.

    Ответы: (11) (12)
  12. (10) У меня на 1с крутится мониторинг УТМов. Джоб ходит по УТМ, запрашивает страницу состояния, парсит и если с УТМ проблемы алертит кому надо.

    Ответы: (12)
  13. ТеньД (10) У меня на 1с крутится мониторинг УТМов. Джоб ходит по УТМ, запрашивает страницу состояния, парсит и если с УТМ проблемы алертит кому надо.

    Там же клиент-сервер. Со страницы отправляется запрос к серверу, приходит ответ в каком-то удобном машинном формате, не знаю какой щас в новой версии, xml или JSON. Потом страница считывает этот ответ, и рендерит что-то в человеческом виде. Вместо того чтобы парсить нарендеренный человеческий результат, тебе проще использовать машинный ответ от сервера. Он же специально предназначен для машинной обработки.

    Ответы: (13) (14)
  14. (12) Тоже самое написал Курильщик в (6). Придется раскопать код страницы и переписать мониторинг.

    На нашей работе не заскучаешь. Всегда найдется госструктура меняющая правила игры, а что потребителям "контента" придется тратить время и деньги подстраиваясь под их выдумки им пох.

    Ответы: (14)
  15. ТеньД (12) Тоже самое написал Курильщик в (6). Придется раскопать код страницы и переписать мониторинг.

    На нашей работе не заскучаешь. Всегда найдется госструктура меняющая правила игры, а что потребителям "контента" придется тратить время и деньги подстраиваясь под их выдумки им пох.

    Зачем раскопать код? Раскопай только данные, которые ходят между клиентом и сервером, это на порядок легче.

    Ответы: (15)
  16. webdev Раскопай только данные, которые ходят между клиентом и сервером, это на порядок легче.

    Они разве не по https ходят?

    Ответы: (16)
  17. ТеньД Они разве не по https ходят?

    По https, но на клиенте уже все расшифровано, и можно посмотреть.
    Страницу html в браузере можешь открыть?

    Ответы: (17)
  18. webdev Страницу html в браузере можешь открыть?

    Страницу я открыть могу:

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>УТМ</title>
      <base href="/app">
    
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="icon" type="image/x-icon" href="favicon.ico">
    
      <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->
      <!-- https://github.com/sockjs/sockjs-client/issues/439 fix: -->
      <script>
        if (global === undefined) {
          var global = window;
        }
      </script>
      <!-- https://github.com/aws/aws-amplify/issues/678 fix end-->
      <!-- https://github.com/sockjs/sockjs-client/issues/439 fix end-->
      <style type="text/css">
        body, html {
          height: 100%;
        }
        .app-loading {
          position: relative;
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          height: 100%;
        }
        .app-loading .spinner {
          height: 200px;
          width: 200px;
          animation: rotate 2s linear infinite;
          transform-origin: center center;
          position: absolute;
          top: 0;
          bottom: 0;
          left: 0;
          right: 0;
          margin: auto;
        }
        .app-loading .spinner .path {
          stroke-dasharray: 1, 200;
          stroke-dashoffset: 0;
          animation: dash 1.5s ease-in-out infinite;
          stroke-linecap: round;
          stroke: #d25851;
        }
        @keyframes rotate {
          100% {
            transform: rotate(360deg);
          }
        }
        @keyframes dash {
          0% {
            stroke-dasharray: 1, 200;
            stroke-dashoffset: 0;
          }
          50% {
            stroke-dasharray: 89, 200;
            stroke-dashoffset: -35px;
          }
          100% {
            stroke-dasharray: 89, 200;
            stroke-dashoffset: -124px;
          }
        }
      </style>
    <link rel="stylesheet" href="styles.d902a9b2bb8162233c3a.css"></head>
    <body>
      <app-root>
        <div class="app-loading">
          <div class="logo"></div>
          <svg class="spinner" viewBox="25 25 50 50">
            <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"/>
          </svg>
        </div>
      </app-root>
    <script src="runtime-es2015.c3fa1f92c77ebef4835b.js" type="module"></script><script src="runtime-es5.c3fa1f92c77ebef4835b.js" nomodule defer></script><script src="polyfills-es5.ad22168931326eec4d7d.js" nomodule defer></script><script src="polyfills-es2015.cad33774bce53cf6e2b1.js" type="module"></script><script src="scripts.07a635ddfc26da723016.js" defer></script><script src="main-es2015.cb1667b50459b741eff3.js" type="module"></script><script src="main-es5.cb1667b50459b741eff3.js" nomodule defer></script></body>
    </html>
    
    Ответы: (20)
  19. Это ни о чем, все в runtime-es2015.c3fa1f92c77ebef4835b.js уложено.
    Надо network снимать

    Ответы: (19) (21)
  20. (18) Скрипт вот такой:

    !function(e){function r(r){for(var n,c,f=r[0],u=r[1],i=r[2],d=0,p=[];d<f.length;d++)c=f[d],Object.prototype.hasOwnProperty.call(o,c)&&o[c]&&p.push(o[c][0]),o[c]=0;for(n in u)Object.prototype.hasOwnProperty.call(u,n)&&(e[n]=u[n]);for(l&&l(r);p.length;)p.shift()();return a.push.apply(a,i||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],n=!0,f=1;f<t.length;f++)0!==o[t[f]]&&(n=!1);n&&(a.splice(r--,1),e=c(c.s=t[0]))}return e}var n={},o={1:0},a=[];function c(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise(function(r,n){t=o[e]=[r,n]});r.push(t[2]=n);var a,f=document.createElement("script");f.charset="utf-8",f.timeout=120,c.nc&&f.setAttribute("nonce",c.nc),f.src=function(e){return c.p+""+({0:"common"}[e]||e)+"-es2015."+{0:"9f7f7a2784a4bc776014",2:"2ffcd6065b94e9c028fd",3:"b4d6601fb15b9404c27f",4:"b23e2e2140d0095cda3f",9:"4d5a4b0eee46db3f7c33",10:"eb32c55f3bc89ff1bfee",11:"d456581b08846862fdcd",12:"445a973635ddb2e796fb",13:"67313a9039370c606019",14:"f217a765e16c9f720ad5",15:"9dd80e0a92822d68a60f",16:"08ccb72982ef7c079065"}[e]+".js"}(e);var u=new Error;a=function(r){f.onerror=f.onload=null,clearTimeout(i);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",u.name="ChunkLoadError",u.type=n,u.request=a,t[1](u)}o[e]=void 0}};var i=setTimeout(function(){a({type:"timeout",target:f})},12e4);f.onerror=f.onload=a,document.head.appendChild(f)}return Promise.all(r)},c.m=e,c.c=n,c.d=function(e,r,t){c.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},c.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.t=function(e,r){if(1&r&&(e=c(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(c.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)c.d(t,n,(function(r){return e[r]}).bind(null,n));return t},c.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(r,"a",r),r},c.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},c.p="",c.oe=function(e){throw console.error(e),e};var f=window.webpackJsonp=window.webpackJsonp||[],u=f.push.bind(f);f.push=r,f=f.slice();for(var i=0;i<f.length;i++)r(f[i]);var l=u;t()}([]);
    Ответы: (21)
  21. ТеньД Страницу я открыть могу:

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>УТМ</title>
      <base href="/app">
    
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="icon" type="image/x-icon" href="favicon.ico">
    
      <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->
      <!-- https://github.com/sockjs/sockjs-client/issues/439 fix: -->
      <script>
        if (global === undefined) {
          var global = window;
        }
      </script>
      <!-- https://github.com/aws/aws-amplify/issues/678 fix end-->
      <!-- https://github.com/sockjs/sockjs-client/issues/439 fix end-->
      <style type="text/css">
        body, html {
          height: 100%;
        }
        .app-loading {
          position: relative;
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          height: 100%;
        }
        .app-loading .spinner {
          height: 200px;
          width: 200px;
          animation: rotate 2s linear infinite;
          transform-origin: center center;
          position: absolute;
          top: 0;
          bottom: 0;
          left: 0;
          right: 0;
          margin: auto;
        }
        .app-loading .spinner .path {
          stroke-dasharray: 1, 200;
          stroke-dashoffset: 0;
          animation: dash 1.5s ease-in-out infinite;
          stroke-linecap: round;
          stroke: #d25851;
        }
        @keyframes rotate {
          100% {
            transform: rotate(360deg);
          }
        }
        @keyframes dash {
          0% {
            stroke-dasharray: 1, 200;
            stroke-dashoffset: 0;
          }
          50% {
            stroke-dasharray: 89, 200;
            stroke-dashoffset: -35px;
          }
          100% {
            stroke-dasharray: 89, 200;
            stroke-dashoffset: -124px;
          }
        }
      </style>
    <link rel="stylesheet" href="styles.d902a9b2bb8162233c3a.css"></head>
    <body>
      <app-root>
        <div class="app-loading">
          <div class="logo"></div>
          <svg class="spinner" viewBox="25 25 50 50">
            <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"/>
          </svg>
        </div>
      </app-root>
    <script src="runtime-es2015.c3fa1f92c77ebef4835b.js" type="module"></script><script src="runtime-es5.c3fa1f92c77ebef4835b.js" nomodule defer></script><script src="polyfills-es5.ad22168931326eec4d7d.js" nomodule defer></script><script src="polyfills-es2015.cad33774bce53cf6e2b1.js" type="module"></script><script src="scripts.07a635ddfc26da723016.js" defer></script><script src="main-es2015.cb1667b50459b741eff3.js" type="module"></script><script src="main-es5.cb1667b50459b741eff3.js" nomodule defer></script></body>
    </html>
    

    В браузере, а не в редакторе. Зачем тебе ее код? Нужно ее запустить и инициировать отправку запроса каким-нибудь способом, и посмотреть что отправилось и что пришло в ответ. Там есть кнопки на странице?

  22. ТеньД (18) Скрипт вот такой:

    !function(e){function r(r){for(var n,c,f=r[0],u=r[1],i=r[2],d=0,p=[];d<f.length;d++)c=f[d],Object.prototype.hasOwnProperty.call(o,c)&&o[c]&&p.push(o[c][0]),o[c]=0;for(n in u)Object.prototype.hasOwnProperty.call(u,n)&&(e[n]=u[n]);for(l&&l(r);p.length;)p.shift()();return a.push.apply(a,i||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],n=!0,f=1;f<t.length;f++)0!==o[t[f]]&&(n=!1);n&&(a.splice(r--,1),e=c(c.s=t[0]))}return e}var n={},o={1:0},a=[];function c(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise(function(r,n){t=o[e]=[r,n]});r.push(t[2]=n);var a,f=document.createElement("script");f.charset="utf-8",f.timeout=120,c.nc&&f.setAttribute("nonce",c.nc),f.src=function(e){return c.p+""+({0:"common"}[e]||e)+"-es2015."+{0:"9f7f7a2784a4bc776014",2:"2ffcd6065b94e9c028fd",3:"b4d6601fb15b9404c27f",4:"b23e2e2140d0095cda3f",9:"4d5a4b0eee46db3f7c33",10:"eb32c55f3bc89ff1bfee",11:"d456581b08846862fdcd",12:"445a973635ddb2e796fb",13:"67313a9039370c606019",14:"f217a765e16c9f720ad5",15:"9dd80e0a92822d68a60f",16:"08ccb72982ef7c079065"}[e]+".js"}(e);var u=new Error;a=function(r){f.onerror=f.onload=null,clearTimeout(i);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",u.name="ChunkLoadError",u.type=n,u.request=a,t[1](u)}o[e]=void 0}};var i=setTimeout(function(){a({type:"timeout",target:f})},12e4);f.onerror=f.onload=a,document.head.appendChild(f)}return Promise.all(r)},c.m=e,c.c=n,c.d=function(e,r,t){c.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},c.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.t=function(e,r){if(1&r&&(e=c(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(c.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)c.d(t,n,(function(r){return e[r]}).bind(null,n));return t},c.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(r,"a",r),r},c.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},c.p="",c.oe=function(e){throw console.error(e),e};var f=window.webpackJsonp=window.webpackJsonp||[],u=f.push.bind(f);f.push=r,f=f.slice();for(var i=0;i<f.length;i++)r(f[i]);var l=u;t()}([]);

    Зачем ты в коде ковыряешься? Тебе же посоветовали уже простой путь.

    Ответы: (22)
  23. webdev Зачем ты в коде ковыряешься? Тебе же посоветовали уже простой путь.

    Т. е. ты предлагаешь шарком или фиддлером перехватить трафик с УТМ и понять что оно спрашивает и что получает в ответ?

    Ответы: (23) (24)
  24. 02.06.2021 16:52:20 отредактировано sda553

    (22) хромом.
    В хроме нажимаешь F12, переходишь на вкладку nerwork/сеть
    Делаешь действия и смотришь что там отправляется/качается по каким url и в каком формате

    Ответы: (24) (25)
  25. ТеньД Т. е. ты предлагаешь шарком или фиддлером перехватить трафик с УТМ и понять что оно спрашивает и что получает в ответ?

    Почти. Но не перехватывать посередине чтобы не возиться с сертификатами, а на клиенте посмотреть уже расшифрованные данные, через удобный "инструмент разработчика" в браузере. Как (23). Почти в любом браузере он открывается по F12. Я пользуюсь Edge, но можно и Хромом или IE.

    Ответы: (25)
  26. (23) (24) Понял, спасибо. Какая же куча херни там происходит при загрузке страницы! Там можно как-нибудь отфильтровать внешний трафик от выполнения скриптов на клиенте?

  27. Можно

  28. Смотри на экран. Там есть разные кнопки, и другие поля.
    Скорее всего тебе нужно только XHR оставить, остальное отфильтровать. Но может быть и нет.
    Для начала очисти все перед отправкой запроса. А потом отправь запрос, смотри что происходит, и вникай.

    Ответы: (28)
  29. (27) Спасибо. Покопал и нашел что надо.

  30. На здоровье!

или зарегистрируйтесь чтобы ответить!