再也不怕和老外交流了!我用python實(shí)現(xiàn)一個(gè)微信聊天翻譯助手!

當(dāng)你遇到 一些外國小哥哥小姐姐很心動(dòng)、想結(jié)識(shí)交流,但英語水平或其他水平還在提升階段,這個(gè)小工具可以幫你渡過難關(guān)! Teach you how to flirt gracefully with code 。在本文中,我將詳細(xì)講解這個(gè)翻譯的具體實(shí)現(xiàn)!對(duì)于實(shí)現(xiàn)的主要功能: 通過微信聊天監(jiān)聽一些關(guān)鍵的口令,開啟自己說的話的翻譯模式和對(duì)面說的話的翻譯模式??!

設(shè)計(jì)思路:前面有了調(diào)用翻譯,我們可以和翻譯接口和微信的api結(jié)合起來做一些有趣的事情,主要就是利用微信api對(duì)自己發(fā)的消息進(jìn)行監(jiān)測(cè),然后有些關(guān)鍵字判斷作為開關(guān)、修改翻譯語言等等(邏輯可以自己設(shè)置),接著去請(qǐng)求有道翻譯

,利用程序自動(dòng)發(fā)送翻譯的話給對(duì)方。然后再假裝把自己當(dāng)成一無所知的萌新------看你怎么操作了(手動(dòng)滑稽)

當(dāng)然,如果你有個(gè)韓國朋友,他說的話自動(dòng)翻成中文,發(fā)給你,你說的話自動(dòng)翻成韓文再發(fā)給他。有本事有資源的小哥哥小姐姐可以去 試試洋妞洋娃娃 !

詳細(xì)設(shè)計(jì)

既然前面的思路很明確了,那么咱么一步一步來,如何攻克其中的種種問題。主要兩個(gè)方面, 一個(gè) 是單獨(dú)的 微信api 和單獨(dú)的 請(qǐng)求有道翻譯一些其他規(guī)則 , 另一 方面是將兩者整合起來,可以讓人人性化的操作!

當(dāng)然解決了這兩項(xiàng)之后,你就可以自己實(shí)現(xiàn)一些邏輯開關(guān),而我就用我的邏輯簡單的實(shí)現(xiàn)了一下!

環(huán)境: win/linux 編譯器: pycharm 額外模塊: itchat、requests

微信api

微信方公開了微信網(wǎng)頁版的api。python中的 itchat 模塊就可以直接使用。當(dāng)然摸索起來也是需要時(shí)間。有些必要的學(xué)習(xí)步驟我就放上了。

1 . 對(duì)于itchat模塊的掃碼登錄。后面可以不加參數(shù),但是加了這個(gè)hotReaload之后短期內(nèi)可以不需要掃碼,不然 每次啟動(dòng)掃碼耽誤 效率。

import itchat

itchat.auto_login(hotReload=True)

復(fù)制代碼

2 . 至于還有一個(gè)發(fā)消息的api也很簡單,后面的userName是用戶的唯一的被加密的字段,當(dāng)然,文件傳輸助手有專門id,還有其他搜索好友名通過返回的json串也可以獲得用的該id??傊@個(gè)字段很好獲得。

itchat.send("你好",toUserName = userName)

復(fù)制代碼

3 . 最重要的就是消息的監(jiān)聽了,對(duì)于消息監(jiān)聽,大部分百度到的結(jié)果都是將程序做成機(jī)器人,監(jiān)聽對(duì)面消息然后自動(dòng)回復(fù),但是筆者要的不是這個(gè)效果,我是想監(jiān)聽自己移動(dòng)端微信發(fā)的消息然后進(jìn)行分析啥啥啥的。

對(duì)于正常的監(jiān)聽都是這樣的

# 注冊(cè)消息響應(yīng)事件,消息類型為itchat.content.TEXT,即文本消息。也可以監(jiān)聽多種類型可自行百度

@itchat.msg_register(itchat.content.TEXT)

def text_reply(msg):

? return msg['Text']#return “字符串” 當(dāng)接受到對(duì)面消息時(shí)候,就會(huì)發(fā)過去充當(dāng)機(jī)器人

itchat.run()

復(fù)制代碼

但是,如果你如果再其中print(msg).你會(huì)發(fā)現(xiàn)你自己發(fā)的消息也會(huì)被監(jiān)聽到,這里的就是 from you send to he/she 。所以可以獲取里面內(nèi)容自己 利用itchat 發(fā)送 send 的 api 主動(dòng)發(fā)送消息。當(dāng)然,你發(fā)送的內(nèi)容主體等各種信息都在里面,py正好也很方便操作字典。

那么這部分的最終設(shè)計(jì)是這樣的: 其中如果是對(duì)面發(fā)來的消息我們直接return 字符串就會(huì)發(fā)送,如果是自己發(fā)的消息,自己send調(diào)用發(fā)送信息即可!

# 注冊(cè)消息響應(yīng)事件,消息類型為itchat.content.TEXT,即文本消息

@itchat.msg_register(itchat.content.TEXT)

def text_reply(msg):

? ? #xxxxx 邏輯處理如果自己發(fā)

? ? itchat.send(transtr, toUserName=msg['ToUserName'])#將字符串transtr發(fā)給你發(fā)的人

? ? #xxxxx 邏輯處理如果ta發(fā)

? ? return transtr#這個(gè)加上是如果對(duì)面發(fā)消息的監(jiān)聽。也就是對(duì)面發(fā)消息過來你直接return就會(huì)自動(dòng)發(fā)送

itchat.run()

復(fù)制代碼

有道api

對(duì)于其他的前面已經(jīng)分析過,這里需要注意的是翻譯成的語言,比如中翻譯英( en )、日語( ja)、韓語( ko )等等。所以你點(diǎn)幾個(gè)典型的放到邏輯處理里面就好了。

整體邏輯

當(dāng)然,我想寫個(gè)邏輯可以控制發(fā)送翻譯的開始、結(jié)束。所以我監(jiān)聽用 兩個(gè)個(gè)Boolean類型 控制整個(gè)開始和暫停,其中 jud 用來判斷自己是否開啟自己說的話的裝(b)翻譯模式。而參數(shù) isreturn 用來控制判斷是否翻譯洋娃娃說的話。關(guān)鍵詞這里我選 開始 作為開始, 停止 作為結(jié)束控制自己說的話。而 翻譯模式 , 停止翻譯 則用來控制開始和停止說的話。 英語、日語、韓語、法語 、等作為翻譯語言更改的關(guān)鍵詞。

那么,一旦程序跑起來,一切都在我們的掌控之中,當(dāng)然,測(cè)試過效率,雖然那個(gè)itchat,和有道翻譯的數(shù)據(jù)都是通過http傳輸?shù)?,但是其?shí) 效率還行 ,對(duì)于聊天來說傳輸效率是可以接受的。延遲不算很大,能滿足基本需求。但是切記不要太快太頻繁哈,防止有道把你的ip封了你就無法請(qǐng)求了。

代碼和運(yùn)行結(jié)果

就這樣,我把項(xiàng)目的代碼完整的供出來。

項(xiàng)目github地址(微信模塊): github.com/javasmall/p… 歡迎star!

#更多請(qǐng)關(guān)注公眾號(hào):bigsai

import itchat

import requests

import hashlib

import time

import urllib.parse

jud=False#默認(rèn)是先不開啟

isreturn=False#是否回復(fù)

To='en'#翻譯成的語言默認(rèn)是英語

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)#登錄

# 注冊(cè)消息響應(yīng)事件,消息類型為itchat.content.TEXT,文本消息

@itchat.msg_register(itchat.content.TEXT)

def text_reply(msg):

? ? # 返回信息調(diào)用信息

? ? 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:#說明需要運(yùn)行

? ? ? ? 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'])

? ? ##返回監(jiān)聽對(duì)面說的話

? ? 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)#這個(gè)加上是如果對(duì)面發(fā)消息的監(jiān)聽。比如你是雙向翻譯可以嘗試下

# 綁定消息響應(yīng)事件后,讓itchat運(yùn)行起來,監(jiān)聽消息

itchat.run()

復(fù)制代碼

鑒于筆者真沒有洋娃娃所以只能模擬了 簡單運(yùn)行測(cè)試結(jié)果(拿隊(duì)友手機(jī)自導(dǎo)自演)

結(jié)語

當(dāng)然,這或許可能很有趣,又或許可能很無聊很簡單,只是不同的人可能有不同的看法,不同的時(shí)間段、不同的交際都可能有不同的看法,所以請(qǐng)各位大佬不喜勿噴,當(dāng)然,如果有改進(jìn)的建議,還請(qǐng)指出!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容