再也不怕和老外交流了!我用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地址(微信模块): github.com/javasmall/p… 欢迎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()

复制代码

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

结语

当然,这或许可能很有趣,又或许可能很无聊很简单,只是不同的人可能有不同的看法,不同的时间段、不同的交际都可能有不同的看法,所以请各位大佬不喜勿喷,当然,如果有改进的建议,还请指出!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容