前言
在前面的一篇文章如何用 python"优雅的" 调用有道翻译中咱们清楚的写过如何一层一层的解开有道翻译的面纱, 并且笔者说过那只是脑洞的开始. 现在笔者又回来了. 当你遇到一些外国小哥哥小姐姐很心动, 想结识交流, 但英语水平或其他水平还在提升阶段, 这个小工具可以帮你渡过难关! Teach you how to flirt gracefully with code. 在本文中, 我将详细讲解这个翻译的具体实现! 对于实现的主要功能: 通过微信聊天监听一些关键的口令, 开启自己说的话的翻译模式和对面说的话的翻译模式!
在这里插入图片描述
设计思路: 前面有了调用翻译, 我们可以和翻译接口和微信的 API 结合起来做一些有趣的事情, 主要就是利用微信 API 对自己发的消息进行监测, 然后有些关键字判断作为开关, 修改翻译语言等等(逻辑可以自己设置), 接着去请求有道翻译, 利用程序自动发送翻译的话给对方. 然后再假装把自己当成一无所知的萌新 ------ 看你怎么操作了(手动滑稽)
当然, 如果你有个韩国朋友, 他说的话自动翻成中文, 发给你, 你说的话自动翻成韩文再发给他. 有本事有资源的小哥哥小姐姐可以去试试洋妞洋娃娃!
在这里插入图片描述
详细设计
既然前面的思路很明确了, 那么咱么一步一步来, 如何攻克其中的种种问题. 主要两个方面, 一个是单独的微信 API 和单独的请求有道翻译一些其他规则, 另一方面是将两者整合起来, 可以让人人性化的操作!
当然解决了这两项之后, 你就可以自己实现一些逻辑开关, 而我就用我的逻辑简单的实现了一下!
环境: win/Linux
编译器: pycharm
额外模块: itchat,requests
微信 API
微信方公开了微信网页版的 API.python 中的 itchat 模块就可以直接使用. 当然摸索起来也是需要时间. 有些必要的学习步骤我就放上了.
1 . 对于 itchat 模块的扫码登录. 后面可以不加参数, 但是加了这个 hotReaload 之后短期内可以不需要扫码, 不然每次启动扫码耽误效率.
- import itchat
- itchat.auto_login(hotReload=True)
2 . 至于还有一个发消息的 API 也很简单, 后面的 userName 是用户的唯一的被加密的字段, 当然, 文件传输助手有专门 id, 还有其他搜索好友名通过返回的 JSON 串也可以获得用的该 id. 总之这个字段很好获得.
itchat.send("你好",toUserName = userName)
3 . 最重要的就是消息的监听了, 对于消息监听, 大部分百度到的结果都是将程序做成机器人, 监听对面消息然后自动回复, 但是笔者要的不是这个效果, 我是想监听自己移动端微信发的消息然后进行分析啥啥啥的.
对于正常的监听都是这样的
- # 注册消息响应事件, 消息类型为 itchat.content.TEXT, 即文本消息. 也可以监听多种类型可自行百度
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- return msg['Text']#return "字符串" 当接受到对面消息时候, 就会发过去充当机器人
- itchat.run()
但是, 如果你如果再其中 print(msg). 你会发现你自己发的消息也会被监听到, 这里的就是 from you send to he/she. 所以可以获取里面内容自己利用 itchat 发送 send 的 API 主动发送消息. 当然, 你发送的内容主体等各种信息都在里面, py 正好也很方便操作字典.
在这里插入图片描述
那么这部分的最终设计是这样的:
其中如果是对面发来的消息我们直接 return 字符串就会发送, 如果是自己发的消息, 自己 send 调用发送信息即可!
- # 注册消息响应事件, 消息类型为 itchat.content.TEXT, 即文本消息
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- #xxxxx 逻辑处理如果自己发
- itchat.send(transtr, toUserName=msg['ToUserName'])# 将字符串 transtr 发给你发的人
- #xxxxx 逻辑处理如果 ta 发
- return transtr# 这个加上是如果对面发消息的监听. 也就是对面发消息过来你直接 return 就会自动发送
- itchat.run()
有道 API
对于其他的前面已经分析过, 这里需要注意的是翻译成的语言, 比如中翻译英 (en), 日语(ja), 韩语(ko) 等等. 所以你点几个典型的放到逻辑处理里面就好了.
在这里插入图片描述
整体逻辑
当然, 我想写个逻辑可以控制发送翻译的开始, 结束. 所以我监听用两个个 Boolean 类型控制整个开始和暂停, 其中 jud 用来判断自己是否开启自己说的话的装 (b) 翻译模式. 而参数 isreturn 用来控制判断是否翻译洋娃娃说的话. 关键词这里我选开始作为开始, 停止作为结束控制自己说的话. 而翻译模式, 停止翻译则用来控制开始和停止说的话. 英语, 日语, 韩语, 法语, 等作为翻译语言更改的关键词.
那么, 一旦程序跑起来, 一切都在我们的掌控之中, 当然, 测试过效率, 虽然那个 itchat, 和有道翻译的数据都是通过 http 传输的, 但是其实效率还行, 对于聊天来说传输效率是可以接受的. 延迟不算很大, 能满足基本需求. 但是切记不要太快太频繁哈, 防止有道把你的 ip 封了你就无法请求了.
代码和运行结果
就这样, 我把项目的代码完整的供出来.
项目 GitHub 地址(微信模块): https://github.com/javasmall/python
欢迎 star!
- # 更多请关注公众号: bigsai
- import itchat
- import requests
- import hashlib
- import time
- import urllib.parse
- jud=False# 默认是先不开启
- isreturn=False# 是否回复
- To='en'# 翻译成的语言默认是英语
- def nmd5(str):#md5 加密
- m = hashlib.md5()
- b = str.encode(encoding='utf-8')
- m.update(b)
- str_md5 = m.hexdigest()
- return str_md5
- def formdata(transtr):
- # 待加密信息
- global To
- headerstr = '5.0 (Windows NT 10.0; WOW64) ApplewebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
- bv=nmd5(headerstr)
- ts=str(round(time.time()*1000))
- salt=ts+'90'
- strexample='fanyideskweb'+transtr+salt+'n%A-rKaT5fb[Gy?;N5@Tj'
- sign=nmd5(strexample)
- i=len(transtr)
- dict={'i':transtr,'from':'AUTO','to':To,'smartresult': 'dict',
- 'client':'fanyideskweb',
- 'salt':salt,
- 'sign':sign,
- 'ts':ts,
- 'bv':bv,
- 'doctype':'json',
- 'version':'2.1',
- 'keyfrom':'fanyi.web',
- 'action':'FY_BY_REALTlME'
- }
- return dict
- url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
- header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
- 'Referer':'http://fanyi.youdao.com/',
- 'Origin': 'http://fanyi.youdao.com',
- 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
- 'X-Requested-With':'XMLHttpRequest',
- 'Accept':'application/json, text/javascript, */*; q=0.01',
- 'Accept-Encoding':'gzip, deflate',
- 'Accept-Language':'zh-CN,zh;q=0.9',
- 'Connection': 'keep-alive',
- 'Host': 'fanyi.youdao.com',
- 'cookie':'_ntes_nnid=937f1c788f1e087cf91d616319dc536a,1564395185984; OUTFOX_SEARCH_USER_ID_NCOO=; OUTFOX_SEARCH_USER_ID=-10218418@11.136.67.24; JSESSIONID=; ___rl__test__cookies=1'
- }
- itchat.auto_login(hotReload=True)# 登录
- # 注册消息响应事件, 消息类型为 itchat.content.TEXT, 文本消息
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- # 返回信息调用信息
- global jud
- global To
- global isreturn
- text=msg['Text']
- dict = formdata(text)
- if "翻译模式" in text:
- isreturn =True
- elif "停止翻译" in text:
- isreturn=False
- if "开始" in text:
- jud=True
- elif "停止" in text:
- jud=False
- elif "英语" in text:
- To = 'en'
- elif "日语" in text:
- To = 'ja'
- elif "韩语" in text:
- To = 'ko'
- elif "法语" in text:
- To = 'fr'
- if jud:# 说明需要运行
- dict['to']=To
- dict['from']= 'AUTO'
- dict = urllib.parse.urlencode(dict)
- dict = str(dict)
- req = requests.post(url, timeout=1, data=dict, headers=header)
- val = req.JSON()
- transtr = val['translateResult'][0][0]['tgt']
- print(msg)
- itchat.send(transtr, toUserName=msg['ToUserName'])
- ## 返回监听对面说的话
- if isreturn:
- dict['from']='AUTO'
- dict['to']='zh-CHS'## 翻译成中文
- dict = urllib.parse.urlencode(dict)
- # dict = str(dict)
- req = requests.post(url, timeout=1, data=dict, headers=header)
- val = req.JSON()
- transtr = val['translateResult'][0][0]['tgt']
- print(msg)
- return 'ta 说:'+str(transtr)# 这个加上是如果对面发消息的监听. 比如你是双向翻译可以尝试下
- # 绑定消息响应事件后, 让 itchat 运行起来, 监听消息
- itchat.run()
鉴于笔者真没有洋娃娃所以只能模拟了
简单运行测试结果(拿队友手机自导自演)
在这里插入图片描述
结语
当然, 这或许可能很有趣, 又或许可能很无聊很简单, 只是不同的人可能有不同的看法, 不同的时间段, 不同的交际都可能有不同的看法, 所以请各位大佬不喜勿喷, 当然, 如果有改进的建议, 还请指出!
来源: https://www.cnblogs.com/bigsai/p/12173012.html