资讯专栏INFORMATION COLUMN

Watson使用指南(六)在微信公众号中实现识图作诗功能

Pikachu / 1561人阅读

摘要:详见注册微信公众号这个很简单,而且网上一搜很多,我在这里就不说了。关于服务的创建,具体参见使用指南五通过认证公众微信号在微信公众号页面打开开发者页面,进行服务器配置。

本文章主要是写一下这个项目开发的过程及之间遇到的问题,作为记录,也希望以此为契机认识志同道合的朋友,一起学习交流。

目录:

概述

环境准备及相关账号申请

部署Python Flask应用到Bluemix

通过Bluemix认证公众微信号

识图作诗相关功能开发

总结

概述

本文将从一个开发人员角度,介绍如何使用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("
","").replace(" ","")
  length = len(content)
  answer = content[:length-1]

  return answer

其他
值得一提的是,微信公众号中的消息处理都是以xml格式封装的,所以在获取用户消息中,需要解析格式获取消息内容;同样,返回消息时,也要对内容封装后再返回用户。

总结

通过这几天微信后台的反馈来看,服务器不稳定,识别内容类别较少,爬取信息不稳定这三个因素经常导致用户会收到“暂时停止服务”的消息。
后期添加异常处理模块希望能使错误信息得到人性化反馈。

这是我的公众号,欢迎关注

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38456.html

相关文章

  • 识图吟诗

    摘要:架构识图吟诗架构由以下层和关联实现视图一个响应相对灵敏但不够美观的前端用户界面,只使用了原生。平台本版本部署在阿里云上,采用的流行框架。 写在前面 关于这个作品的设计理念和情怀,请看这里 初衷 随着作品的不断迭代和改进,我已经渐渐忘记初衷是什么了。是为了讨某人欢心做的小demo或是为了熟悉使用watson的练手作品,都已不大记得。然而现在,是想利用零碎的时间,做一个完整的项目。来探究A...

    zhangrxiang 评论0 收藏0
  • 浅析微信支付:微信支付简单介绍(小程序、公众、App、H5)

    摘要:本文是浅析微信支付系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。浅析微信支付前篇大纲微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。目前微信支付支持手机系统有苹果安卓和。 本文是【浅析微信支付】系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下。 浅析微信支...

    shadowbook 评论0 收藏0
  • Node.js微信公众开发

    摘要:在微信开发者工具中调试和一定要正确域名一定是备案的绑定域名需要的放在服务器上的位置一定要正确参考微信公众号开发文档 node微信公众号开发 概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装&使用 下载 gi...

    OnlyLing 评论0 收藏0
  • beecloud对接——微信支付

    摘要:微信支付方式付款码支付适用于线下场所支付支付是指商户通过调用微信支付提供的接口,在支付场景中调起微信支付模块完成收款。主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。 微信支付方式(https://pay.weixin.qq.com/sta...): 1、付款码支付————————适用于线下场所 2、JSAPI支付————————JSAPI支付是指商户...

    FingerLiu 评论0 收藏0

发表评论

0条评论

Pikachu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<