Google внедрил капчу, чтобы заблокировать доступ людей к API TTS translate https://translate.google.com/translate_tts?ie=UTF-8&q=test&tl=zh-TW. Я использовал его в своем мобильном приложении. Теперь он ничего не возвращает. Как обойти капчу?
Google Translate TTS API заблокирован
Ответ 1
Добавьте квалификатор '& client = tw-ob' в конец вашего запроса. https://translate.google.com/translate_tts?ie=UTF-8&q=test&tl=zh-TW&client=tw-ob
Этот ответ больше не работает последовательно. Ваш IP-адрес будет временно заблокирован Google, если вы слишком сильно злоупотребляете этим.
Ответ 2
есть 3 основных вопроса:
- вы должны включить "клиент" в строку запроса (работает клиент = t).
- (если вы пытаетесь получить его с помощью AJAX), Referer HTTP-запроса должен быть https://translate.google.com/
- "tk" изменяется для каждого запроса, и он должен быть заполнен соответствующим хешем: tk = hash (q, TKK), где q - текст, который должен быть TTSed, а TKK является var в глобальной области при загрузке translate.google.com: (введите "window.TKK" в консоли). см. хеш-функцию в нижней части этого ответа (calcHash).
:
function generateGoogleTTSLink(q, tl, tkk) {
var tk = calcHash(q, tkk);
return `https://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&client=t&ttsspeed=1&tl=${tl}&tk=${tk}&q=${q}&textlen=${q.length}`;
}
generateGoogleTTSLink('ciao', 'it', '410353.1336369826');
// see definition of "calcHash" in the bottom of this comment.
Ответ 3
Во-первых, чтобы избежать перекодирования, вы должны установить правильный пользовательский агент, например: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv: 46.0) Gecko/20100101 Firefox/46.0"
< ш > Затем, чтобы не быть заблокированным, вы должны предоставить правильный токен (параметр "tk" get) для каждого отдельного запроса.
В Интернете вы можете найти много разных сценариев, которые пытаются вычислить токен после большого количества обратного проектирования... но каждый раз, когда большая G меняет алгоритм, вы застряли снова, поэтому гораздо проще получить ваш токен только наблюдая в глубоких похожих запросах на перевод страницы (с вашим текстом в URL-адресе).
Вы можете прочитать время маркера по времени grepping "tk =" из вывода этого простого кода с помощью phantomjs:
"use strict";
var page = require('webpage').create();
var system = require('system');
var args = system.args;
if (args.length != 2) { console.log("usage: "+args[0]+" text"); phantom.exit(1); }
page.onConsoleMessage = function(msg) { console.log(msg); };
page.onResourceRequested = function(request) { console.log('Request ' + JSON.stringify(request, undefined, 4)); };
page.open("https://translate.google.it/?hl=it&tab=wT#fr/it/"+args[1], function(status) {
if (status === "success") { phantom.exit(0); }
else { phantom.exit(1); }
});
поэтому в конце вы можете получить свою речь с чем-то вроде:
wget -U "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv: 46.0) Gecko/20100101 Firefox/46.0"
" http://translate.google.com/translate_tts?ie=UTF-8&tl=it&tk=52269.458629&q=ciao&client=t" -O ciao.mp3
(токен, вероятно, основан на времени, поэтому эта ссылка может не работать завтра)
Ответ 4
Вы также можете попробовать этот формат:
-
pass q = формат urlencode вашего языка (в JavaScript вы можете использовать функцию encodeURI(), а PHP имеет функцию rawurlencode())
-
pass tl = краткое имя языка (предположим, bangla = bn)
Теперь попробуйте следующее: