有道翻译js逆向解析

文章目录

    • 一、需求
    • 二、思路分析
    • 三、遇到的问题及解决措施
    • 四、代码分享

一、需求

爬虫实现“有道翻译”

二、思路分析

1、明确目标url

抓包前可以清空网页加载出来的数据包;抓包过程中可以查看preview或者response响应是否有我们所需要的数据,以此确认url

有道翻译js逆向解析_第1张图片
有道翻译js逆向解析_第2张图片

2、向url发送请求、获取对应的响应

向目标网址发送请求时,需要确定请求方式–post请求,需要携带data参数,提交表单数据

有道翻译js逆向解析_第3张图片

3、提取翻译的结果

结果发现,无法获取到翻译信息,出现了errorCode

有道翻译js逆向解析_第4张图片
有道翻译js逆向解析_第5张图片

三、遇到的问题及解决措施

(1)观察流程

a. 观察发现,form data中的sign、salt、lts的值会随着翻译内容i的变化而变化

有道翻译js逆向解析_第6张图片

b. 有一定反爬经验的话,可以猜测lts是时间戳,经过时间戳在线转换工具的验证,确实如此

有道翻译js逆向解析_第7张图片

c. 观察发现,salt的值和lts的有点像,salt就是在lts后面加了一个数字(加盐操作)

有道翻译js逆向解析_第8张图片

实际上,sign是在js文本中的js代码中加密生成的,那么我们需要在对应的js代码中找到其加密过程

(2)分析流程
有道翻译js逆向解析_第9张图片
有道翻译js逆向解析_第10张图片
有道翻译js逆向解析_第11张图片
有道翻译js逆向解析_第12张图片

r = "" + (new Date).getTime()   # r: 获取时间戳

i = r + parseInt(10 * Math.random(), 10)   # i: r + 一个随机数字

return {
          ts: r,     # ts: 以毫秒为单位的格林尼治时间戳
          bv: t,
          salt: i,   # salt: 时间戳+一位随机数字
          sign: n.md5("fanyideskweb" + e + i + "Ygy_4c=r#e#4EX^NUGUc5")   # sign: 使用md5加密算法对明文参数加密得到的密文,e是翻译内容,i也是salt
       }

lts:ts    # lts:以毫秒为单位的格林尼治时间戳

(3)结论

(1)lts – 以毫秒为单位的格林尼治时间戳

int(time.time()*1000)

(2)salt – 以毫秒为单位的格林尼治时间戳 + 一个随机数字

int(time.time()*1000) + random.randint(0,9)

(3)sign – n.md5(“fanyideskweb” + e + i + “Ygy_4c=r#e#4EX^NUGUc5”)

hashlib.md5(明文参数.encode()).hexdigest()

四、代码分享

代码完善:

  1. 当输入“有道翻译”无法翻译的内容时,会报错,所以可以使用try…except…捕获异常
  2. 使用while True循环翻译
import requests
import time
import random
import hashlib
 
 
while True:
    content = input("请输入你要翻译的内容:")
 
    lts = int(time.time() * 1000)
    salt = lts + random.randint(0, 9)
    sign_para = "fanyideskweb" + str(content) + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5"
    sign = hashlib.md5(sign_para.encode()).hexdigest()
 
    url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
 
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
        "Referer": "https://fanyi.youdao.com/"
    }
 
    form_data = {
        "i": content,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": str(salt),
        "sign": str(sign),
        "lts": str(lts),
        "bv": "ac3968199d18b7367b2479d1f4938ac2",
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME"
    }
    response = requests.post(url, headers=headers, data=form_data)
 
    try:
        dict_data = response.json()  # 解析json参数
 
        print("翻译结果:", dict_data["translateResult"][0][0]["tgt"])  # 除此方法,也可以使用jsonpath解析数据
 
    except:
        print("您输入的内容无法翻译,请重新输入..")
 
        continue  # 跳出本次循环,进行下一次循环
  • 写在最后:有任何代码问题,欢迎交流~

你可能感兴趣的:(Python爬虫,javascript,爬虫,python)