Google- ն իր Google Cloud- ի մի մաս է առաջարկում Google Translate API- ն `օգտագործման վրա հիմնված ծախսերի կառուցվածքով : Կա նաև չփաստաթղթավորված API, որը կարող է օգտագործվել առանց բանալիի , բայց որը հրաժարվում է աշխատել ընդամենը մի քանի հարցումներից հետո: Google Chrome- ի կայքի թարգմանման գործառույթն օգտագործելիս նկատելի է, որ էջերը կարող են թարգմանվել շատ լավ որակով ՝ առանց որևէ նկատելի սահմանափակումների:
Ըստ ամենայնի, այստեղ արդեն օգտագործվում է առաջադեմ nmt մոդելը : Բայց ո՞ր API- ն է Google Chrome- ը օգտագործում ներքինը `բովանդակությունը թարգմանելու համար, և կարո՞ղ է արդյոք այս API- ին ուղղակիորեն դիմել` նույնիսկ սերվերի կողմից: Network անցային երթևեկությունը վերլուծելու համար առաջարկվում են այնպիսի գործիքներ, ինչպիսիք են Wireshark- ը կամ Telerik Fiddler- ը , որոնք կարող են նաև վերլուծել կոդավորված երթևեկությունը: Բայց Chrome- ը նույնիսկ առաքում է էջի թարգմանության համար իր ուղարկած հարցումները անվճար . Դրանք հեշտությամբ կարելի է դիտել ՝ օգտագործելով Chrome DevTools:
Եթե թարգմանություն եք կատարում, ապա բռնել POST- ի կարևոր խնդրանքը դեպի « https://translate.googleapis.com » «Պատճենել> Պատճենել որպես cURL (bash)» միջոցով և կատարել այն, օրինակ, Փոստատարի նման գործիքում, կարող եք հարցումը կրկին ուղարկել առանց խնդիրների::
URL պարամետրերի իմաստը նույնպես մեծ մասամբ ակնհայտ է:
Բանալի | Օրինակ արժեք | Իմաստը |
աննո | 3 | Անոտացիայի ռեժիմ (ազդում է վերադարձի ձևաչափի վրա) |
հաճախորդ | te_lib | Հաճախորդի տեղեկատվությունը (տատանվում է, արժեքը «webapp» է Google Translate վեբ ինտերֆեյսի միջոցով. Ազդում է վերադարձի ձևաչափի և տոկոսադրույքի սահմանափակման վրա) |
ձևաչափ | html | Լարի ձևաչափ (կարևոր է HTML պիտակները թարգմանելու համար) |
գ | 1.0 | Google Translate- ի տարբերակի համարը |
բանալի | AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw | API ստեղն (տես ստորև) |
լոգլդ | vTE_20200210_00 | Արձանագրության տարբերակը |
սլ | դե | Աղբյուրի լեզուն |
tl | en | Թիրախային լեզու |
սպ | նմտ | ML մոդել |
tc | 1 | անհայտ |
Սր | 1 | անհայտ |
tk | 709408.812158 | Նշան (տես ստորև) |
Նորաձեւություն | 1 | անհայտ |
Որոշ հարցումների վերնագրեր նույնպես դրված են, բայց դրանք հիմնականում կարող են անտեսվել: Բոլոր վերնագրերը ձեռքով ապանշելուց հետո, ներառյալ օգտագործողի գործակալի սլաքները, հատուկ նիշեր մուտքագրելիս հայտնաբերվում է կոդավորման խնդիր (այստեղ « Բարև աշխարհ » -ը թարգմանելիս):
Եթե դուք կրկին ակտիվացնում եք օգտագործողի գործակալը (դա, ընդհանուր առմամբ, չի վնասում), API- ն առաքում է UTF-8 կոդավորված նիշեր:
Արդյո՞ք մենք արդեն այնտեղ ենք և ունենք արդյոք բոլոր տեղեկությունները Google APP- ից դուրս այս API- ն օգտագործելու համար: Եթե փոխելու եք թարգմանվող տողը (POST հարցման q տվյալների տվյալների դաշտը), օրինակ, «Hello world» - ից «Hello world ! «, Մենք սխալ հաղորդագրություն ենք ստանում:
Այժմ մենք վերափոխում ենք այս փոփոխվածը Google Chrome- ի ներսում `օգտագործելով կայքի թարգմանության գործառույթը և գտնում, որ բացի q պարամետրից, փոխվել է նաև tk պարամետրը (մնացած բոլոր պարամետրերը մնացել են նույնը):
Ակնհայտ է, որ դա նշան է, որը կախված է լարից, որի կառուցվածքը հեշտ չէ տեսնել: Երբ սկսում եք կայքի թարգմանությունը, հետևյալ ֆայլերը բեռնվում են:
- 1 CSS ֆայլ ՝ translateelement.css
- 4 գրաֆիկա ՝ translate_24dp.png (2x), gen204 (2x)
- 2 JS ֆայլ ՝ main_de.js , element_main.js
JavaScript- ի երկու ֆայլերը կոծկված և մանրացված են: JS Nice- ի և de4js- ի նման գործիքներ այժմ օգնում են մեզ այս ֆայլերն ավելի ընթեռնելի դարձնել: Որպեսզի դրանք ուղիղ հեռացնեք սխալներից, մենք խորհուրդ ենք տալիս Chrome Extension Requestly- ին, որը թունելում է հեռավոր ֆայլերը տեղական ռեժիմում:
Այժմ մենք կարող ենք սխալ գործել կոդը ( CORS- ը նախ պետք է ակտիվացվի տեղական սերվերում): Նշանը գեներացնելու համար համապատասխան ծածկագրի բաժինը, կարծես, թաքնված է այս բաժնում element_main.js ֆայլում:
b7739bf50b2edcf636c43a8f8910def9
Այստեղ տեքստը հեշացվում է որոշ բիթային հերթափոխի օգնությամբ : Բայց, ցավոք, մեզ դեռ բացակայում է գլուխկոտրուկի մի կտորը. Բացի a փաստարկից (որը թարգմանվող տեքստ է), մեկ այլ փաստարկ b փոխանցվում է Bp () գործառույթին. Մի տեսակ սերմ, որը կարծես թե ժամանակ առ ժամանակ փոխվում է և որը ներառում է նաև հոսում է հեշինգ Բայց որտեղի՞ց է նա գալիս: Եթե անցնենք Bp () ֆունկցիայի կանչին, ապա մենք կգտնենք հետևյալ կոդերի բաժինը:
b7739bf50b2edcf636c43a8f8910def9
Hq գործառույթը նախապես հայտարարվում է հետևյալ կերպ:
b7739bf50b2edcf636c43a8f8910def9
Deobfuscater- ը այստեղ աղբ է թողել. String.fromCharCode- ից ('...') - ը փոխարինելով համապատասխան նիշերի տողերով, հանեք հնացած a () և միացրեք իրար [c (), c ()] գործառույթները, արդյունքն է:
b7739bf50b2edcf636c43a8f8910def9
Կամ նույնիսկ ավելի հեշտ:
b7739bf50b2edcf636c43a8f8910def9
Yq գործառույթը նախկինում սահմանված է որպես:
b7739bf50b2edcf636c43a8f8910def9
Սերմը կարծես թե գտնվում է google.translate._const._ctkk գլոբալ օբյեկտում, որը մատչելի է գործարկման ժամանակ: Բայց որտե՞ղ է դրված: Մյուս, նախկինում բեռնված JS ֆայլը main_de.js- ում, համենայն դեպս, այն նույնպես հասանելի է սկզբում: Սկզբին մենք ավելացնում ենք հետեւյալը:
b7739bf50b2edcf636c43a8f8910def9
Վահանակում մենք իրականում ստանում ենք ընթացիկ սերմը:
Սա թողնում է ինքը ՝ Google Chrome- ը, որն, ըստ երեւույթին, տալիս է սերմը, որպես վերջին տարբերակ: Բարեբախտաբար, դրա սկզբնաղբյուրը (Chromium, այդ թվում ՝ Translate բաղադրիչը) բաց աղբյուր է, ուստի ՝ մատչելի է հանրության համար: Մենք տեղանքով քաշում ենք պահոցը և գտնում ենք TranslateScript :: GetTranslateScriptURL գործառույթի կանչը translate_script.cc ֆայլում բաղադրիչների / translate / core / դիտարկիչի թղթապանակում:
b7739bf50b2edcf636c43a8f8910def9
URL- ով փոփոխականը խիստ ֆիքսված է նույն ֆայլում:
b7739bf50b2edcf636c43a8f8910def9
Եթե մենք հիմա ավելի սերտորեն ուսումնասիրենք element.js ֆայլը (նորից դեոբֆուսացումից հետո), ապա կգտնենք կոշտ տեղադրված մուտքը c._ctkk - google.translate օբյեկտը նույնպես համապատասխանաբար դրված է, և բոլոր համապատասխան ակտիվների բեռնումը (որը մենք արդեն հայտնաբերել ենք ավելի վաղ) գործարկվում է:
b7739bf50b2edcf636c43a8f8910def9
Այժմ պարամետրի բանալին մնում է քննարկման (AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw արժեքով): Թվում է, թե դա ընդհանուր զննարկչի API բանալի է (որը կարելի է գտնել նաև Google- ի որոշ արդյունքներում ): Այն տեղադրված է Chromium- ում ՝ translate_url_util.cc ֆայլում ՝ բաղադրիչների / թարգմանության / միջուկի / զննարկիչի թղթապանակում:
b7739bf50b2edcf636c43a8f8910def9
Բանալին գեներացվում է google_apis / google_api_keys.cc- ում կեղծ արժեքից:
b7739bf50b2edcf636c43a8f8910def9
Այնուամենայնիվ, թեստը ցույց է տալիս, որ API կանչերն աշխատում են նույնը ՝ առանց այս առանցքային պարամետրի: Եթե փորձ կատարեք API- ի հետ, հաջողակ լինելու դեպքում կստանաք 200 կարգավիճակի ծածկագիր: Եթե այնուհետև բախվեք սահմանի հետ , ապա « POST հարցումները պահանջում են բովանդակության երկարության վերնագիր » հաղորդագրությամբ հետ եք ստանում 411 կարգավիճակի ծածկագիրը: Ուստի ցանկալի է ներառել այս վերնագիրը (որը փոստատարում ավտոմատ կերպով դրվում է որպես ժամանակավոր վերնագիր ):
Թարգմանված տողերի վերադարձի ձևաչափն անսովոր է, երբ մեկ հարցումում կա մի քանի նախադասություն: Առանձին նախադասությունները կցվում են i- / b-HTML պիտակներով:
Բացի այդ, Google Chrome- ը ամբողջ HTML- ը չի ուղարկում API- ին, բայց հարցման մեջ պահպանում է ատրիբուտի արժեքները, ինչպիսիք են href- ը (և փոխարենը ինդեքսներ է սահմանում, որպեսզի պիտակները հետագայում նշանակվեն հաճախորդի կողմից):
Եթե փոխեք POST ստեղնաշարի հաճախորդի արժեքը te_lib- ից (Google Chrome) webapp- ում ( Google Translate կայք ), դուք ստանում եք վերջին թարգմանված տողը:
Խնդիրն այն է, որ դուք շատ ավելի հավանական է, առաջադրվելու մեջ փոխարժեքով սահմանափակող, քան միջոցով te_lib (համեմատության համար նշենք, ինչպես webapp այս ձեռք բերված հետո 40,000 նիշ, ինչպես te_lib չկա փոխարժեքը սահմանափակող): Այսպիսով, մենք պետք է ավելի սերտ նայենք, թե ինչպես է Chrome- ը վերլուծում արդյունքը: Մենք այն կգտնենք այստեղ ՝ element_main.js:
b7739bf50b2edcf636c43a8f8910def9
Եթե ամբողջ HTML կոդը ուղարկեք API-ին, այն թողնում է ատրիբուտները թարգմանված պատասխանում: Հետևաբար, մենք չպետք է ընդօրինակենք ամբողջ վերլուծական վարքը, այլ միայն պատասխանից հանենք վերջնական թարգմանված տողը: Դա անելու համար մենք կառուցում ենք փոքր HTML պիտակների վերլուծիչ, որը մերժում է ամենահեռավոր <i> պիտակները, ներառյալ դրանց բովանդակությունը և հեռացնում ամենահեռավոր <b> թեգերը: Այս գիտելիքներով ( կոմպոզիտորի հետ կախվածությունը տեղադրելուց հետո պահանջվում է fzaninotto / faker vielhuber / stringhelper ) մենք այժմ կարող ենք կառուցել թարգմանության API-ի սերվերային տարբերակը::
b7739bf50b2edcf636c43a8f8910def9
Ստորև բերված են նախնական փորձարկման արդյունքներ, որոնք իրականացվել են հինգ տարբեր համակարգերի վրա `տարբեր թողունակությամբ և IP հասցեներով:
Բնավորություն | Նիշեր ըստ պահանջի | Տեւողությունը | Սխալի տեմպը | Արժեքը պաշտոնական API- ի միջոցով |
13.064.662 | ~250 | 03: 36: 17 ժ | 0% | 237,78€ |
24.530.510 | ~250 | 11: 09: 13 ժ | 0% | 446,46€ |
49.060.211 | ~250 | 20: 39: 10 ժ | 0% | 892,90€ |
99.074.487 | ~1000 | 61: 24: 37 ժ | 0% | 1803,16€ |
99.072.896 | ~1000 | 62: 22: 20 ժ | 0% | 1803,13€ |
Σ284.802.766 | ~ Ø550 | Σ159: 11: 37 ժ | 0% | Σ € 5183,41 |
Նշում. Բլոգի այս գրառումը, ներառյալ բոլոր գրերը, գրվել է միայն փորձարկման նպատակով: Մի օգտագործեք սցենար արդյունավետ օգտագործման, փոխարենը աշխատելու պաշտոնական Google Translation API- ի :