JS逆向--有道翻译

一、目标

有道翻译网站:https://fanyi.youdao.com/

通过有道翻译的接口,代码实现翻译功能

二、分析

  • 当我们输入翻译内容时,会局部刷新出翻译结果
  • 打开抓包工具,重新输入一个翻译内容,在’XHR‘下会捕获到一个ajax请求数据包
    • url:’https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule‘
    • POST请求方式
    • 表单数据中i(需要翻译的内容)、salt、sign、lts参数是动态变化的,bv参数虽然不变,但是经过了加密
    • JS逆向--有道翻译
     然后我们可以全局搜索变化的参数,比如sign,发现它在一个js文件中,打开该js文件进行格式化显示,然后局部搜索sign,发现15处,然后可以一个个看,找到与加密算法相关的地方,这里md5我们很熟悉
    • JS逆向--有道翻译
  • 我们可以在这几个地方打断点,重新输入翻译内容进行调试
    • JS逆向--有道翻译
    • JS逆向--有道翻译
  • 通过分析js发现:
    • i:需要翻译的内容
    • lts:时间戳 *1000,然后取整
    • salt:lts后面再添上一位0-9之间的随机数
    • sign:将(‘fanyideskweb‘ + i + salt + ‘Tbh5E8=q6U3EXe+&L[4c@‘)进行md5加密
    • bv:浏览器版本号,将User-Agent中第一个/以及前面的内容去掉后,进行md5加密
  • 接下来我们就可以通过python代码去实现JS逆向,但是需要注意的是,有道网站需要验证headers中的cookie、User-Agent以及Referer参数,否则无法获取到数据,因此我们可以考虑使用requests模块中的session去发送请求,它会帮我们处理cookie

三、代码实现

# coding:utf-8
import requests
import time
import random
from hashlib import md5
from fake_useragent import UserAgent


class YouDao:
    def __init__(self):
        self.ua = UserAgent(use_cache_server=False).random  # 生成一个随机User-Agent
        self.get_url = https://fanyi.youdao.com/
        self.post_url = https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
        self.headers = {
            Referer: self.get_url,
            User-Agent: self.ua
        }
        self.sess = requests.session()

    def start(self):
        # 通过session发送请求,会获得cookie,再次发送请求时会携带上
        self.sess.get(url=self.get_url, headers={User-Agent: self.ua})
        while True:
            i = input(请输入需要翻译的内容(q退出):)
            if i == q:
                self.sess.close()
                break
            # js逆向
            lts = str(int(time.time() * 1000))  # 时间戳*1000的整数部分字符串
            bv = md5(self.headers[User-Agent].partition(/)[-1].encode()).hexdigest()  # md5加密的浏览器版本
            salt = lts + str(random.randint(0, 9))  # lts后面添上一个0-9的随机整数
            sign = md5((fanyideskweb + i + salt + Tbh5E8=q6U3EXe+&L[4c@).encode()).hexdigest()  # md5加密的签名
            form_data = {
                i: i,  # 需要翻译的内容
                from: AUTO,
                to: AUTO,
                smartresult: dict,
                client: fanyideskweb,
                salt: salt,
                sign: sign,
                lts: lts,
                bv: bv,
                doctype: json,
                version: 2.1,
                keyfrom: fanyi.web,
                action: FY_BY_REALTlME
            }
            result = self.sess.post(url=self.post_url, headers=self.headers, data=form_data).json()[translateResult][0][0][tgt]
            print(翻译结果:%s%result)

if __name__ == __main__:
    YouDao().start()

四、运行结果展示

请输入需要翻译的内容(q退出):中国
翻译结果:China
请输入需要翻译的内容(q退出):hello
翻译结果:你好
请输入需要翻译的内容(q退出):q

Process finished with exit code 0

 

JS逆向--有道翻译

上一篇:Ajax


下一篇:PHP $this,self,static 的区别