Преобразование кода функции ES6 JavaScript в код не-ES6 - PullRequest
0 голосов
/ 20 июня 2019

Попытка использовать сложную логику дешифрования в своем собственном сценарии, но код - это ES6, о котором я понятия не имею.

    const parseDecsig = data => {
        try {
            if (data.startsWith('var script')) {
                // they inject the script via script tag
                const obj = {}
                const document = { createElement: () => obj, head: { appendChild: () => {} } }
                eval(data)
                data = obj.innerHTML
            }
            const fnnameresult = /yt\.akamaized\.net.*encodeURIComponent\((\w+)/.exec(data)
            const fnname = fnnameresult[1]
            const _argnamefnbodyresult = new RegExp(fnname + '=function\\((.+?)\\){(.+?)}').exec(data)
            const [_, argname, fnbody] = _argnamefnbodyresult
            const helpernameresult = /;(.+?)\..+?\(/.exec(fnbody)
            const helpername = helpernameresult[1]
            const helperresult = new RegExp('var ' + helpername + '={[\\s\\S]+?};').exec(data)
            const helper = helperresult[0]
            logger.log(`parsedecsig result: %s=>{%s\n%s}`, argname, helper, fnbody)
            return new Function([argname], helper + '\n' + fnbody)
        } catch (e) {
            logger.error('parsedecsig error: %o', e)
            logger.info('script content: %s', data)
            logger.info(
                'If you encounter this error, please copy the full "script content" to https://pastebin.com/ for me.'
            )
        }
    }

Каким будет код, эквивалентный Pre ES6 выше?

Ответы [ 2 ]

3 голосов
/ 20 июня 2019

Один из вариантов - использовать Бабель .Вставьте свой код, и вы получите:

"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

var parseDecsig = function parseDecsig(data) {
  try {
    if (data.startsWith('var script')) {
      // they inject the script via script tag
      var obj = {};
      var document = {
        createElement: function createElement() {
          return obj;
        },
        head: {
          appendChild: function appendChild() {}
        }
      };
      eval(data);
      data = obj.innerHTML;
    }

    var fnnameresult = /yt\.akamaized\.net.*encodeURIComponent\((\w+)/.exec(data);
    var fnname = fnnameresult[1];

    var _argnamefnbodyresult = new RegExp(fnname + '=function\\((.+?)\\){(.+?)}').exec(data);

    var _argnamefnbodyresult2 = _slicedToArray(_argnamefnbodyresult, 3),
        _ = _argnamefnbodyresult2[0],
        argname = _argnamefnbodyresult2[1],
        fnbody = _argnamefnbodyresult2[2];

    var helpernameresult = /;(.+?)\..+?\(/.exec(fnbody);
    var helpername = helpernameresult[1];
    var helperresult = new RegExp('var ' + helpername + '={[\\s\\S]+?};').exec(data);
    var helper = helperresult[0];
    logger.log("parsedecsig result: %s=>{%s\n%s}", argname, helper, fnbody);
    return new Function([argname], helper + '\n' + fnbody);
  } catch (e) {
    logger.error('parsedecsig error: %o', e);
    logger.info('script content: %s', data);
    logger.info('If you encounter this error, please copy the full "script content" to https://pastebin.com/ for me.');
  }
};

Выглядит некрасиво, но это не должно иметь значения - это будет работать и может быть сделано автоматически.

У вас также есть один ES6 + метод, который вы используете, String.prototype.startsWith, который не является синтаксисом, поэтому он не переносится - добавьте polyfill для него, который выполняется перед другим кодом.

if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
        value: function(search, pos) {
            pos = !pos || pos < 0 ? 0 : +pos;
            return this.substring(pos, pos + search.length) === search;
        }
    });
}

Тогда код должен быть полностью совместим с ES5 и запускаться даже в устаревших браузерах, таких как IE11.

2 голосов
/ 24 июня 2019

Новые функции ES6 перечислены в ECMAScript 6 - ECMAScript 2015 или Поддержка ECMAScript 2015 в Mozilla , и после их удаления код станет пре-ES6.Например:

  • изменить const или let на var
  • изменить Функция стрелки на обычную функцию (изменение области действия, но вбольшинство случаев, которые могут не вызывать проблем)
  • изменить startsWith с indexOf
  • изменить Разрушающее назначение

ЗдесьБЫСТРАЯ доработка кода, чтобы показать вам процесс.Я не проверил это полностью.

var parseDecsig = funnction(data) {
    try {
        if (data.indexOf('var script') !== -1) {
            // they inject the script via script tag
            var obj = {}
            var document = { createElement: function(){ obj }, head: { appendChild: function(){} } }
            eval(data)
            data = obj.innerHTML
        }
        var fnnameresult = /yt\.akamaized\.net.*encodeURIComponent\((\w+)/.exec(data)
        var fnname = fnnameresult[1]
        var _argnamefnbodyresult = new RegExp(fnname + '=function\\((.+?)\\){(.+?)}').exec(data)
        var _ = _argnamefnbodyresult[0]
        var argname = _argnamefnbodyresult[1]
        var fnbody = _argnamefnbodyresult[2]
        var helpernameresult = /;(.+?)\..+?\(/.exec(fnbody)
        var helpername = helpernameresult[1]
        var helperresult = new RegExp('var ' + helpername + '={[\\s\\S]+?};').exec(data)
        var helper = helperresult[0]
        logger.log(`parsedecsig result: %s=>{%s\n%s}`, argname, helper, fnbody)
        return new Function([argname], helper + '\n' + fnbody)
    } catch (e) {
        logger.error('parsedecsig error: %o', e)
        logger.info('script content: %s', data)
        logger.info(
            'If you encounter this error, please copy the full "script content" to https://pastebin.com/ for me.'
        )
    }
}
...