Python调用金山词霸翻译接口实战:逆向动态sign参数与断点调试详解
本文详细演示如何使用Python调用金山词霸在线翻译接口。重点讲解如何通过浏览器开发者工具Network面板抓取XHR请求,定位动态sign参数,并利用断点调试追踪其生成逻辑。文章涵盖从基础请求构建到逆向MD5加密算法的全过程,提供完整代码实现,帮助开发者掌握接口逆向与调试技巧。
金山词霸翻译接口逆向与Python实现
今天尝试使用Python获取金山词霸的翻译功能,接口地址如下: ICIBA传送门 访问该链接后,界面显示较为简洁干净。

使用开发者工具抓取网络请求
按下F12打开浏览器调试工具,切换到Network(网络)选项卡,并筛选出XHR类型请求。

此步骤用于监控页面内的网络数据传输。XHR指不刷新页面的异步网络传输,即常说的Ajax(Asynchronous JavaScript and XML)。 接着在翻译输入框中输入内容并点击翻译按钮。

此时左侧页面显示翻译结果,右侧调试窗口中出现两条数据传输记录。 面对两条记录,我们需要确定哪一条是有效的。点击查看详情…… 发现两条记录内容完全一致,因此任选其中一条即可。 点击该记录查看后续详细信息。

首先关注Request URL(请求地址),这正是我们需要调用的API接口。 先记录下来…… (你可以选择复制粘贴,或者手动输入,甚至抄写在笔记本上。) 同时注意下方的Post方法,这是请求类型,务必使用POST而非GET。 继续向下查看,

构建基础请求参数与字典
上半部分看似熟悉?没错,那是URL链接中的参数。既然URL中已包含,这部分可以忽略。 下半部分则是需要提交的数据负载。 将这部分数据转换为字典格式:
data = {
'from':'zh'
'to':'en'
'q':'风'
}
from和to字段含义明确,分别代表源语言和目标语言。为了简化处理,无论输入何种语言,均将其设置为“auto”,让服务器自动识别语言。 q字段代表待查询的词汇,我们可以使用变量q来表示。修改后的字典结构如下:
data = {
'from':'auto'
'to':'auto'
'q':q
}
数据部分已就绪,接下来构建请求头(Headers)。 回到调试工具查看具体信息。

headers即请求头部信息,其中包含大量字段,我们只需关注关键部分。 必须包含**User-Agent:**字段。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'
}
编写Python请求代码
所需要素已齐备,现在开始编写代码: 首先引入必要的库文件,
import requests
随后在调试工具中查看返回值,确认获取内容的格式。通常返回值可能是json或html格式。

此处展示返回结果,确认为json数据格式。 使用变量q接收用户输入的文本。
q = input('请输入要翻译的内容:')
整理后的完整代码如下:
import requests
q = input('请输入要翻译的内容:')
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url = 'https://ifanyi.iciba.com/index.php?c=trans&m=fy&client=6&auth_user=key_ciba&sign=c1b23d3ff9163427'
data = {
'from':'auto',
'to':'auto',
'q':q
}
res = requests.post(url=url,headers=headers,data=data).json()
print(res)
运行代码进行测试。

输入需要翻译的内容,

结果返回正常,数据格式为json,其中包含我们需要的翻译结果。 尝试更换词汇进行测试……

动态sign参数分析与断点调试
出现错误提示,为什么会失败? 让我们在浏览器中直接测试。

展开查看详细信息……

发现问题所在:sign参数值不同…… 前一个sign是什么?
sign=c1b23d3ff9163427'
这个是
sign=4b733a5ea3f4dd5a
sign是动态生成的,该如何处理?需要找到其生成方法!

观察代码位置……
这是运行代码的具体位置,点击进入……

代码行很长,如何处理? 查看左下角的大括号图标,点击即可展开代码。

代码已格式化排列整齐…… 接下来在此处查找sign的生成位置,使用Ctrl+F快捷键进行搜索。

共有23个匹配结果,逐一排查……寻找看起来像加密逻辑的部分……

看到此处正在拼接URL。上方即为sign的加密逻辑。 sign后拼接的是变量r,r由上一行计算得出,
r = c()("6key_cibaifanyicjbysdlove1".concat(t.q.replace(/(^\s*)|(\s*$)/g, ""))).toString().substring(0, 16);
观察发现,这个r是由一系列字符串拼接而成的,具体包含哪些内容?
1、"6key_cibaifanyicjbysdlove1"
2、t.q.replace(/(^\s*)|(\s*$)/g, "")
第一部分较为简单,是一串固定字符串。 第二部分呢?t.q代表什么?我们来查找一下…… 好,我们在这一行设置断点,即在行号左侧点击一下。

看到蓝色标签了吗?这就是断点。程序运行至此处时会暂停,并展示当前状态。断点已设置,
点击翻译按钮,让程序运行看看。

程序运行至断点处停止,并显示当前参数。将鼠标悬停在q上……

所得内容!原来就是我们要查询的词汇…… 随后将它们拼接在一起……
"6key_cibaifanyicjbysdlove1"+"云"
可是c()函数又是什么?查看加密后的结果是什么。

这个字符串看起来很眼熟,很像MD5哈希值。 好的,找一个MD5加密工具进行测试,将加密前的字符串拼接起来。
"6key_cibaifanyicjbysdlove1云"
然后将其放入MD5加密工具中,查看结果。

观察这里……

是不是这个?32位加密结果的前16位! 再次验证,换一个词查询,我们查询“雨”。

我将字符串拼接好。
"6key_cibaifanyicjbysdlove1雨"
放入MD5工具中查看。

实现MD5加密与完整代码整合
结果是否一致?好了,现在已知sign的加密规则,我们可以自行实现该sign加密。 使用MD5需要引用新的库文件。
import hashlib
关于MD5的具体用法,可以参考:
import hashlib
hash = hashlib.md5()#md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hash.update(bytes('admin',encoding='utf-8'))#要对哪个字符串进行加密,就放这里
print(hash.hexdigest())#拿到加密字符串
# hash2=hashlib.sha384()#不同算法,hashlib很多加密算法
# hash2.update(bytes('admin',encoding='utf-8'))
# print(hash.hexdigest())
hash3 = hashlib.md5(bytes('abd',encoding='utf-8'))
''' 如果没有参数,所有md5遵守一个规则,生成同一个对应关系,如果加了参数,
就是在原先加密的基础上再加密一层,这样的话参数只有自己知道,防止被撞库,
因为别人永远拿不到这个参数
'''
hash3.update(bytes('admin',encoding='utf-8'))
print(hash3.hexdigest())
接下来编写sign的加密逻辑。
sign = (hashlib.md5(("6key_cibaifanyicjbysdlove1"+q).encode('utf-8')).hexdigest())[0:16]
再将sign拼接至URL中。
sign = (hashlib.md5(("6key_cibaifanyicjbysdlove1"+q).encode('utf-8')).hexdigest())[0:16]
url = 'https://ifanyi.iciba.com/index.php?c=trans&m=fy&client=6&auth_user=key_ciba'
url = url+'&sign='+sign
然后运行代码查看效果。

一切正常,没有问题! 最后从返回的json数据中提取出我们需要的部分。
rt= res['content']['out']
print('翻译完成:'+rt)
完整代码如下:
import requests
import hashlib
q = input('请输入要翻译的内容:')
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url = 'https://ifanyi.iciba.com/index.php?c=trans&m=fy&client=6&auth_user=key_ciba'
sign = (hashlib.md5(("6key_cibaifanyicjbysdlove1"+q).encode('utf-8')).hexdigest())[0:16]
url = url+'&sign='+sign
data = {
'from':'auto',
'to':'auto',
'q':q
}
res = requests.post(url=url,headers=headers,data=data).json()
rt= res['content']['out']
print('翻译完成:'+rt)
运行查看结果:

OK,翻译功能完成!
总结: POST请求的所有data参数均为已知,唯一变量是URL中的动态sign。难点在于查找sign的加密方式。 通常情况下,大部分sign加密使用MD5算法,关键在于找到用于加密的原始字符串。 使用断点跟踪运行过程是常用手段,但并非所有情况都能通过此方法找到结果。
到此这篇关于详解python使用金山词霸的翻译功能(调试工具断点的使用)的文章就介绍到这了,更多相关python金山词霸的翻译内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









