Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Получение переменных из webpackJsonp (https://javascript.ru/forum/library-toolkit-framework/82800-poluchenie-peremennykh-iz-webpackjsonp.html)

NIIL 07.07.2021 15:07

Получение переменных из webpackJsonp
 
Добрый день. Не силен в JavaScript и ранее с webpackJsonp вообще не работал.

Есть набор скриптов данного фреймворка с функциями, среди которых есть:

1527: function(t, e, a) {
"use strict";
(function(t) {
var i = a(0)
, o = a(26)
, n = a(878)
, s = a(123)
, r = a(134)
, c = a(337)
, u = a(2)
, l = a(51)
, h = a(1464)
, d = a(36)
, p = a(1443)
, f = a(880)
, m = a(126)
, v = a(1528)
, b = a(133)
, g = a(338)
, _ = a(1487)
, S = a(85)
, y = a(6)
, w = a(4)
, O = a(782)
, C = a(29)
, D = a(519)
, P = a(1529)
, j = null
, k = new n.a
, T = function(e) {
function n(t, a) {
var i = e.call(this, a) || this;
return i.directServiceUrl = t,
i
}
return Object(i.e)(n, e),

...

n.prototype.getRoomData = function(t) {
var e, a, i, o, n, s = chat.performerData ? "1" : "", r = (null === (a = null === (e = u.a.getState()) || void 0 === e ? void 0 : e.chatOptions) || void 0 === a ? void 0 : a.chatDirect) && (null === (o = null === (i = u.a.getState()) || void 0 === i ? void 0 : i.chatExtra) || void 0 === o ? void 0 : o.hitUrl) ? "1" : "";
return chat.debug("getRoomData", t),
Object(b.a)({
url: this.directServiceUrl,
method: "getRoomData",
headers: {
"X-ab-Split-Group": (null === (n = u.a.getState()) || void 0 === n ? void 0 : n.chatABSplitGroup) || ""
},
args: [t, s, r]
})
}

...


В getRoomData есть локальная переменная n.chatABSplitGroup. Найти место где она инициализируется я не смог.
Так как я не могу менять скрипты, но могу выполнить javascrpt код на странице. Необходимо получить ее значение. Возможно ли это в принципе? Вроде в теории можно вызывать функции данного фреймворка по номеру, но тут я совсем понимаю параметры вызова.
Заранее спасибо за помощь. Жду ответа.

Aetae 07.07.2021 16:21

Просто идёшь вверх и смотришь:
n.chatABSplitGroup
n = u.a.getState()
u = a(2)
a - это внутренний webpack require
webpack - один из самых популярных сборщиков, скачивашь какой-нить пример, билдишь и смотришь как оно там внутрях устроено.

Но я те облегчу задачу:), как-то так можно внедриться и получать модули изнутри:
if(!window['__webpack_require__']) {
  window['__webpack_require__'] = (key => {
    let require;
    webpackJsonp.push([[key],{[key](...a) {require = a[2]}},[[key, key]]]);
    return require;
  })(String(Math.random()));
};

function getChatABSplitGroup() {
  const u = __webpack_require__(2);
  const state = u.a.getState();
  return state && state.chatABSplitGroup || "";
}

console.log(getChatABSplitGroup());


Ток следует помнить, что при следующей версии как циферка 2, так и ключ .a могут поменяться, т.к. являются результатом минимизации.

NIIL 07.07.2021 21:30

Огромное спасибо. В принципе немного понял как оно устроено.
Я так понимаю, что это выгрузка этих функций. Только при запуске Вашего кода в Chrome Debug Console выдает ошибку:

VM529:4 Uncaught TypeError: webpackJsonp.push is not a function

Aetae 07.07.2021 21:46

Странно. М.б. не актуальная версия вебпака там юзается. Тут без кода не разобраться. Там в самом верху должно быть что-то типа
window['webpackJsonp'] = ...
кинь сюда, посмотрю.

Rise 07.07.2021 22:52

Aetae, он твой код в консоле запускает:
Цитата:

Сообщение от NIIL
я не могу менять скрипты, но могу выполнить javascrpt код на странице.


Aetae 07.07.2021 22:55

Rise, для того он и предназначен.) (или юзескриптов)

NIIL 07.07.2021 23:46

Нашел только в основном скрипте перед подключением других модулей js следующий код:

var n = window.webpackJsonp;
window.webpackJsonp = function(e, i, o) {
for (var s, r, c = 0, l = []; c < e.length; c++)
r = e[c],
a[r] && l.push(a[r][0]),
a[r] = 0;
for (s in i)
Object.prototype.hasOwnProperty.call(i, s) && (t[s] = i[s]);
for (n && n(e, i, o); l.length; )
l.shift()()
}

Вроде больше нет нигде ничего похожего.

Aetae 08.07.2021 00:05

NIIL, а webpackHotUpdate там рядом случаем нет?
Если нет, то тут всё сложнее. Это webpack 3 и так просто в него уже не внедриться после загрузки.)
Для чего вам это вообще надо? Для юзерскрипта или для чего-то иного? В можете запускать код до загрузки страницы?

NIIL 08.07.2021 00:28

webpackHotUpdate - не встречал.
На самом деле эта переменная нужна для обращения к php скрипту на сайте. Сам же парсер, который я пишу на Delphi, может использовать Chrome компонент, в котором будет выполняться скрипт и присваивать свойству любого поля странице - значение переменной... Это конечно грабли, но пока я не вижу способов это все упростить. Данная переменная генерируется для каждой сессии, поэтому использовать полученную через браузер, а потом вставить в приложение, к сожалению, не получится

Aetae 08.07.2021 00:54

Тамщем вот это:
Object.defineProperty(Function.prototype, 'c', {
  configurable: true,
  set(value) {
    if(
      typeof value === 'object'
      && 'e' in this
      && 'm' in this
      && !window['__webpack_require__']
    ) {
      window['__webpack_require__'] = this;
      delete Function.prototype['c'];
    }
    Object.defineProperty(this, 'c', {
      writable: true,
      configurable: true,
      enumerable: true,
      value
    });
  }
});

надо запустить до всего кода страницы(в расширениях это document_start, не знаю как ты подрубаешься к браузеру), а дальше, после загрузки, также:
function getChatABSplitGroup() {
  const u = __webpack_require__(2);
  const state = u.a.getState();
  return state && state.chatABSplitGroup || "";
}

console.log(getChatABSplitGroup());


Часовой пояс GMT +3, время: 07:10.