美文网首页
获取 google api tkk值以及 tk 值计算——纯Py

获取 google api tkk值以及 tk 值计算——纯Py

作者: KevinBaylor | 来源:发表于2019-04-04 16:16 被阅读0次
    1. 获取 tkk 值

    吾爱破解上有朋友对https://translate.google.cn/网页进行分析来获取tkk值,点这里

    下面分享一个 python 版获取 ttk 值的代码:

        def _get_token_key(self):
            if self.token_key is not None:
                return self.token_key
    
            response = requests.get("https://translate.google.com/")
            tkk_expr = re.search("(tkk:.*?),", response.text)
            if not tkk_expr:
                raise ValueError(
                    "Unable to find token seed! Did https://translate.google.com change?"
                )
    
            tkk_expr = tkk_expr.group(1)
            try:
                # Grab the token directly if already generated by function call
                result = re.search("\d{6}\.[0-9]+", tkk_expr).group(0)
            except AttributeError:
                # Generate the token using algorithm
                timestamp = calendar.timegm(time.gmtime())
                hours = int(math.floor(timestamp / 3600))
                a = re.search("a\\\\x3d(-?\d+);", tkk_expr).group(1)
                b = re.search("b\\\\x3d(-?\d+);", tkk_expr).group(1)
    
                result = str(hours) + "." + str(int(a) + int(b))
    
            self.token_key = result
            return result
    

    目前发现可用的 ttk 值有:
    422392.71207223
    406644.3293161072
    431767.4042228602

    2. 获取 tk 值

    完整版代码如下:

    # -*- coding: utf-8 -*-
    import calendar
    import math
    import time
    import requests
    import re
    
    
    class Token:
    
        SALT_1 = "+-a^+6"
        SALT_2 = "+-3^+b+-f"
    
        def __init__(self):
            self.token_key = None
    
        def calculate_token(self, text, seed=None):
            if seed is None:
                seed = self._get_token_key()
    
            [first_seed, second_seed] = seed.split(".")
    
            try:
                d = bytearray(text.encode('UTF-8'))
            except UnicodeDecodeError:
                # This will probably only occur when d is actually a str containing UTF-8 chars, which means we don't need
                # to encode.
                d = bytearray(text)
    
            a = int(first_seed)
            for value in d:
                a += value
                a = self._work_token(a, self.SALT_1)
            a = self._work_token(a, self.SALT_2)
            a ^= int(second_seed)
            if 0 > a:
                a = (a & 2147483647) + 2147483648
            a %= 1E6
            a = int(a)
            return str(a) + "." + str(a ^ int(first_seed))
    
        def _get_token_key(self):
            if self.token_key is not None:
                return self.token_key
    
            response = requests.get("https://translate.google.com/")
            tkk_expr = re.search("(tkk:.*?),", response.text)
            if not tkk_expr:
                raise ValueError(
                    "Unable to find token seed! Did https://translate.google.com change?"
                )
    
            tkk_expr = tkk_expr.group(1)
            try:
                # Grab the token directly if already generated by function call
                result = re.search("\d{6}\.[0-9]+", tkk_expr).group(0)
            except AttributeError:
                # Generate the token using algorithm
                timestamp = calendar.timegm(time.gmtime())
                hours = int(math.floor(timestamp / 3600))
                a = re.search("a\\\\x3d(-?\d+);", tkk_expr).group(1)
                b = re.search("b\\\\x3d(-?\d+);", tkk_expr).group(1)
    
                result = str(hours) + "." + str(int(a) + int(b))
    
            self.token_key = result
            return result
    
        """ Functions used by the token calculation algorithm """
        def _rshift(self, val, n):
            return val >> n if val >= 0 else (val + 0x100000000) >> n
    
        def _work_token(self, a, seed):
            for i in range(0, len(seed) - 2, 3):
                char = seed[i + 2]
                d = ord(char[0]) - 87 if char >= "a" else int(char)
                d = self._rshift(a, d) if seed[i + 1] == "+" else a << d
                a = a + d & 4294967295 if seed[i] == "+" else a ^ d
            return a
            
    
    if __name__ == '__main__':
        token=Token()
        text="ruirui ai weiwei"
        print("text:",text)
        print("tk:",token.calculate_token(text))
    
    

    懂JS的朋友可以参考嵌入JS版python代码:

    import execjs
    import requests
    
    class Py4Js():
        
        def __init__(self):
            self.ctx = execjs.compile("""
            function TL(a) {
            var k = "";
            var b = 422392;
            var b1 = 71207223;
            /*422392.71207223*/
            /*406644.3293161072*/
            /*431767.4042228602*/
            
            var jd = ".";
            var $b = "+-a^+6";
            var Zb = "+-3^+b+-f";
        
            for (var e = [], f = 0, g = 0; g < a.length; g++) {
                var m = a.charCodeAt(g);
                128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                e[f++] = m >> 18 | 240,
                e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
                e[f++] = m >> 6 & 63 | 128),
                e[f++] = m & 63 | 128)
            }
            a = b;
            for (f = 0; f < e.length; f++) a += e[f],
            a = RL(a, $b);
            a = RL(a, Zb);
            a ^= b1 || 0;
            0 > a && (a = (a & 2147483647) + 2147483648);
            a %= 1E6;
            return a.toString() + jd + (a ^ b)
        };
        
        function RL(a, b) {
            var t = "a";
            var Yb = "+";
            for (var c = 0; c < b.length - 2; c += 3) {
                var d = b.charAt(c + 2),
                d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
                d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
                a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
            }
            return a
        }
        """)
            
        def getTk(self,text):
            return self.ctx.call("TL",text)
    
    if __name__ == '__main__':
        js = Py4Js()
        text="ruirui ai weiwei"
        print("text:",text)
        print("tk:",js.getTk(text))
    
    

    最后分享一个不需要tk值的google translate接口(感谢评论区朋友分享

    http://translate.google.cn/translate_a/single?client=gtx&dt=t&ie=UTF-8&oe=UTF-8&sl=auto&tl=en&q=%E6%83%8A%E5%96%9C
    

    相关文章

      网友评论

          本文标题:获取 google api tkk值以及 tk 值计算——纯Py

          本文链接:https://www.haomeiwen.com/subject/jrzfiqtx.html