本文章主要是写一下这个项目开发的过程及之间遇到的问题,做为记录,也但愿以此为契机认识志同道合的朋友,一块儿学习交流。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格式封装的,因此在获取用户消息中,须要解析格式获取消息内容;一样,返回消息时,也要对内容封装后再返回用户。
经过这几天微信后台的反馈来看,服务器不稳定,识别内容类别较少,爬取信息不稳定这三个因素常常致使用户会收到“暂时中止服务”的消息。
后期添加异常处理模块但愿能使错误信息获得人性化反馈。
这是个人公众号,欢迎关注