zoukankan      html  css  js  c++  java
  • 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(){vars+a\\x3d(-?d+);vars+b\\x3d(-?d+);returns+(d+)+#isU", $conts, $arr)){
        $tkk = $arr[3] .'.'.($arr[1] + $arr[2]) ;
        exit($tkk) ;
        //var_dump($arr);
    }else{
        exit("0");
    }
    
    ?>

    好了、现在主要矛盾tk已解决,其余的就只要模拟一下http请求就可以了...

    GG

  • 相关阅读:
    编程用外星人宏建设置教程(在网上找了好久没几个相关帖子,自己研究写下来留个备忘吧)
    通过selenium+pyautogui模拟登陆淘宝(完美实现)
    python之字符串的五种拼接方式
    python之批量文件重命名
    爬虫系列之链家的信息爬取及数据分析
    跟潭州学院的强子老师学习网络爬虫---爬取全书网
    Python之编写测试用例,unittest模块中的TestCase类中的六种断言方法,以及setUp()函数。
    Python学习之路
    GridBagLayout的帮助类
    eclipse和cygwin搭建C++环境的修正版本
  • 原文地址:https://www.cnblogs.com/love-zf/p/5891976.html
Copyright © 2011-2022 走看看