前言
在前面的一篇文章如何用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()
鑒於筆者真沒有洋娃娃所以只能模擬了
簡單運行測試結果(拿隊友手機自導自演)
在這里插入圖片描述
結語
當然,這或許可能很有趣,又或許可能很無聊很簡單,只是不同的人可能有不同的看法,不同的時間段、不同的交際都可能有不同的看法,所以請各位大佬不喜勿噴,當然,如果有改進的建議,還請指出!
python相關倉庫和項目github地址:https://github.com/javasmall/python/tree/master/%E7%88%AC%E8%99%AB/Include/%E5%BE%AE%E4%BF%A1
,(微信文件目錄)有興趣的可以玩玩,star star!如果感覺還行還請各位動動小手點點收藏、點點贊👍!
歡迎關注公眾號:bigsai
長期奮戰輸出!