@Solation

Как генерируется secret у приложения Vue?

Добрый день. Я разбираю запросы переводчика https://ru.libretranslate.com/
При вводе текста для перевода, получаю POST запрос на https://ru.libretranslate.com/translate, в нем передаются параметры:
q: number
source: auto
target: ru
format: text
alternatives: 3
api_key: 
secret: XFCYFF7

Получаю JSON ответ:
{
    "alternatives": [
        "число номер",
        "номер номера"
    ],
    "detectedLanguage": {
        "confidence": 18.0,
        "language": "en"
    },
    "translatedText": "номер"
}

Не пойму как генерируется параметр secret.
Нахожу JS приложения VUE https://ru.libretranslate.com/js/app.js?v=1.6.2
Вижу такие строки:
apiSecret: "TEVPOTVWTQ=="
Зашифрованная в base64 строка статична (открывал новые сессии, с разных браузеров). Нашел код JS который собирает POST запрос:
var request = new XMLHttpRequest();
                    self.transRequest = request;

                    var data = new FormData();
                    data.append("q", self.inputText);
                    data.append("source", self.sourceLang);
                    data.append("target", self.targetLang);
                    data.append("format", self.isHtml ? "html" : "text");
                    data.append("alternatives", 3);
                    data.append("api_key", localStorage.getItem("api_key") || "");
                    if (self.apiSecret) data.append("secret", atob(self.apiSecret));

                    request.open('POST', BaseUrl + '/translate', true);

В localstorage, в параметре api_key нету ничего, он пустой.

В итоге я понимаю, что secret меняется, время от времени, переменная apiSecret статична. Как мне понять, как генерируется secret чтобы отправлять самому POST запрос (на PHP cURL) ? Подскажите пожалуйста. Спасибо
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
Elaryks
@Elaryks
В исходном коде есть обфусцированный участок, выглядящий примерно так:

Обфусцированный код
self[_=String.fromCharCode,p=parseInt,_(p(211,6)+false+p(30,0x6))+_(169-57)+_(p(104,5)+p(301,0x5))+_(p(1,7)+false+p(145,0x7))+_(101)+_(46+false+53)+_(/*_(72)*/)+_(/*_(16)*/)+_(/*_(15)*/)+_(1938/**\/*//17)+_(p(14142,6)/**\/*//p(34,0x6))+_(46+70)] = (_=String.fromCharCode,p=parseInt,_(p(312,4)+p(201,0x4))+_(/*_(87)*/)+
[]
+_(/*_(62)*/)+_(85)+_(1620/18)+_(p(330,5)-p(2,0x5))+_(77)+_(52+false+18)+
[]
+
[]
+_(/*_(62)*/)+_(/*_(83)*/)+_(82)+_(77)+
[]
+_(p(141,5)+p(111,0x5))+_(81)+_(1830/30)+_(61));

И его слегка упрощённый вариант
self[
  ((_ = String.fromCharCode),
  (p = parseInt),
  _(p(211, 6) + false + p(30, 6)) +
    _(112) +
    _(p(104, 5) + p(301, 5)) +
    _(p(1, 7) + false + p(145, 7)) +
    _(101) +
    _(46 + false + 53) +
    _(114) +
    _(p(14142, 6) / p(34, 6)) +
    _(116))
] =
  ((_ = String.fromCharCode),
  (p = parseInt),
    _(p(152, 7)) +
    _(48) +
    _(p(1032, 4)) +
    _(p(24003, 7) / p(131, 7)) +
    _(p(2002, 4) - p(310, 4)) +
    _(p(256, 7) - p(126, 7)) +
    _(66) +
    _(76) +
    _(p(152, 7)) +
    _(62 + false + 3) +
    _(p(-2, 4) + false + p(333, 4)) +
    _(61));

В нём self['apiSecret'] присваивается определённое значение (self в данном случае — экземпляр Vue). При этом какой-то динамики я там не вижу, но, вероятно, эта часть кода генерируется на сервере. Вытащить ключ можно, выполнив в консоли вторую часть кода из исходника (после знака "="), либо просто взяв из экземпляра Vue: document.getElementById('app').__vue__.apiSecret. После нужно эту строку декодировать через atob():

atob(document.getElementById('app').__vue__.apiSecret);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы