Watson使用指南(六)在微信公衆號中實現識圖做詩功能

本文章主要是寫一下這個項目開發的過程及之間遇到的問題,做爲記錄,也但願以此爲契機認識志同道合的朋友,一塊兒學習交流。html

目錄:程序員

  • 概述web

  • 環境準備及相關帳號申請json

  • 部署Python Flask應用到Bluemixflask

  • 經過Bluemix認證公衆微信號segmentfault

  • 識圖做詩相關功能開發api

  • 總結服務器

概述

本文將從一個開發人員角度,介紹如何使用Bluemix平臺開發和部署Python Flask應用,如何經過Bluemix進行微信公衆號認證,最後結合相關Watson服務,實現用戶向公衆號發送圖片,後臺識別圖片並返回詩文的功能。微信

Bluemix網絡

BLuemix是IBM公司推出的一個雲平臺服務,經過它不只能夠部署本地應用到雲端,還能夠調用BLuemix自己自帶的強大的一系列服務來實現不少功能。

Watson

Watson是IBM公司推出的一系列認知計算服務,包括天然語言分類,情感分析,圖像識別等等,我在本系列的前幾期已經完成了可用Python實現部分的文檔翻譯,詳見

微信公衆平臺

做爲一個程序員,使用微信公衆號,關注點就不只僅是發送推文消息了,經過本身開發,來實現一些有趣的功能,作不一樣於通常的公衆號纔是我想要的。

環境準備及相關帳號申請

註冊BLuemix帳號

申請地址:http://www.bluemix.net 在頁面右上角點擊註冊,填寫相關信息提交申請,Bluemix 會發一封確認郵件到註冊郵箱,須要手工進入註冊郵箱點擊確認,才能成功註冊。第一次登錄 Bluemix 控制檯的時候,會要求建立工做空間,建議建立在悉尼或英國(雖然訪問都很慢)。

安裝CloudFoundry工具

經過該工具,能夠在命令行使用CF相關命令進行與BLuemix之間的交互,包括部署,更新,查詢。詳見:http://docs.cloudfoundry.org/...

註冊微信公衆號

這個很簡單,並且網上一搜不少,我在這裏就不說了。

部署Python Flask應用到Bluemix

Python Flask

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使用指南(五)

經過Bluemix認證公衆微信號

在微信公衆號頁面打開開發者頁面,進行服務器配置。須要注意的是令牌本身隨意填寫就好。
新建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格式封裝的,因此在獲取用戶消息中,須要解析格式獲取消息內容;一樣,返回消息時,也要對內容封裝後再返回用戶。

總結

經過這幾天微信後臺的反饋來看,服務器不穩定,識別內容類別較少,爬取信息不穩定這三個因素常常致使用戶會收到「暫時中止服務」的消息。
後期添加異常處理模塊但願能使錯誤信息獲得人性化反饋。

這是個人公衆號,歡迎關注
圖片描述

相關文章
相關標籤/搜索