VBA:Google翻譯(含tk算法)


 完整的tk算法:

//源自http://translate.google.cn/
TKK=eval('((function(){var a\x3d618632403;var b\x3d1485484074;return 412204+\x27.\x27+(a+b)})())');
//會變動

//源自http://translate.google.cn/translate/releases/twsfe_20161212_RC00/r/js/desktop_module_main.js
var gk = function(a) {
    return function() {
        return a
    }
},
hk = function(a, b) {
    for (var c = 0; c < b.length - 2; c += 3) {
        var d = b.charAt(c + 2), d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d), d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
        a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
    }
    return a
},
ik = null, jk = function(a) {
    var b;
    if (null !== ik)
        b = ik;
    else {
        b = gk(String.fromCharCode(84));
        var c = gk(String.fromCharCode(75));
        b = [b(), b()];
        b[1] = c();
        b = (ik = window[b.join(c())] || "") || ""
    }
    var d = gk(String.fromCharCode(116)), c = gk(String.fromCharCode(107)), d = [d(), d()];
    d[1] = c();
    c = "&" + d.join("") +
    "=";
    d = b.split(".");
    b = Number(d[0]) || 0;
    for (var e = [], f = 0, g = 0; g < a.length; g++) {
        var l = a.charCodeAt(g);
        128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = l >> 18 | 240, e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224, e[f++] = l >> 6 & 63 | 128), e[f++] = l & 63 | 128)
    }
    a = b;
    for (f = 0; f < e.length; f++)
        a += e[f], a = hk(a, "+-a^+6");
    a = hk(a, "+-3^+b+-f");
    a ^= Number(d[1]) || 0;
    0 > a && (a = (a & 2147483647) + 2147483648);
    a %= 1E6;
    return c + (a.toString() + "." +
    (a ^ b))
};

 

VBA代碼如下:

Function GoogleTranslate(strWord As String, Optional Mode As Boolean = False) As String
    'Mode為TRUE則為漢譯英,為FALSE則為英譯漢,默認是FALSE
    Dim strURL As String
    Dim strText As String
    Dim strJSScript As String
    Dim objHTTP As Object
    Dim TKKFunc As String
    Dim OtherFunc As String
    Dim objHTML As Object
    Dim DataFunc As String
    Dim tkValue As String
    Dim EncodeWord As String
    Dim strMode As String
    
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    Set objHTML = CreateObject("htmlfile")
    
    '獲取TKK函數
    strURL = "http://translate.google.cn/"
    strText = GetReponseText(objHTTP, strURL)
    TKKFunc = "TKK=" & Split(Split(strText, "TKK=")(1), "');")(0) & "');"
    
    '獲取其他函數
    strURL = "http://translate.google.cn/translate/releases/twsfe_20161212_RC00/r/js/desktop_module_main.js"
    strText = GetReponseText(objHTTP, strURL)
    OtherFunc = "var gk=" & Split(Split(strText, "var gk=")(1), "var kk=")(0)
    
    '合成完整的tk算法函數,並加上html代碼:
    strJSScript = "<html><script>" & TKKFunc & OtherFunc & "</script></html>"
    
    '計算單詞的tk值
    objHTML.write strJSScript
    tkValue = CallByName(objHTML.parentwindow, "jk", VbMethod, strWord)
    
    '將單詞進行編碼
    EncodeWord = CallByName(objHTML.parentwindow, "encodeURIComponent", VbMethod, strWord)
    
    '從服務器獲取翻譯數據
    If Mode Then
        strMode = "&sl=zh-CN&tl=en"
    Else
        strMode = "&sl=en&tl=zh-CN"
    End If
    strURL = "http://translate.google.cn/translate_a/single?client=t" _
        & strMode & "&hl=zh-CN" _
        & "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t" _
        & "&ie=UTF-8&oe=UTF-8&source=bh&ssel=0&tsel=0&kc=1" _
        & tkValue _
        & "&q=" & EncodeWord
    strText = GetReponseText(objHTTP, strURL)
    
    '自定義處理數據的js函數
    DataFunc = "getdata=function(a){var s='';a=eval(a);for(var i=0;i<a[0].length-1;i++)s+=a[0][i][0];return s}"
    strJSScript = "<html><script>" & DataFunc & "</script></html>"
    
    '獲取翻譯
    objHTML.write strJSScript
    GoogleTranslate = CallByName(objHTML.parentwindow, "getdata", VbMethod, strText)
    
    Set objHTTP = Nothing
    Set objHTML = Nothing
End Function

Private Function GetReponseText(objHTTP As Object, strURL As String)
    With objHTTP
        .Open "GET", strURL, False
        .setRequestHeader "User-Agent", "Mozilla/4.0"
        .Send
        GetReponseText = .responsetext
    End With
End Function

 


免責聲明!

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



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