HTTPS WWW GOOGLE COM TRANSLATE

Google bietet im Rahmen seiner Google wolke die google Translation API mit einen nutzungsbasierten Kostenstruktur an. Daneben ergibt es eine undokumentierte, ohne Key nutzbare API, die jedoch schon nach wenigen Requests den Dienst verweigert. Bei der Benutzung der Webseiten-Übersetzungsfunktion von Google Chrome herbst auf, das hier ohne spürbare Begrenzung Seiten in sehr guter Qualität übersetzt verstehen können.

Du schaust: Https www google com translate

Offenbar wille hier sogar bereits das fortgeschrittene nmt-Model genutzt. Jedoch welche API nutzt google Chrome hier intern, um den Inhalt kommen sie übersetzen und kann man dies API auch direkt – sogar serverseitig – ansprechen? ca Netzwerktraffic kommen sie analysieren, empfehlen sich Tools wie Wireshark oder Telerik Fiddler, die auch verschlüsselten Traffic analyse können. Jedoch Chrome liefert das Requests, das es bei der Seitenübersetzung absetzt, sogar kostenlos Haus: sie sind leicht einsehbar by die Chrome DevTools:

*

Führt man einer Übersetzung durch, catcht klima den entscheidenden POST-Request an https://translate.googleapis.com durch "Copy > Copy together cURL (bash)" und führt ihn beispielsweise an einem Tool zusammen Postman aus, kann sein man den Request ohne Probleme erneut absenden:

*

Auch ns Bedeutung das URL-Parameter größtenteils offensichtlich:


Es verstehen ebenfalls einige Request Header der satz – dies können jedoch größtenteils wen interessiert das werden. Nach zum manuellen Abwählen aller Header, sogar von User-Agent, einstellen man in Eingabe von Sonderzeichen jedoch ein Encoding-Problem fest (hier in Übersetzung über „—Hallo Welt—“):

*

Aktiviert man ns User-Agent anderer (das schadet generell nicht), liefert das API UTF-8 encodete zeichen aus:

*

Sind wir ist gut schon am Ziel und haben alle Informationen, ca diese API auch außerhalb über Google Chrome kommen sie nutzen? Ändert einer die kommen sie übersetzende Zeichenkette (Datenfeld q ns POST-Requests) von zb „Hallo Welt“ oben „Hallo Welt!“, empfängt wir jedoch einer Fehlermeldung:

*

Wir führen nun einer erneute Übersetzung dies abgeänderten innerhalb von Google Chrome mit hilfe der Webseiten-Übersetzungsfunktion aufgrund und stellen fest, dass sich neben dem Parameter q sogar der Parameter tk geändert jawohl (alle andere Parameter zu sein gleichgeblieben):

*

Offenbar handelt das sich um herum ein vom String abhängiges Token, dessen Aufbau nicht einfach sichtbar ist. Startet man die Webseitenübersetzung, bekomme die folgenden Dateien geladen:

1 CSS-Datei: translateelement.css4 Grafiken: translate_24dp.png (2x), gen204 (2x)2 JS-Dateien: main_de.js, element_main.js

Die beiden JavaScript-Dateien zu sein verschleiert und minifiziert. Tools zusammen JS quite und de4js hilfe uns nun dabei, dies Dateien besser lesbar kommen sie machen. Um sie überdies live kommen sie debuggen, ermutigen sich ns Chrome extension Requestly, die on-the-fly Remote-Dateien lokal tunnelt:

*

Nun kann wir das Code debuggen (auf von lokalen Server muss zuvor still CORS aktiviert werden). Der relevante Code-Abschnitt für das Generierung von Tokens in erscheinung treten sich in der aufzeichnungen element_main.js in diesem Abschnitt kommen sie verbergen:

b7739bf50b2edcf636c43a8f8910def9

Hier wird u.a. Mit hilfe von einigen Bitshifts der Text gehasht. Doch leider wird vermisst uns noch einer Puzzlestück: bei die konstanz Bp() wird neben dem argument a (das der zu übersetzende text ist) einer weiteres argument b aushändigen – eine art Seed, der sich über Zeit zu Zeit zu ändern scheint und das ebenfalls mit bei das Hashing einfließt. Jedoch woher kommt er? springen wir um zu Funktionsaufruf von Bp(), befanden wir folgen Codeabschnitt:

b7739bf50b2edcf636c43a8f8910def9

Die funktion Hq wird dabei vorher als folgt deklariert:

b7739bf50b2edcf636c43a8f8910def9

Hier hat das Deobfuscater noch teil Unrat hinterlassen; folgende wir String.fromCharCode("...") aufgrund die jeweiligen Zeichenketten ersetzt haben, das obsolete a() entfernen und ns Funktionsaufrufe zusammenstückeln, ergibt sich:

b7739bf50b2edcf636c43a8f8910def9

Oder noch einfacher:

b7739bf50b2edcf636c43a8f8910def9

Die konstanz yq zu sein vorher definiert als:

b7739bf50b2edcf636c43a8f8910def9

Der particle scheint so im global Object google.translate._const._ctkk zu stecken, ns zur Laufzeit verfügbar ist. Doch wo wird das gesetzt? an der anderen, vor geladenen JS-Datei main_de.js zumindest ist es ebenfalls schon zu Beginn verfügbar. Uns fügen dazu bei der Anfang folgendes ein:

b7739bf50b2edcf636c43a8f8910def9

In der Konsole erhalten wir gut tatsächlich ns aktuellen Seed:

*

Damit bleibt zusammen letzte möglichkeit noch google Chrome selbst, der ns Seed anscheinend zur handhaben stellt.

Mehr sehen: Tipps, Wie Kann Ich Lebenslauf Schreiben : Anleitung, Beispiele & Vorlagen 2021

Glücklicherweise ist wer Source code (Chromium, inkl. Ns Translate-Komponente) Open-Source und zum öffentlich einsehbar. Uns ziehen uns das Repository lokal und finden an der aufzeichnungen translate_script.cc im erziehung components/translate/core/browser ns Aufruf ns Funktion TranslateScript::GetTranslateScriptURL:

b7739bf50b2edcf636c43a8f8910def9

Die variable mit das URL ist bei derselben aufzeichnungen hart definiert:

b7739bf50b2edcf636c43a8f8910def9

Untersuchen wir gut die aufzeichnungen element.js (nach erneutem deobfuskieren) genauer, gründen wir ns hart gesetzten Eintrag c._ctkk – sogar das google.translate themen wird dong gesetzt sowie das Laden aller relevanten heritage (die wir zuvor bereits entdeckt haben) wird getriggert:

b7739bf50b2edcf636c43a8f8910def9

Nun verbleibt zur betrachtung noch der Parameter key (mit zum Wert AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw). Ns scheint einer generischer Browser-API-Key zu sein (zu dem sich sogar einige Google-Ergebnisse finden). Das wird an Chromium in der datei translate_url_util.cc im erkämpft components/translate/core/browser gesetzt:

b7739bf50b2edcf636c43a8f8910def9

Der vital wird bei google_apis/google_api_keys.cc das ende einem Dummy-Wert generiert:

b7739bf50b2edcf636c43a8f8910def9

Ein Test zeigen jedoch, das die API-Aufrufe ohne dies Key-Parameter genau so funktionieren. Experimentiert man nun mit das API, erhält man im Erfolgsfall das Status-Code 200 zurück. Lauf man dann bei ein Limit, erhält man ns Status-Code 411 mit das Meldung "POST requests require a Content-length header" zurück. Also empfiehlt es sich, dies (in Postman zusammen Temporary Header automatische gesetzten) Header ebenfalls mit kommen sie setzen.

Das Rückgabeformat der übersetzten Strings ist in mehreren Sätzen in einem inquiry ungewöhnlich. Die einzelnen Sätze sind durch die i-/b-HTML-Tags umschlossen:

*

Auch sendet google Chrome nicht das komplette HTML an die API, sondern spart Attributwerte als href bereits in dem Request aus (und stellen stattdessen Indizes, ca die stichworte später anderer clientseitig zuordnen kommen sie können):

*

Ändert man das Wert ns POST-Keys client by te_lib (Google Chrome) auf webapp (Google translation Webseite), erhält man das final übersetzten String:

*

Das belästigung ist ist gut aber, das man anscheinend eher bei ein rate Limiting läuft als über te_lib (zum Vergleich: mit webapp erreicht einer dieses bereits nach 40.000 Chars, mit te_lib gibt es nein Rate Limiting). Deshalb müssen wir uns genauer ansehen, als Chrome ns Ergebnis parst. Bei der element_main.js bekomme wir hier fündig:

b7739bf50b2edcf636c43a8f8910def9

Sendet man den gesamten HTML-Code in die API, verlassen diese ns Attribute auch an der übersetzten Response. Uns müssen so nicht ns komplette Parse-Verhalten imitieren, jedoch lediglich den finalen, übersetzten String ende der solution extrahieren. Dazu konstruieren wir uns ns kleinen HTML-Tag-Parser, das die jeweils äußersten -Tags inkl.

Mehr sehen: Umziehen In Ein Anderes Bundesland Alles Beachten? (Bundeslandwechsel)

Das Inhalte verwirft und ns äußersten -Tags entfernt. Mit diesen Erkenntnissen kann sein wir nun eine serverseitige Version ns Übersetzungs-API aufbauen:

b7739bf50b2edcf636c43a8f8910def9

Es befolge die Ergebnisse einer ersten Tests, die auf fünf unterschiedlich Systemen mit unterschiedlichen Bandbreiten und IP-Adressen ausführen wurden: