zoukankan      html  css  js  c++  java
  • python调用js代码解决Google翻译中的tk参数

    一、背景

    因为这次需要用到一下Google翻译,对英文翻译成中文,通过对Google翻译的分析,发现Google翻译里面有一个很重要参数tk。这个参数在每次翻译之前都会重新生成,只有校验通过了才可以将翻译的结果返回。而这个参数是使用js来生成了的。

    二、解决

    通过查阅相关的资料,在国外大佬的个人博客里面找到了这个参数的解析,国内也有很多大佬解析,这里就简单记录一下,使用python的方法去调用。

    1.1 安装PyExecJS

    通过下面的指令完成PyExecJs的安装,这样就可以在python中执行js代码。

    pip install PyExecJS

    1.2 代码封装

    通过下面的代码对输入参数的js,进行混淆解析,返回生成的tk值,直接引用即可,后面使用js.getTk方法就可以进行解析了。

    import execjs
    class
    Py4Js: def __init__(self): self.ctx = execjs.compile(""" function TL(a) { var k = ""; var b = 406644; var b1 = 3293161072; 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) js = Py4Js()

    1.3 分析

    通过上面的代码可以看到通过execjs.compile对代码进行编译,使用call函数进行调用,第一个为调用的函数名,第二个为参数。这样就可以将python中的参数传递给js,同时返回执行的结果。剩下的内容就可以按照正常的爬虫请求就可以完成了。

    三、总结

    网上也有很多资料,这里简单做个记录对以后的复习有好处。找到那个blog地址就把地址补上。

  • 相关阅读:
    [VC++]利用VS2005进行dump文件调试
    Release和Debug模式下成员变量初始化问题
    JDBC与C++的DB访问性能
    Log4J与LogBack的性能比较
    WinRar命令行参数
    玩弄C++:回调一个类成员函数
    如何将一个模板类A作为模板类B的模板参数
    HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTup
    HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTup
    使用jQuery发送POST,Ajax请求返回JSON格式数据
  • 原文地址:https://www.cnblogs.com/future-dream/p/12330860.html
Copyright © 2011-2022 走看看