Google翻譯請求(難點是tk參數)


 

 

業務需求需要將一些文字翻譯一下···

但是直接調用接口收費啊啊啊啊(貌似是前幾百萬字免費,然后就開始收費了)····

就想研究一下Google翻譯接口...

想模擬Google向服務器發送一個Http請求...然后得到返回的翻譯數據;

但是發現,服務器有個驗證機制{一段時間內,如果你向服務器發送一個請求,服務器首先會返回一個TKK值,

然后還需要用這個TKK值和你要翻譯的內容生成一個tk值,主要就是這個tk值不對的話,就會返回403錯誤...}

網上找到一個例子,貌似是國外的一個大神通過js來生成的tk值,,,

package LibHW {
class jsCommon{

    function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
    }

    function tk(a,TKK) {
        for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
            var c = a.charCodeAt(f);
            128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
        }
        a = h;
        for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
        a = b(a, "+-3^+b+-f");
        a ^= Number(e[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + "." + (a ^ h)
    }
}
}

 

咦·為什么還要加上"package class",因為這段js,我要用到C#語言中,具體操作詳見我這篇文章---"在c#中運行js腳本(將js文件生成為.dll文件)"

 

主要用到的就是這個函數:
function tk(a,TKK)

//a代表的就是要翻譯的內容;
//TKK就是服務器首先返回的一個TKK值;

 

TKK獲取代碼(PHP):

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
mb_internal_encoding("UTF-8");
$timeout = 10 ;
$url = "http://translate.google.cn" ;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$conts = curl_exec($ch);
curl_close($ch);
if(preg_match("#TKK\=eval\('\(\(function\(\)\{var\s+a\\\\x3d(-?\d+);var\s+b\\\\x3d(-?\d+);return\s+(\d+)\+#isU", $conts, $arr)){
    $tkk = $arr[3] .'.'.($arr[1] + $arr[2]) ;
    exit($tkk) ;
    //var_dump($arr);
}else{
    exit("0");
}

?>

好了、現在主要矛盾tk已解決,其余的就只要模擬一下http請求就可以了...

GG

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM