Google nawakake API Tarjamahan Google kanthi struktur biaya adhedhasar panggunaan minangka bagean saka Google Cloud. Uga ana API sing ora didokumentasikake sing bisa digunakake tanpa tombol , nanging nolak bisa digunakake sawise sawetara panjaluk. Nalika nggunakake fungsi terjemahan situs web Google Chrome, bakal katon yen kaca bisa diterjemahake kanthi kualitas apik banget tanpa watesan sing jelas.
Ketoke model nmt canggih wis digunakake ing kene. Nanging API Google Chrome sing digunakake internal kanggo nerjemahake konten lan apa API iki uga bisa ditangani kanthi langsung - sanajan ing sisih server? Kanggo nganalisis lalu lintas jaringan, alat kayata Wireshark utawa Telerik Fiddler , sing uga bisa nganalisa lalu lintas sing dienkripsi, disaranake. Nanging Chrome malah ngirim panjaluk sing dikirim kanggo terjemahan kaca kanthi gratis: Kabeh bisa dideleng kanthi gampang nggunakake Chrome DevTools:
Yen sampeyan nindakake terjemahan, coba pilih POST panjaluk penting kanggo https://translate.googleapis.com liwat "Salin> Salin minangka cURL (bash)" lan eksekusi ing alat kaya Postman , kayata, sampeyan bisa ngirim panjaluk maneh tanpa ana masalah:
Makna paramèter URL uga wis ketok:
Kunci | Nilai conto | Tegese |
anno | 3 | Mode anotasi (mengaruhi format bali) |
klien | te_lib | Informasi klien (beda-beda, regane "webapp" liwat antarmuka web Google Translate; pengaruhe ing format bali lan watesan tarif) |
format | html | Format string (penting kanggo nerjemahake tag HTML) |
v | 1.0 | Nomer versi Google Translate |
kunci | AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw | Kunci API (deleng ngisor) |
log log | vTE_20200210_00 | Versi protokol |
sl | de | Basa sumber |
tl | en | Target basa |
sp | nmt | Model ML |
tc | 1 | dingerteni |
sr | 1 | dingerteni |
tk | 709408.812158 | Token (ndeleng ngisor) |
Pantun | 1 | dingerteni |
Sawetara header panjaluk uga disetel - nanging umume bisa diabaikan. Sawise batal milih kabeh header, kalebu saka agen pangguna , ditemokake masalah enkode nalika ngetik karakter khusus (ing kene nalika nerjemahake " Hello World "):
Yen sampeyan ngaktifake maneh agen pangguna (sing umume ora mbebayani), API bakal ngasilake karakter enkode UTF-8:
Apa kita wis ana lan apa duwe kabeh informasi kanggo nggunakake API iki ing sanjabane Google Chrome? Yen sampeyan ngganti senar karakter supaya diterjemahake (kolom data q panjaluk POST) saka, contone, "Hello world" dadi "Hello world ! ", Kita entuk pesen kesalahan:
Saiki kita terjemah iki sing dimodifikasi maneh ing Google Chrome nggunakake fungsi terjemahan situs web lan nemokake, kajaba parameter q , parameter tk uga wis diganti (kabeh parameter liyane tetep padha):
Temenan, iku token sing gumantung saka senar, strukture ora gampang dideleng. Nalika miwiti terjemahan situs web, file ing ngisor iki bakal dimuat:
- 1 file CSS: translateelement.css
- 4 grafis: translate_24dp.png (2x), gen204 (2x)
- 2 file JS: main_de.js , element_main.js
Kaloro file JavaScript obfuscated lan minimal. Alat kaya JS Nice lan de4js saiki mbantu kita nggawe file kasebut luwih bisa diwaca. Kanggo debug langsung, disaranake Chrome Extension Request, sing ngatur file jarak jauh kanthi lokal:
Saiki kita bisa debug kode ( CORS luwih dhisik kudu diaktifake ing server lokal). Bagean kode sing cocog kanggo ngasilake token katon didhelikake ing bagean iki ing file element_main.js:
b7739bf50b2edcf636c43a8f8910def9
Ing kene teks kasebut dikumbah kanthi sawetara pangowahan . Nanging sayangé, kita isih isih kekurangan salah sawijining bedhekan: Saliyane argumen a (yaiku teks sing bakal diterjemahake), argumen liyane b diwenehake menyang fungsi Bp () - jinis wiji sing katon beda-beda banjur kalebu mili menyang hashing. Nanging asale saka ngendi? Yen mlebu telpon fungsi Bp () , temokake bagean kode ing ngisor iki:
b7739bf50b2edcf636c43a8f8910def9
Fungsi Hq dinyatakake sadurunge kaya ing ngisor iki:
b7739bf50b2edcf636c43a8f8910def9
Ing kene Deobfuscater ninggali sampah; Sawise kita ngganti String.fromCharCode ('...') karo senar karakter masing-masing, mbusak a () sing wis lawas lan selehake fungsi panggilan [c (), c ()] , asile:
b7739bf50b2edcf636c43a8f8910def9
Utawa malah luwih gampang:
b7739bf50b2edcf636c43a8f8910def9
Fungsi yq sadurunge ditetepake minangka:
b7739bf50b2edcf636c43a8f8910def9
Wiji kasebut kayane ana ing obyek global google.translate._const._ctkk , sing kasedhiya nalika runtime. Nanging ing endi diaturake? Ing liyane, file JS main_de.js sing sadurunge dimuat , paling ora uga kasedhiya ing wiwitan. Kita nambahake ing ngisor iki ing wiwitan:
b7739bf50b2edcf636c43a8f8910def9
Ing console, kita pancen entuk winih saiki:
Iki nggawe Google Chrome dhewe minangka pilihan pungkasan, sing ketoke nyedhiyakake wiji kasebut. Untunge, kode sumber (Chromium, kalebu komponen Translate) mbukak sumber mula kasedhiya ing masarakat. Kita narik repositori kanthi lokal lan nemokake panggilan menyang fungsi TranslateScript :: GetTranslateScriptURL ing file translate_script.cc ing komponen / translate / inti / folder browser:
b7739bf50b2edcf636c43a8f8910def9
Variabel kanthi URL wis ditemtokake ing file sing padha:
b7739bf50b2edcf636c43a8f8910def9
Yen saiki mriksa file element.js kanthi luwih cedhak (sawise deobfuscating maneh), kita nemokake entri sing disetel c._ctkk - obyek google.translate uga wis disetel lan mbukak kabeh aset sing relevan (sing wis ditemokake sadurunge) bakal diwiwiti:
b7739bf50b2edcf636c43a8f8910def9
Saiki tombol paramèter tetep dipertimbangkan (kanthi nilai AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw). Kayane kunci API browser umum (sing uga bisa ditemokake ing sawetara asil Google ). Wis disetel ing Chromium ing file translate_url_util.cc ing folder komponen / terjemahake / inti / browser:
b7739bf50b2edcf636c43a8f8910def9
Tombol kui ing google_apis / google_api_keys.cc saka nilai dummy:
b7739bf50b2edcf636c43a8f8910def9
Nanging, tes nuduhake manawa panggilan API bisa digunakake tanpa parameter kunci iki. Yen sampeyan nyoba nganggo API, sampeyan bakal entuk kode status 200 yen sukses. Yen sampeyan entuk watesan, sampeyan bakal entuk kode status 411 kanthi pesen " POST panjaluk mbutuhake header dawa isi ". Mula disaranake nyakup header iki (sing kanthi otomatis disetel minangka header sementara ing Postman).
Format bali saka senar sing diterjemahake ora umum yen ana sawetara ukara ing sak panjaluk. Ukara individu ditutupi karo tag i- / b-HTML:
Uga, Google Chrome ora ngirim kabeh HTML menyang API, nanging ngirit nilai atribut kayata href ing panjaluk (lan malah nyetel indeks supaya tag mengko bisa diwenehake ing sisih klien):
Yen sampeyan ngganti regane klien kunci POST saka te_lib (Google Chrome) ing webapp (situs web Terjemahan Google ), sampeyan entuk tali terjemahan pungkasan:
Masalahe yaiku sampeyan luwih cenderung mbukak watesan dibandhingake liwat te_lib (kanggo perbandingan: kanthi webapp tekan 40.000 karakter, kanthi te_lib ora ana watesan watesan). Dadi, kita kudu luwih tliti babagan carane Chrome ngrampungake asil kasebut. Kita bakal nemokake ing kene ing element_main.js:
b7739bf50b2edcf636c43a8f8910def9
Yen sampeyan ngirim kabeh kode HTML menyang API, bakal ninggalake atribut ing respon terjemahan. Mulane, kita ora kudu niru kabeh prilaku parse, nanging mung ngekstrak string sing diterjemahake saka respon. Kanggo nindakake iki, kita nggawe parser tag HTML cilik sing mbuwang tag <i> paling njaba kalebu isi lan mbusak tag <b> paling njaba. Kanthi kawruh iki kita saiki bisa (sawise nginstal dependensi karo komposer mbutuhake fzaninotto / faker vielhuber / stringhelper ) mbangun versi server-side saka terjemahan API:
b7739bf50b2edcf636c43a8f8910def9
Ing ngisor iki minangka asil tes awal sing ditindakake ing limang macem-macem sistem kanthi bandwidth beda lan alamat IP:
Watake | Karakter saben panjaluk | Duration | Tingkat kesalahan | Biaya liwat API resmi |
13.064.662 | ~250 | 03: 36: 17h | 0% | 237,78€ |
24.530.510 | ~250 | 11: 09: 13h | 0% | 446,46€ |
49.060.211 | ~250 | 20: 39: 10h | 0% | 892,90€ |
99.074.487 | ~1000 | 61: 24: 37h | 0% | 1803,16€ |
99.072.896 | ~1000 | 62: 22: 20h | 0% | 1803,13€ |
Σ284.802.766 | ~ Ø550 | Σ159: 11: 37h | 0% | € 5183,41 |
Cathetan: Posting blog iki kalebu kabeh skrip ditulis mung kanggo tujuan tes. Aja nggunakake Tulisan kanggo nggunakake produktif, tinimbang bisa karo resmi API Google Translation .