Получение переменных из 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 код на странице. Необходимо получить ее значение. Возможно ли это в принципе? Вроде в теории можно вызывать функции данного фреймворка по номеру, но тут я совсем понимаю параметры вызова. Заранее спасибо за помощь. Жду ответа. |
Просто идёшь вверх и смотришь:
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 могут поменяться, т.к. являются результатом минимизации. |
Огромное спасибо. В принципе немного понял как оно устроено.
Я так понимаю, что это выгрузка этих функций. Только при запуске Вашего кода в Chrome Debug Console выдает ошибку: VM529:4 Uncaught TypeError: webpackJsonp.push is not a function |
Странно. М.б. не актуальная версия вебпака там юзается. Тут без кода не разобраться. Там в самом верху должно быть что-то типа
window['webpackJsonp'] = ...кинь сюда, посмотрю. |
Rise, для того он и предназначен.) (или юзескриптов)
|
Нашел только в основном скрипте перед подключением других модулей 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()() } Вроде больше нет нигде ничего похожего. |
NIIL, а webpackHotUpdate там рядом случаем нет?
Если нет, то тут всё сложнее. Это webpack 3 и так просто в него уже не внедриться после загрузки.) Для чего вам это вообще надо? Для юзерскрипта или для чего-то иного? В можете запускать код до загрузки страницы? |
webpackHotUpdate - не встречал.
На самом деле эта переменная нужна для обращения к php скрипту на сайте. Сам же парсер, который я пишу на Delphi, может использовать Chrome компонент, в котором будет выполняться скрипт и присваивать свойству любого поля странице - значение переменной... Это конечно грабли, но пока я не вижу способов это все упростить. Данная переменная генерируется для каждой сессии, поэтому использовать полученную через браузер, а потом вставить в приложение, к сожалению, не получится |
Тамщем вот это:
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:49. |