距離上次寫使用python一步一步搭建微信公衆平臺(一)已經有幾個月了,當中自已也搭建了一箇中英文互譯的小應用,但是因爲英文翻中文好弄,中文翻譯成英文一直有問題,知道是編碼的問題,可是一直搞不定,因而就先擱淺了,今天又搞了搞,終於搞定了,在這裏也說下,同時也說下json格式的應用python
1. 準備,先在使用python一步一步搭建微信公衆平臺(一)中基本實現自動回覆的功能後,接着在有道詞典上申請一個key,http://fanyi.youdao.com/openapi?path=data-modemysql
2.根據有道的api使用說明web
數據接口 http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=要翻譯的文本 版本:1.1,請求方式:get,編碼方式:utf-8 主要功能:中英互譯,同時得到有道翻譯結果和有道詞典結果(可能沒有) 參數說明: type - 返回結果的類型,固定爲data doctype - 返回結果的數據格式,xml或json或jsonp version - 版本,當前最新版本爲1.1 q - 要翻譯的文本,不能超過200個字符,須要使用utf-8編碼 errorCode: 0 - 正常 20 - 要翻譯的文本過長 30 - 沒法進行有效的翻譯 40 - 不支持的語言類型 50 - 無效的key
3.知道怎麼調用後後面的就簡單了,加上你的要查詢的詞,能夠是中文,也能夠是英文,我建議返回格式doctype是json的,由於和xml相比使用更簡單,更容易理解,關於如何使用json解析,能夠看我之前寫的博文,python解析json ,咱們來查看一下有道翻譯返回的json的基本格式sql
成功返回翻譯結果都會有一個叫basic的key的,因而咱們接下來寫一個fanyi的函數,以前在頭部記得import jsonjson
def youdao(word): qword = urllib2.quote(word) baseurl = r'http://fanyi.youdao.com/openapi.do?keyfrom=yourAppName&key=yourAppKey&type=data&doctype=json&version=1.1&q=' url = baseurl+qword resp = urllib2.urlopen(url) fanyi = json.loads(resp.read()) ##根據json是否返回一個叫「basic」的key來判斷是否翻譯成功 if 'basic' in fanyi.keys(): ##下面是你自已來組織格式 trans = u'%s:\n%s\n%s\n網絡釋義:\n%s'%(fanyi['query'],''.join(fanyi['translation']),''.join(fanyi['basic']['explains']),''.join(fanyi['web'][0]['value'])) return trans else: return u'對不起,您輸入的單詞%s沒法翻譯,請檢查拼寫'% word
4.咱們將以前獲得的content進行翻譯操做api
Nword = youdao(content) return self.render.reply_text(fromUser,toUser,int(time.time()),Nword)
5.將以前的鸚鵡學舌的return刪除掉,下面在微信給你的公衆帳號發幾個詞看看能不能獲得翻譯結果微信
6.興奮了一把以後,發現只有英文能夠翻譯成中文,但中文卻不能翻譯成英文,初步推測是破編碼搞的,由於這個我擱淺了一段時間,今天終於搞定了,將獲得的content進行一下是不是unicode的判斷,若是是unicode則對其進行utf-8轉碼網絡
if type(content).__name__ == "unicode": content = content.encode('UTF-8') Nword = youdao(content) return self.render.reply_text(fromUser,toUser,int(time.time()),Nword)
關於python中的各類編碼的頭疼問題能夠google,推薦幾篇文章微信公衆平臺
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
7.之後繼續更加好玩的功能
1月23日更新,有網友反饋,說只判斷basic是否在key中,會致使不少有道原本是翻譯成功了,但個人程序沒有返回值,其實查看有道翻譯的api,它是根據errorCode來判斷是否返回成功的,若是是0則是返回正常,還有一些返回值,那麼我將個人程序進行改進,選判斷errorCode,而後再判斷translation
def youdao(word): qword = urllib2.quote(word) baseurl =r'http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=json&version=1.1&q=' url = baseurl+qword resp = urllib2.urlopen(url) fanyi = json.loads(resp.read()) if fanyi['errorCode'] == 0: if 'basic' in fanyi.keys(): trans = u'%s:\n%s\n%s\n網絡釋義:\n%s'%(fanyi['query'],''.join(fanyi['translation']),' '.join(fanyi['basic']['explains']),''.join(fanyi['web'][0]['value'])) return trans else: trans =u'%s:\n基本翻譯:%s\n'%(fanyi['query'],''.join(fanyi['translation'])) return trans elif fanyi['errorCode'] == 20: return u'對不起,要翻譯的文本過長' elif fanyi['errorCode'] == 30: return u'對不起,沒法進行有效的翻譯' elif fanyi['errorCode'] == 40: return u'對不起,不支持的語言類型' else: return u'對不起,您輸入的單詞%s沒法翻譯,請檢查拼寫'% word
這樣能夠翻譯一些不長的句子,並且還能夠翻譯韓語,日語等,但問題也出來了,即便輸入亂七八糟的內容lkajfladfaldfladkf也會給你返回個相同的內容,內容過長的話,有道和微信的定義貌似不同,有道能夠翻譯,可是微信不必定能夠返回內容,另一個問題是有引號「'」會轉碼'望網友大神共同討論解決
接下來:
使用python一步一步搭建微信公衆平臺(一)----基本的驗證與鸚鵡學舌功能
使用python一步一步搭建微信公衆平臺(三)----添加用戶關注後的歡迎信息與聽音樂功能