本文章主要是寫一下這個項目開發的過程及之間遇到的問題,做爲記錄,也但願以此爲契機認識志同道合的朋友,一塊兒學習交流。html
目錄:程序員
概述web
環境準備及相關帳號申請json
部署Python Flask應用到Bluemixflask
經過Bluemix認證公衆微信號segmentfault
識圖做詩相關功能開發api
總結服務器
本文將從一個開發人員角度,介紹如何使用Bluemix平臺開發和部署Python Flask應用,如何經過Bluemix進行微信公衆號認證,最後結合相關Watson服務,實現用戶向公衆號發送圖片,後臺識別圖片並返回詩文的功能。微信
Bluemix網絡
BLuemix是IBM公司推出的一個雲平臺服務,經過它不只能夠部署本地應用到雲端,還能夠調用BLuemix自己自帶的強大的一系列服務來實現不少功能。
Watson
Watson是IBM公司推出的一系列認知計算服務,包括天然語言分類,情感分析,圖像識別等等,我在本系列的前幾期已經完成了可用Python實現部分的文檔翻譯,詳見
微信公衆平臺
做爲一個程序員,使用微信公衆號,關注點就不只僅是發送推文消息了,經過本身開發,來實現一些有趣的功能,作不一樣於通常的公衆號纔是我想要的。
申請地址:http://www.bluemix.net 在頁面右上角點擊註冊,填寫相關信息提交申請,Bluemix 會發一封確認郵件到註冊郵箱,須要手工進入註冊郵箱點擊確認,才能成功註冊。第一次登錄 Bluemix 控制檯的時候,會要求建立工做空間,建議建立在悉尼或英國(雖然訪問都很慢)。
經過該工具,能夠在命令行使用CF相關命令進行與BLuemix之間的交互,包括部署,更新,查詢。詳見:http://docs.cloudfoundry.org/...
這個很簡單,並且網上一搜不少,我在這裏就不說了。
Python Flask 是基於Python的一種輕量級網絡框架,便捷易用。這個應用中Flask僅僅起到傳遞參數的做用,對於Flask自己的使用不是不少。這就是說,你一樣能夠僅僅使用Python,由於Python自己也能夠提供網絡服務。
在Bluemix首頁點擊建立應用,新的頁面中會顯示不少可建立的應用案例,下拉菜單找到Flask,建立,根據提示填寫域名等信息。建立後根據頁面提示下載模板代碼到本地。
要想在bluemix下成功運行應用,至少須要有manifest.yml,requirements.txt,runtime.txt和app.py這四個文件。
manifest.yml
這是應用程序的基本配置信息,包括域名和主機名。是下載源碼後默認的,不須要更改。
requirements.txt
這個文件中包含應用所須要的第三方依賴,好比個人應用裏是這樣的:
Flask watson_developer_cloud lxml
flask是Python網絡框架。watson_developer_cloud用於調用Watson服務。lxml包用來爬取網絡信息。
runtime.txt
該文件用來指定須要的Python版本
app.py
Python應用的腳本或源代碼文件,我會在「識圖做詩相關功能開發」作詳細說明
在本地進行應用的開發,而且本地調試和運行成功後就能夠部署代碼了。在bluemix上點擊應用程序,在應用程序菜單選擇「入門」,根據提示在本地命令行使用cf命令就能夠成功push到BLuemix上。若是過程當中遇到問題,能夠經過
cf logs 應用程序名 --recent
來查看錯誤
在Bluemix應用程序界面找到建立新服務,同建立應用程序同樣,新界面會有不少服務可供選擇。這裏,我選擇的是Visual Recognition服務來進行圖片識別。建立新服務後,點擊鏈接到現有應用程序,就OK了。關於服務的建立,具體參見Watson使用指南(五)
在微信公衆號頁面打開開發者頁面,進行服務器配置。須要注意的是令牌本身隨意填寫就好。
新建auth.py,根據微信官方的文檔,獲取相關參數:
token = '微信頁面填寫的令牌' signature = request.args.get('signature', '') echostr = request.args.get('echostr', '') timestamp = request.args.get('timestamp', '') nonce = request.args.get('nonce', '') tmp = [timestamp, nonce, token] tmp.sort() tmp = ''.join(tmp) if ( hashlib.sha1(tmp).hexdigest() == signature ): return make_response(echostr)
push代碼到Bluemix,在微信頁面點擊提交,顯示提交成功,就完了經過Bluemix認證微信號。
顧名思義,識圖做詩,就包括識圖和做詩兩個部分。用到三個文件,visual.py,translate.py,poem.py
visual.py
調用Watson服務,返回的是嵌套字典信息,能夠轉換成JSON格式而後提取信息。這裏直接操做字典提取:
def VisualContent(url): visualRecognition = VisualRecognitionV3('2016-05-20', api_key='建立服務後系統返回的api_key') content = visualRecognition.classify(images_url = url) images = content.get("images") classifiers = images[0].get("classifiers") classes = classifiers[0].get("classes") res = classes[0].get("class") return res
translate.py
Watson服務中有翻譯服務,可是不支持英漢互譯。而獲取到的圖片信息都是英文,顯然不能直接去用英文來搜索相關詩文。因而我寫了這個模塊,直接在有道翻譯的網頁中獲取翻譯。
def Translate(word): url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com/' key = word data = {} data['type'] = 'AUTO' data['i'] = key data['doctype'] = 'json' data['xmlVersion'] = '1.6' data['keyfrom'] = 'fanyi.web' data['ue'] = 'UTF-8' data['typoResult'] = 'true' data = urllib.parse.urlencode(data).encode("utf-8") content = urllib.request.urlopen(url, data).read().decode("utf-8") json_content = json.loads(content) res = json_content["translateResult"][0][0]['tgt'][:2] return res
poem.py
最後一個部分,就是根據圖片內容得到詩文信息了,簡單的爬蟲,用xpath直接
得到網頁內容。
def MakePoem(word): url_base = "地址" key = word url = url_base+key res = requests.get(url) res.encoding = 'utf-8' #print(res.text) root = etree.HTML(res.content) items = root.xpath('//div[@class="sons"][2]/p[@style="margin-bottom:0px;"]')[0] item = items.xpath('string(.)') content = item.replace('\n','').replace(' ','') length = len(content) answer = content[:length-1] return answer
其餘
值得一提的是,微信公衆號中的消息處理都是以xml格式封裝的,因此在獲取用戶消息中,須要解析格式獲取消息內容;一樣,返回消息時,也要對內容封裝後再返回用戶。
經過這幾天微信後臺的反饋來看,服務器不穩定,識別內容類別較少,爬取信息不穩定這三個因素常常致使用戶會收到「暫時中止服務」的消息。
後期添加異常處理模塊但願能使錯誤信息獲得人性化反饋。
這是個人公衆號,歡迎關注