再也不怕和老外交流了!我用python给大家写个微信聊天翻译助手

前言



在前面的一篇文章如何用python“优雅”的调用有道翻译?中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始。现在笔者又回来了,当你遇到一些外国小哥哥小姐姐很心动、想结识交流,但英语水平或其他水平还在提升阶段,这个小工具可以帮你渡过难关!Teach you how to flirt gracefully with code。在本文中,我将详细讲解这个翻译的具体实现!对于实现的主要功能:通过微信聊天监听一些关键的口令,开启自己说的话的翻译模式和对面说的话的翻译模式!


设计思路:前面有了调用翻译,我们可以和翻译接口和微信的api结合起来做一些有趣的事情,主要就是利用微信api对自己发的消息进行监测,然后有些关键字判断作为开关、修改翻译语言等等(逻辑可以自己设置),接着去

请求有道翻译,利用程序自动发送翻译的话给对方。然后再假装把自己当成一无所知的萌新------看你怎么操作了(手动滑稽)


当然,如果你有个韩国朋友,他说的话自动翻成中文,发给你,你说的话自动翻成韩文再发给他。有本事有资源的小哥哥小姐姐可以去试试洋妞洋娃娃

详细设计

既然前面的思路很明确了,那么咱么一步一步来,如何攻克其中的种种问题。主要两个方面,一个是单独的微信api和单独的请求有道翻译一些其他规则,另一方面是将两者整合起来,可以让人人性化的操作!

当然解决了这两项之后,你就可以自己实现一些逻辑开关,而我就用我的逻辑简单的实现了一下!

环境:win/linux
编译器:pycharm


额外模块:itchat、requests

微信api

微信方公开了微信网页版的api。python中的itchat模块就可以直接使用。当然摸索起来也是需要时间。有些必要的学习步骤我就放上了。

1 . 对于itchat模块的扫码登录。后面可以不加参数,但是加了这个hotReaload之后短期内可以不需要扫码,不然每次启动扫码耽误效率。

<code>import itchat itchat.auto_login(hotReload=True) /<code>

2 . 至于还有一个发消息的api也很简单,后面的userName是用户的唯一的被加密的字段,当然,文件传输助手有专门id,还有其他搜索好友名通过返回的json串也可以获得用的该id。总之这个字段很好获得。

<code>itchat.send("你好",toUserName = userName) /<code>

3 . 最重要的就是消息的监听了,对于消息监听,大部分百度到的结果都是将程序做成机器人,监听对面消息然后自动回复,但是笔者要的不是这个效果,我是想监听自己移动端微信发的消息然后进行分析啥啥啥的。

对于正常的监听都是这样的

<code># 注册消息响应事件,消息类型为itchat.content.TEXT,即文本消息。也可以监听多种类型可自行百度 @itchat.msg_register(itchat.content.TEXT) def text_reply(msg):    return msg['Text']#return “字符串” 当接受到对面消息时候,就会发过去充当机器人  itchat.run() /<code>

但是,如果你如果再其中print(msg).你会发现你自己发的消息也会被监听到,这里的就是from you send to he/she。所以可以获取里面内容自己利用itchat发送send的api主动发送消息。当然,你发送的内容主体等各种信息都在里面,py正好也很方便操作字典。


那么这部分的最终设计是这样的:
其中如果是对面发来的消息我们直接return 字符串就会发送,如果是自己发的消息,自己send调用发送信息即可!


<code># 注册消息响应事件,消息类型为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() /<code>

有道api

对于其他的前面已经分析过,这里需要注意的是翻译成的语言,比如中翻译英(en)、日语(ja)、韩语(ko)等等。所以你点几个典型的放到逻辑处理里面就好了。

整体逻辑

当然,我想写个逻辑可以控制发送翻译的开始、结束。所以我监听用两个个Boolean类型控制整个开始和暂停,其中jud用来判断自己是否开启自己说的话的装(b)翻译模式。而参数isreturn用来控制判断是否翻译洋娃娃说的话。关键词这里我选开始作为开始,停止作为结束控制自己说的话。而翻译模式,停止翻译则用来控制开始和停止说的话。英语、日语、韩语、法语、等作为翻译语言更改的关键词。

那么,一旦程序跑起来,一切都在我们的掌控之中,当然,测试过效率,虽然那个itchat,和有道翻译的数据都是通过http传输的,但是其实效率还行,对于聊天来说传输效率是可以接受的。延迟不算很大,能满足基本需求。但是切记不要太快太频繁哈,防止有道把你的ip封了你就无法请求了。

代码和运行结果

就这样,我把项目的代码完整的供出来。

项目github地址(微信模块):https://github.com/javasmall/python
欢迎star!

<code>#更多请关注公众号: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() /<code>

鉴于笔者真没有外国小哥哥小姐姐好友所以只能模拟了
简单运行测试结果(拿队友手机自导自演)

结语

当然,这或许可能很有趣,又或许可能很无聊很简单,只是不同的人可能有不同的看法,不同的时间段、不同的交际都可能有不同的看法,所以请各位大佬不喜勿喷,当然,如果有改进的建议,还请指出!
python相关仓库和项目github地址:https://github.com/javasmall/python/tree/master/%E7%88%AC%E8%99%AB/Include/%E5%BE%AE%E4%BF%A1,(微信文件目录)有兴趣的抓紧去试试吧!如果感觉还行还请各位动动小手点赞转发分享

欢迎关注公众号:bigsai

欢迎关注头条号:一直码农一直爽

关注我,长期分享知识和乐趣!