Google Translate TTS API заблокирован

18

Google внедрил капчу, чтобы заблокировать доступ людей к API TTS translate Ссылка . Я использовал его в своем мобильном приложении. Теперь он ничего не возвращает. Как обойти капчу?

    
задан ginsengtang 17.08.2015 в 16:49
источник

4 ответа

17

Добавьте квалификатор '& amp; client = tw-ob' в конец вашего запроса. Ссылка

Этот ответ больше не работает последовательно. Ваш IP-адрес будет временно заблокирован Google, если вы слишком сильно злоупотребляете этим.

    
ответ дан ginsengtang 17.08.2015 в 16:50
  • нет необходимости добавлять что-либо с клиентом просто и клиент достаточно .. –  sunil sunny 18.08.2015 в 07:52
  • страница перенаправляется на капчу, если вы просто делаете и клиент –  ginsengtang 18.08.2015 в 16:04
  • Не просто «& клиент» попробуйте этот «translate.google.com/...», после того, как «client =» будет важен –  sunil sunny 19.08.2015 в 09:15
  • Я думаю, вы имеете в виду, что можете положить что-нибудь в & client = 'anything', но это должно быть что-то. Я не знал об этом; отлично! –  ginsengtang 19.08.2015 в 15:46
  • да, что я имею в виду ... :) –  sunil sunny 19.08.2015 в 17:38
Показать остальные комментарии
8

есть 3 основных вопроса:

  1. вы должны включить «клиент» в строку запроса (работает клиент = t).
  2. (если вы пытаетесь получить его с помощью AJAX), Referer HTTP-запроса должен быть Ссылка
  3. «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.

= & GT; чтобы получить доступ к TKK, вы можете открыть веб-сайт Google Translate, а затем ввести «TKK» в консоли инструментов разработчика (например, «410353.1336369826»).

ЗАМЕЧАНИЕ, что значение TKK изменяется каждый час, и поэтому старые TKK могут быть заблокированы в какой-то момент, и обновление может потребоваться (хотя до сих пор кажется, что старые ключи могут работать в течение долгого времени).

, если вы хотите периодически обновлять TKK, его можно легко автоматизировать, но не если вы используете свой код из браузера.

здесь вы можете найти полную реализацию NodeJS: Ссылка . он предоставляет минимальный API TTS (запрос, язык) и развертывается на бесплатный сервер Heroku, поэтому вы можете проверить его онлайн, если хотите.

function shiftLeftOrRightThenSumOrXor(num, opArray) {
	return opArray.reduce((acc, opString) => {
		var op1 = opString[1];	//	'+' | '-' ~ SUM | XOR
		var op2 = opString[0];	//	'+' | '^' ~ SLL | SRL
		var xd = opString[2];	//	[0-9a-f]

		var shiftAmount = hexCharAsNumber(xd);
		var mask = (op1 == '+') ? acc >>> shiftAmount : acc << shiftAmount;
		return (op2 == '+') ? (acc + mask & 0xffffffff) : (acc ^ mask);
	}, num);
}

function hexCharAsNumber(xd) {
	return (xd >= 'a') ? xd.charCodeAt(0) - 87 : Number(xd);
}

function transformQuery(query) {
	for (var e = [], f = 0, g = 0; g < query.length; g++) {
	  var l = query.charCodeAt(g);
	  if (l < 128) {
	  	e[f++] = l;					//	0{l[6-0]}
	  } else if (l < 2048) {
	  	e[f++] = l >> 6 | 0xC0;		//	110{l[10-6]}
	  	e[f++] = l & 0x3F | 0x80;	//	10{l[5-0]}
	  } else if (0xD800 == (l & 0xFC00) && g + 1 < query.length && 0xDC00 == (query.charCodeAt(g + 1) & 0xFC00)) {
	  	//	that's pretty rare... (avoid ovf?)
	  	l = (1 << 16) + ((l & 0x03FF) << 10) + (query.charCodeAt(++g) & 0x03FF);
	  	e[f++] = l >> 18 | 0xF0;		//	111100{l[9-8*]}
	  	e[f++] = l >> 12 & 0x3F | 0x80;	//	10{l[7*-2]}
	  	e[f++] = l & 0x3F | 0x80;		//	10{(l+1)[5-0]}
	  } else {
		e[f++] = l >> 12 | 0xE0;		//	1110{l[15-12]}
		e[f++] = l >> 6 & 0x3F | 0x80;	//	10{l[11-6]}
		e[f++] = l & 0x3F | 0x80;		//	10{l[5-0]}
	  }
	}
	return e;
}

function normalizeHash(encondindRound2) {
	if (encondindRound2 < 0) {
		encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
	}
	return encondindRound2 % 1E6;
}

function calcHash(query, windowTkk) {
	//	STEP 1: spread the the query char codes on a byte-array, 1-3 bytes per char
	var bytesArray = transformQuery(query);

	//	STEP 2: starting with TKK index, add the array from last step one-by-one, and do 2 rounds of shift+add/xor
	var d = windowTkk.split('.');
	var tkkIndex = Number(d[0]) || 0;
	var tkkKey = Number(d[1]) || 0;

	var encondingRound1 = bytesArray.reduce((acc, current) => {
		acc += current;
		return shiftLeftOrRightThenSumOrXor(acc, ['+-a', '^+6'])
	}, tkkIndex);

	//	STEP 3: apply 3 rounds of shift+add/xor and XOR with they TKK key
	var encondingRound2 = shiftLeftOrRightThenSumOrXor(encondingRound1, ['+-3', '^+b', '+-f']) ^ tkkKey;

	//	STEP 4: Normalize to 2s complement & format
	var normalizedResult = normalizeHash(encondingRound2);

	return normalizedResult.toString() + "." + (normalizedResult ^ tkkIndex)
}

// usage example:
var tk = calcHash('hola', '409837.2120040981');
console.log('tk=' + tk);
 // OUTPUT: 'tk=70528.480109'
    
ответ дан Guy Rotem 17.10.2016 в 06:33
  • Привет, парень, нашел ли какое-нибудь решение? –  diank 22.02.2017 в 09:26
  • , если вы объедините два фрагмента кода, заданный запрос, целевой язык и TKK (например, 413273.3992056628), вы можете создать действительную ссылку для аудио TTS. есть ли у вас какие-либо проблемы с этим? –  Guy Rotem 22.02.2017 в 18:27
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" " Ссылка " -O ciao.mp3
(токен, вероятно, основан на времени, поэтому эта ссылка может не работать завтра)

    
ответ дан Fabrizio Lombardozzi 14.05.2016 в 02:55
  • Мне удалось заставить все работать, используя этот совет. В итоге я использовал casperjs вместо phantomjs. С casperjs было легко использовать casper.download (downloadURL, targetFile); после того, как вам удалось создать URL с текущим tk. Вы можете использовать событие resource.received в casperjs для прослушивания запросов. –  DianeH 27.05.2016 в 12:00
  • casper.on ('resource.received', function (resource) {var string = JSON.stringify (resource); if (string && (string.indexOf ("tk=")> = 0 || string.indexOf («tts»)> = 0)) {var regex = /tk=(.+)&/ var result = string.match (regex); tk = result [1]; casper.echo ('TK found:' + tk);}}); –  DianeH 27.05.2016 в 12:03
1

Вы также можете попробовать этот формат:

  1. pass q = формат urlencode вашего языка (В JavaScript вы можете использовать функцию encodeURI () и PHP имеет функцию rawurlencode ())

  2. pass tl = краткое имя языка (предположим, bangla = bn)

Теперь попробуйте следующее:

Ссылка

    
ответ дан arman hakim sagar 12.04.2018 в 05:00