js逆向实战 -- python实现百度翻译案例

一、需求

通过抓取百度翻译的翻译接口,实现中译英

二、思路分析

1.明确目标url

url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"

在这里插入图片描述
在这里插入图片描述

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

response = requests.post(url, headers=headers, data=form_data)

在这里插入图片描述
在这里插入图片描述
3.提取翻译的结果

print(response.content.decode())

三、遇到的问题及解决方法

1. bug:“error”:997

在这里插入图片描述
在这里插入图片描述

solution:可能是百度翻译的反爬措施,需要在headers请求头带上cookie进一步伪装

在这里插入图片描述

2. bug:改变翻译内容后(“什么” -> “好的” ),出现"error":998

在这里插入图片描述

solution:观察发现,不同翻译内容的sign值不同,且sign无法在element中找到,可能需要通过js逆向解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. bug:使用python运行js代码后出现报错
execjs._exceptions.ProgramError: ReferenceError: i is not defined

在这里插入图片描述

solution: 找到i,定义i

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. bug:再次运行js代码后出现新的报错
execjs._exceptions.ProgramError: ReferenceError: n is not defined

在这里插入图片描述

solution:找到n,定义n

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、代码分享

import re
import requests
import execjs   # 注意这里需要下载第三方库
# pip install PyExecJS -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

data = input("请输入你要翻译的内容:")

with open("baidu_trans.js", "r", encoding="utf-8") as f:
    # 读取js代码
    js_data = f.read()
    # 编译
    js_obj = execjs.compile(js_data)
    # 执行js代码 -- 以字符串的形式传入函数;传参
    sign = js_obj.call("e", data)
    # print(sign)

url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"

headers = {
    
    
    "Referer": "https://fanyi.baidu.com/?aldtype=16047",
    "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",
    "Cookie": ""    # 带上你的cookie
}

form_data = {
    
    
    "from": "zh",   # 中文
    "to": "en",		# 英文
    "query": data,     # 翻译的内容
    "transtype": "translang",
    "simple_means_flag": "3",
    "sign": sign,	
    "token": "a6063d67d2ad5029a79978ae39b7e8b6",
    "domain": "common"
}
response = requests.post(url, headers=headers, data=form_data)

# 提取数据 -- 使用正则匹配
res = re.findall(r'"dst":"(.*?)"', response.content.decode())[0]   
print("翻译结果:", res)

在这里插入图片描述

  • 写在最后:有任何代码问题,欢迎交流~

猜你喜欢

转载自blog.csdn.net/weixin_45844767/article/details/124554676