Google Translation API Hacking

Google ofertas la API de Google Translation kun uzokostita kostostrukturo kiel parto de sia Google Cloud. Ekzistas ankaŭ nedokumentita API uzebla sen ŝlosilo , sed kiu rifuzas funkcii post nur kelkaj petoj. Kiam vi uzas la retejan tradukan funkcion de Google Chrome, rimarkeblas, ke paĝoj povas esti tradukitaj tre bonkvalite sen rimarkinda limigo.


Ŝajne la altnivela nmt-modelo jam estas uzata ĉi tie. Sed kiun API Google Chrome uzas interne por traduki la enhavon kaj ĉu ĉi tiu API ankaŭ povas esti traktita rekte - eĉ ĉe la servila flanko? Por analizi retan trafikon, iloj kiel WiresharkTelerik Fiddler , kiuj ankaŭ povas analizi ĉifritan trafikon, estas rekomendindaj. Sed Chrome eĉ liveras la petojn, kiujn ĝi sendas por la paĝa traduko senpage: Ili facile videblas per Chrome DevTools:

Se vi efektivigas tradukon, tiam kaptu la decidan POST-peton al https://translate.googleapis.com per "Kopii> Kopii kiel cURL (bash)" kaj plenumi ĝin per ilo kiel Poŝtisto , ekzemple, vi povas sendi la peton denove senprobleme.:

La signifo de la URL-parametroj ankaŭ estas plejparte evidenta:

ŜlosiloEkzempla valoroSignifo
anno3Komenta reĝimo (influas la revenan formaton)
klientote_libKlientaj informoj (varias, la valoro estas "retapo" per la interreta interfaco de Google Translate; efikas sur la revena formato kaj imposto-limigo)
formatohtmlŜnura formato (grava por traduki HTML-etikedojn)
v1.0Versio-numero de Google Translate
ŝlosiloAIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgwAPI-ŝlosilo (vidu sube)
logldvTE_20200210_00Protokola versio
sldeFonta lingvo
tlenCel-lingvo
spnmtML-modelo
tc1nekonata
Sr.1nekonata
tk709408.812158Signo (vidu sube)
Modo1nekonata

Iuj petaj titoloj ankaŭ estas agorditaj - sed ĉi tiuj plejparte povas esti ignorataj. Post permane malelektado de ĉiuj kaplinioj, inkluzive de tiuj de la uzanto-agento , koda problemo estas malkovrita kiam vi enigas specialajn signojn (ĉi tie kiam tradukas " Saluton Mondo "):

Se vi reaktivigas la uzantan agenton (tio ĝenerale ne damaĝas), la API liveras koditajn signojn UTF-8:

Ĉu ni jam estas tie kaj ĉu ni havas ĉiujn informojn por uzi ĉi tiun API ekster Google Chrome? Se vi ŝanĝas la tradukindan ĉenon (datuma kampo q de la POST-peto) de, ekzemple, "Saluton mondo" al "Saluton mondo ! “, Ni ricevas erarmesaĝon:

Ni nun tradukas ĉi tiun modifitan denove ene de Google Chrome per la retejo-traduko-funkcio kaj trovas, ke krom la parametro q , la parametro tk ankaŭ ŝanĝiĝis (ĉiuj aliaj parametroj restis samaj):

Evidente, ĝi estas signo, kiu dependas de la ĉeno, kies strukturo ne facile videblas. Kiam vi komencas la retejan tradukon, la jenaj dosieroj estas ŝarĝitaj:

  • 1 CSS-dosiero: translateelement.css
  • 4 grafikaĵoj: translate_24dp.png (2x), gen204 (2x)
  • 2 JS-dosieroj: main_de.js , element_main.js

La du JavaScript-dosieroj estas malklarigitaj kaj malgrandigitaj. Iloj kiel JS Nice kaj de4js nun helpas nin fari ĉi tiujn dosierojn pli legeblaj. Por senpene elpurigi ilin, ni rekomendas Chrome Extension Requestly, kiu tunelas malproksimajn dosierojn surloke:

Nun ni povas elpurigi la kodon ( CORS unue devas esti aktivigita sur la loka servilo). La koncerna koda sekcio por generi la ĵetonon ŝajnas esti kaŝita en la dosiero element_main.js en ĉi tiu sekcio:

b7739bf50b2edcf636c43a8f8910def9

Ĉi tie la teksto estas hakita kun la helpo de iuj pecŝanĝoj . Sed bedaŭrinde ankoraŭ mankas al ni unu peco de la enigmo: Krom la argumento a (kiu estas la tradukota teksto), alia argumento b estas transdonita al la funkcio Bp () - speco de semo, kiu ŝajnas ŝanĝiĝi de tempo al tempo kaj kiu ankaŭ inkluzivas fluas en hakadon. Sed de kie li venas? Se ni saltas al la funkcio alvoko de Bp () , ni trovas la sekvan kodosekcion:

b7739bf50b2edcf636c43a8f8910def9

La funkcio Hq antaŭe estas deklarita jene:

b7739bf50b2edcf636c43a8f8910def9

La Deobfuscater lasis iom da rubo ĉi tie; Post kiam ni anstataŭigis String.fromCharCode ('...') per la respektivaj signokordoj , forigu la malnoviĝintan a () kaj kunmetu la funkciojn nomas [c (), c ()] , la rezulto estas:

b7739bf50b2edcf636c43a8f8910def9

Aŭ eĉ pli facile:

b7739bf50b2edcf636c43a8f8910def9

La funkcio yq estas antaŭe difinita kiel:

b7739bf50b2edcf636c43a8f8910def9

La semo ŝajnas esti en la tutmonda objekto google.translate._const._ctkk , kiu haveblas dum rultempo. Sed kie ĝi estas metita? En la alia antaŭe ŝarĝita JS-dosiero main_de.js, almenaŭ ĝi ankaŭ haveblas komence. Ni aldonas jenon komence:

b7739bf50b2edcf636c43a8f8910def9

En la konzolo ni efektive ricevas la nunan semon:

Ĉi tio lasas Google Chrome mem, kiu ŝajne donas la semon, kiel la lasta elekto. Bonŝance ĝia fontkodo (Chromium, inkluzive la komponanton Traduki) estas malfermfonteco kaj tial publike havebla. Ni tiras la deponejon loke kaj trovas la alvokon al la funkcio TranslateScript :: GetTranslateScriptURL en la dosiero translate_script.cc en la dosierujo components / translate / core / browser:

b7739bf50b2edcf636c43a8f8910def9

La variablo kun la URL estas malfacile difinita en la sama dosiero:

b7739bf50b2edcf636c43a8f8910def9

Se ni nun ekzamenas la dosieron element.js pli atente (post malfokusigi ĝin denove), ni trovas la malfacilan eniron c._ctkk - la google.translate- objekto ankaŭ estas agordita laŭe kaj la ŝarĝo de ĉiuj koncernaj aktivaĵoj (kiujn ni jam malkovris antaŭe) ekas:

b7739bf50b2edcf636c43a8f8910def9

La parametron ŝlosilo restaĵoj por konsidero (kun la valoro AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw). Tio ŝajnas esti ĝenerala retumila API-ŝlosilo (trovebla ankaŭ en iuj Google-rezultoj ). Ĝi estas agordita en Chromium en la dosiero translate_url_util.cc en la dosierujo components / translate / core / browser:

b7739bf50b2edcf636c43a8f8910def9

La ŝlosilo estas generita en google_apis / google_api_keys.cc de imita valoro:

b7739bf50b2edcf636c43a8f8910def9

Tamen testo montras, ke la API-vokoj funkcias same sen ĉi tiu ŝlosila parametro. Se vi eksperimentas kun la API, vi ricevos la statan kodon 200 se vi sukcesos. Se vi tiam renkontas limon, vi reakiras la statan kodon 411 kun la mesaĝo " POST-petoj postulas enhavan longan kapon ". Tial estas konsilinde enmeti ĉi tiun kaplinion (kiu aŭtomate estas agordita kiel portempa kaplinio en Poŝtisto).

La revenformato de la tradukitaj ĉenoj estas nekutima kiam estas pluraj frazoj en unu peto. La unuopaj frazoj estas enfermitaj per la i- / b-HTML-etikedoj:

Ankaŭ Google Chrome ne sendas la tutan HTML al la API, sed konservas atributajn valorojn kiel href en la peto (kaj anstataŭe starigas indicojn por ke la etikedoj estu poste atribuitaj al la klienta flanko):

Se vi ŝanĝas la valoron de la kliento POST- kliento de te_lib (Google Chrome) ĉe retapo ( retejo de Google Translation ), vi ricevas la finan tradukitan ĉenon:

La problemo estas, ke vi multe pli ofte ekhavas rapidecon-limigon ol per te_lib (por komparo: per retapo ĉi tio atingiĝas post 40 000 signoj, kun te_lib ne ekzistas tarifo-limigo). Do ni devas rigardi pli proksime kiel Chrome analizas la rezulton. Ni trovos ĝin ĉi tie en element_main.js:

b7739bf50b2edcf636c43a8f8910def9

Se vi sendas la tutan HTML-kodon al la API, ĝi lasas la atributojn en la tradukita respondo. Ni do ne devas imiti la tutan analizan konduton, sed nur ĉerpi la finan tradukitan ĉenon el la respondo. Por fari tion, ni konstruas malgrandan HTML-etikedan analizilon, kiu forĵetas la plej eksterajn <i> etikedojn inkluzive ilian enhavon kaj forigas la plej eksterajn <b> etikedojn. Konsiderante ĉi tion, ni nun povas krei servilan version de la traduko API:

b7739bf50b2edcf636c43a8f8910def9

Jen la rezultoj de komenca testo, kiu estis farita sur kvin malsamaj sistemoj kun malsamaj bendolarĝoj kaj IP-adresoj:

RoluloKarakteroj laŭ petoDaŭroEraroftecoKosto per oficiala API
13.064.662~25003: 36: 17h0%237,78€
24.530.510~25011: 09: 13h0%446,46€
49.060.211~25020: 39: 10h0%892,90€
99.074.487~100061: 24: 37h0%1803,16€
99.072.896~100062: 22: 20h0%1803,13€
Σ284.802.766~ Ø550Σ159: 11: 37h0%Σ 5183,41 €

Noto: Ĉi tiu bloga afiŝo kun ĉiuj skriptoj estis verkita nur por testaj celoj. Ne uzu la skriptoj por produktivaj uzo, anstataŭ labori kun la oficiala Google Tradukado API .

Reen