• 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地址就把地址补上。

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/future-dream/p/12330860.html
Copyright © 2020-2023  润新知