详解python使用金山词霸的翻译功能(调试工具断点的使用)


Posted in Python onJanuary 07, 2021

今天试着用python获取金山词霸的翻译功能,链接在这里:
ICIBA传送门
打开之后,界面是这样的,还是比较干净的。

详解python使用金山词霸的翻译功能(调试工具断点的使用)

按F12,打开调试工具,选择Network,找到XHR

详解python使用金山词霸的翻译功能(调试工具断点的使用)

这里就是查看网络传输的内容。XHR就是不刷新页面的网络传输,就是常说的ajax(阿贾克斯,像是希腊神话里的名字……)。
然后我们在翻译窗口写点儿内容,然后点翻译

详解python使用金山词霸的翻译功能(调试工具断点的使用)

看,左边的页面出现了翻译结果,右边调试窗口出现了两条数据传输。
两条?那我们选哪条呢?点开看看……
哦,天哪~两条都是一样的,那我们随便选一条就可以了。
点一下,看后面的内容

详解python使用金山词霸的翻译功能(调试工具断点的使用)

好了,首先看到的是Request URL。嗯……就是我们要的URL了。
先记下来……
(你是用复制、粘贴,还是键盘上手打?难道是抄在本子上?)
下面的Post也要记住,这是请求类型,别用成get了。
再往下,

详解python使用金山词霸的翻译功能(调试工具断点的使用)

上面那部分是不是很熟悉?对了,就是URL链接里的东西。不管他,URL里有了就好了。
下面的部分,就是要提交的数据了。
把这部分转成字典格式:

data = {
	'from':'zh'
	'to':'en'
	'q':'风'
}

 

fromto这就好理解了,就是从中文到英文嘛。好,咱们不管他是中是英,都给成“auto”,让他自己去猜去……
q就是我们查的词语,那我们就用变量q表示吧,这样改后的字典就是:

data = {
	'from':'auto'
	'to':'auto'
	'q':q
}

提交的数据有了,那我们把请求头建立起来吧
再让我们回到调试工具里去看下

详解python使用金山词霸的翻译功能(调试工具断点的使用)

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'
  }

好了,我们需要的东西都齐了,那就开始吧:
首先是引入文件,

import requests

我们再到调试工具里看下返回值,看下获取的内容是什么格式的。一般返回值有json的,也有html的。

详解python使用金山词霸的翻译功能(调试工具断点的使用)

这里把返回的结果给你了,这就是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)

好了,运行一遍试下

详解python使用金山词霸的翻译功能(调试工具断点的使用)

我们输入要翻译的内容,

详解python使用金山词霸的翻译功能(调试工具断点的使用)

不错,结果返回了,是json格式的数据,里面有我们需要的结果。
再换个词试下……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

这是什么情况?为什么错了?
好吧,我们在浏览器里试下

详解python使用金山词霸的翻译功能(调试工具断点的使用)

点开看一下……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

发现了吗?sign不一样……
前一个是什么?

sign=c1b23d3ff9163427'

这个是

sign=4b733a5ea3f4dd5a

sign是动态生成的,怎么办?找生成方法!

详解python使用金山词霸的翻译功能(调试工具断点的使用)

我们看这里……

这是运行的代码的位置,我们点进去……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

上面老长一行了,怎么办?
看左下角的大括号了吗?点下就会有惊喜!

详解python使用金山词霸的翻译功能(调试工具断点的使用)

好棒!已经排列整齐了……
下面就是在这里查找sign的位置了,Ctrl+F,开始搜索

详解python使用金山词霸的翻译功能(调试工具断点的使用)

23个结果,一个个看过去……找找哪个比较像加密的……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

看,这里是对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是什么鬼?我们来找一下……
好,我们在这一行打个断点,就是在前面的行号上点一下。

详解python使用金山词霸的翻译功能(调试工具断点的使用)

看见蓝色的标签了吧,这就是个断点。在运行的时候,运行到这里就会停止,然后把当前状态给你报出来。好了,断点有了,

咱们让点下翻译,让他运行下看看

详解python使用金山词霸的翻译功能(调试工具断点的使用)

运行到断点时,停止了,并将当前的参数显示了出来。把鼠标放在q上……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

所得寺内!原来就是我们要查的词哦……
然后就把他们拼在一起……

"6key_cibaifanyicjbysdlove1"+"云"

可是c()又是什么鬼?好吧,我们看下加密后的结果是什么

详解python使用金山词霸的翻译功能(调试工具断点的使用)

这个字符串是不是很眼熟?很像md5不是吗?
好的,那我们找一个md5加密工具试下,把加密前的字符串拼接起来

"6key_cibaifanyicjbysdlove1云"

然后我们放到md5加密工具里,看结果

详解python使用金山词霸的翻译功能(调试工具断点的使用)

看这里……

详解python使用金山词霸的翻译功能(调试工具断点的使用)

是不是这个?32位加密后的前16位!
我们再验证一下,换一个词查下,我们查下“雨”

详解python使用金山词霸的翻译功能(调试工具断点的使用)

我把字符串拼接好

"6key_cibaifanyicjbysdlove1雨"

放到md5工具里看下

详解python使用金山词霸的翻译功能(调试工具断点的使用)

是不是一样的?好了,我们知道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

然后我们运行下看看

详解python使用金山词霸的翻译功能(调试工具断点的使用)

一切OK,没问题!
最后我们从返回的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)

运行看下:

详解python使用金山词霸的翻译功能(调试工具断点的使用)

OK,翻译完工!

总结:
post请求的所有data都是已知的,只有url里有一个动态的sign。麻烦的地方就是查找sign的加密方式。
一般情况下,大部分sign的加密都是使用的md5,你只要找到用来加密的字符串就可以了。
使用断点来跟踪运行过程是比较常用的手段,但也不是全都能找到结果的。

到此这篇关于详解python使用金山词霸的翻译功能(调试工具断点的使用)的文章就介绍到这了,更多相关python金山词霸的翻译内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python脚本将文字转换为图片的实例分享
Aug 29 Python
Python实现学生成绩管理系统
Apr 05 Python
快速了解Python相对导入
Jan 12 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
浅谈python可视化包Bokeh
Feb 07 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
python join方法使用详解
Jul 30 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
pandas的resample重采样的使用
Apr 24 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
Opencv+Python识别PCB板图片的步骤
Jan 07 #Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 #Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 #Python
Django权限控制的使用
Jan 07 #Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 #Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 #Python
jupyter notebook更换皮肤主题的实现
Jan 07 #Python
You might like
下载文件的点击数回填
2006/10/09 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
jquery向后台提交数组的代码分析
2020/02/20 jQuery
Python使用filetype精确判断文件类型
2017/07/02 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
python3将变量输入的简单实例
2020/08/19 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
法国足球商店:Footcenter
2019/07/06 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
电钳专业个人求职信
2014/01/04 职场文书
人力资源主管职责范本
2014/03/05 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
入党自荐书范文
2015/03/05 职场文书
结婚典礼致辞
2015/07/28 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
调解协议书范本
2016/03/21 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技
字节飞书面试promise.all实现示例
2022/06/16 Javascript