一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用资料讲解_第1页
一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用资料讲解_第2页
一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用资料讲解_第3页
一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用资料讲解_第4页
一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用资料讲解_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用-Bottle对HTTP请求的处理发布时间:2012-07-0110:09:36,关注:+2113,赞美:+1,不爽:+1最近玩HYPERLINK/Bottle这个框架,分析了一下它的源码,顺便也理一下它是怎么处理HTTP请求的.代码结构我们先分析下bottle.py的代码结构.这个单文件的框架有2900多行,大致结构如下(手头的版本是0.10.7):0000-0140:模块载入,兼容性调整0140-0200:逻辑无关的

2、工具函数和工具类定义0200-0240:异常定义.需要注意的是,不需要消息体的HTTP响应,例如HTTP重定向之类,在bottle中也被处理成一种异常.0240-0520:URL映射相关逻辑,包括若干个路由异常的定义.0520:0860:主Bottle类的定义.0860-1440:装HTTP请求和响应的类的定义.微型框架啥都可以省省,但是这个如果再省,就不能被称为是框架了.1440-1570:各种插件.1570-1800:各种数据结构.1800-2050:乱七八糟的小函数.2050-2280:框架虽小,兼容的服务器倒真不少.2280-2450:应用控制,也挺乱的,两个用来载入app,一个起se

3、rver,还有一个用来自动重启server(这个都有啊喂,你真是微型框架咩).2450-2830:模板渲染及处理,兼容的模板系统也不少.2830-EOF:变量定义及一些实例化,以及起内置服务器的main函数.由于有实例化的部分,我们得先看看这段.一旦你要从bottle.py中引入一个名字到你自己的模块,这些代码就得执行一遍.除了那些对变量的定义外,这一段做了下面几件事情:一个用Python和Bottle实现基于微信公众API和SAE查询豆瓣电影的简单应用发布时间:2013-04-0313:47:18,关注:+594,赞美:+1,不爽:+0本文标签:HYPERLINK/news/tag/saes

4、aeHYPERLINK/news/tag/%E8%B1%86%E7%93%A3豆瓣HYPERLINK/news/tag/%E5%BE%AE%E4%BF%A1微信原始出处:HYPERLINK/?p=259好记性不如烂键盘终于完成了使用微信公众API+Python+Bottle+SAE+豆瓣API的一个通过电影名称查询并自动回复电影信息的应用,在此小小的庆祝一下,废话不多说,一切尽在代码中。PS:我这样是不是有点滥用Docstring啊,呵呵。#!/usr/bin/envpython#coding=utf-8_author_=jszhoufrombottleimport*importhashlib

5、importxml.etree.ElementTreeasETimporturllib2#importrequestsimportjsonChangeLog:03-04-03-08完成微信API+Python自动回复代码雏形,可以通过电影ID查询电影信息,以Text形式返回给用户电影Title和电影summary#03-11完成通过电影名称查询并返回图文格式的数据#03-131.增加给新关注的用户自动返回“欢迎关注豆瓣电影,输入电影名称即可快速查询电影讯息哦!”信息的功能2.完善注释信息关于本地调试问题:微信没有提供本地调试功能,给用户造成不小的麻烦。打开Bottle的Debug功能,在本地运

6、行自己的代码(启动Server),使用Chrome或Firefox上的AdvancedRestClient插件来模拟微信服务器向自己的应用发送请求,这样就可以看到详细的报错信息,方便开发者定位修复问题,其相当于,自己的应用是SAE,而AdvancedRestClient模拟的是新微信客户端和微信服务器。也有同学自己写脚本,模拟微信服务器发送数据,这也是同样的道理。遗留问题:1.从豆瓣拿到的海报图片都是竖向的,而微信中显示的是横向的,所以在微信看图片就被裁了一节,不过还好能看,如何能完整显示海报图片,有待进一步research;2.现在的通过电影名称返回的结果,实际上是拿的豆瓣返回的第一条数据,

7、这样就有可能不准确,如何精确匹配用户的查询条件,也还需要进一步研究。get(/)defcheckSignature():这里是用来做接口验证的,从微信Server请求的URL中拿到“signature”,“timestamp”,nonce和“echostr”,然后再将token,timestamp,nonce三个排序并进行Sha1计算,并将计算结果和拿到的signature进行比较,如果相等,就说明验证通过。话说微信的这个验证做的很渣,因为只要把echostr返回去,就能通过验证,这也就造成我看到一个Blog中,验证那儿只返回了一个echostr,而纳闷了半天。附微信Server请求的Url示

8、例:/?signature=730e3111ed7303fef52513c8733b431a0f933c7c&echostr=5853059253416844429×tamp=1362713741&nonce=1362771581token=*#你在微信公众平台上设置的TOKENsignature=request.GET.get(signature,None)#拼写不对害死人那,把signature写成singnature,直接导致怎么也认证不成功timestamp=request.GET.get(timestamp,None)nonce=request.GET.get(nonce,

9、None)echostr=request.GET.get(echostr,None)tmpList=token,timestamp,noncetmpList.sort()tmpstr=%s%s%s%tuple(tmpList)hashstr=hashlib.sha1(tmpstr).hexdigest()ifhashstr=signature:returnechostrelse:returnNonedefparse_msg():这里是用来解析微信ServerPost过来的XML数据的,取出各字段对应的值,以备后面的代码调用,也可用lxml等模块。recvmsg=request.body.rea

10、d()#严重卡壳的地方,最后还是在StackOverFlow上找到了答案root=ET.fromstring(recvmsg)msg=forchildinroot:msgchild.tag=child.textreturnmsgdefquery_movie_info():这里使用豆瓣的电影searchAPI,通过关键字查询电影信息,这里的关键点是,一是关键字取XML中的Content值,二是如果Content中存在汉字,就需要先转码,才能进行请求movieurlbase=/v2/movie/searchDOUBAN_APIKEY=*#这里需要填写你自己在豆瓣上申请的应用的APIKEYmovie

11、info=parse_msg()searchkeys=urllib2.quote(movieinfoContent.encode(utf-8)#如果Content中存在汉字,就需要先转码,才能进行请求url=%s?q=%s&apikey=%s%(movieurlbase,searchkeys,DOUBAN_APIKEY)#returnurl:%s%url#url=%s%s?apikey=%s%(movieurlbase,idContent,DOUBAN_APIKEY)#resp=requests.get(url=url,headers=header)resp=urllib2.urlopen(u

12、rl)movie=json.loads(resp.read()#returnmovie:%s%movie#info=moviesubjects0title+moviesubjects0alt#info=movietitle+:+.join(moviesummary)returnmovie#returninfodefquery_movie_details():这里使用豆瓣的电影subjectAPI,通过在query_movie_info()中拿到的电影ID,来获取电影的summary。movieurlbase=/v2/movie/subject/DOUBAN_APIKEY=*#这里需要填写你自己

13、在豆瓣上申请的应用的APIKEYid=query_movie_info()url=%s%s?apikey=%s%(movieurlbase,idsubjects0id,DOUBAN_APIKEY)resp=urllib2.urlopen(url)description=json.loads(resp.read()description=.join(descriptionsummary)returndescriptionpost(/)defresponse_msg():这里是响应微信Server的请求,并返回数据的主函数,判断Content内容,如果是“Hello2BizUser”,就表明是一个

14、新注册用户,调用纯文本格式返回,如果是其他的内容就组织数据以图文格式返回。基本思路:#拿到Post过来的数据#分析数据(拿到FromUserName、ToUserName、CreateTime、MsgType和content)#构造回复信息(将你组织好的content返回给用户)#拿到并解析数据msg=parse_msg()#设置返回数据模板#纯文本格式textTpl=%s0#图文格式pictextTpl=%s11#判断Content内容,如果等于Hello2BizUser,表明是一个新关注用户,如果不是,就返回电影标题,电影简介#和电影海报组成的图文信息ifmsgContent=Hello2

15、BizUser:echostr=textTpl%(msgFromUserName,msgToUserName,str(int(time.time(),msgMsgType,u欢迎关注豆瓣电影,输入电影名称即可快速查询电影讯息哦!)returnechostrelse:Content=query_movie_info()description=query_movie_details()echostr=pictextTpl%(msgFromUserName,msgToUserName,str(int(time.time(),Contentsubjects0title,description,Cont

16、entsubjects0imageslarge,Contentsubjects0alt)returnechostrif_name_=_main_:#Interactivemodedebug(True)run(host=7,port=8888,reloader=True)else:#ModWSGIlaunchimportsaedebug(True)os.chdir(os.path.dirname(_file_)app=default_app()application=sae.create_wsgi_app(app)使用bottle快速开发server程序发布时间:2012-11-2123:15:

17、10,关注:+932,赞美:+1,不爽:+1原始出处:HYPERLINK/53.htm鲁塔弗的博客做web产品,经常会有某个功能需要加载大量数据,比如中文分词,汉字转拼音等或者你需要异构化设计某个产品,httprender用php,计算或者采集程序用python这种情况下,最好的方式是把这个功能抽离出来,做成http服务python的web框架有很多,简单轻量级的singlefile框架有webpyflaskbottlewebpy现在越做越大,flask和bottle其实差不多,关于web开发框架,可以看这篇文章HYPERLINK/50.htm如何选择web开发框架,我一直用bottle,总结

18、出如下经验bottle需要升级到0.11版本以上才正确,之前版本有很多莫名bugeasy_install-Ubottle即可处理post请求,参数从request.forms.varname提取处理get请求,参数从request.query.varname提取,同时要importget,post,request,等名字如果想debug一下,加一行代码debug(1)默认的httpserver是使用python内置的SimpleHTTPServer,一秒钟可以处理10几个请求,做内部dameon的server是足够了如果需要高性能,或者要对brower用户开放,Tornado是最佳选择一个分析

19、网页的server1.#coding:utf-82.3.4.frombottleimportroute,run,request,post,debug,get5.importlutaf6.7.8.post(/tag)9.defindex():10.content=request.forms.data11.tags=lutaf.analyse(content,topK=5)12.return,.join(tags)13.14.route(/status)15.defindex():16.returnautotagserver.17.18.run(port=8090)bottle做web开发的物理设

20、计发布时间:2011-12-1321:33:40,关注:+3095,赞美:+8,不爽:+4原始出处:HYPERLINK/2011/12/bottle%E5%81%9Aweb%E5%BC%80%E5%8F%91%E7%9A%84%E7%89%A9%E7%90%86%E8%AE%BE%E8%AE%A1.htmlVimer的程序世界接着HYPERLINK/2011/11/%E5%9B%9E%E5%BD%92%E7%AE%80%E5%8D%95%EF%BC%8C%E5%90%91django%E8%AF%B4%E5%86%8D%E8%A7%81.html回归简单,向Django说再见,继续来聊用HYP

21、ERLINK/bottle做web开发。其实上一篇文章已经讲的比较清楚了,这一次主要从另一个角度来分享一下:物理设计干脆直接贴出来吧:bottle_site_tpl/|conf/|depend/|+autumn/|+jinja2/|+wtforms/|-_init_.py|-bottle.py|log/|-site.log|module/|-_init_.py|-forms.py|-models.py|-mysession.py|-web_func.py|+static/|views/|-test.html|web/|-_init_.py|-test.py|-myapp.py-setting.

22、py可以看出,最外层有两个文件,分别是setting.py和myapp.py。setting.py(很像django吧,哈哈),顾名思义,是各种配置项,包括log目录和等级,模板目录,静态文件目录等。而myapp.py的代码如下:importsettingfrombottleimportdebug,runfromwebimportappif_name_=_main_:debug(True)run(app,host=,port=80,reloader=True)相当于一个启动器,通过执行pythonmyapp.py可启动整个网站。(当然,也可以和uwsgi结合)接着我们进入第二级目录,从web目录开始:web目录用来存放Bottle的各个实例,构成了网站的主框架。其中的_init_.py代码如下:#!/usr/bin/python#-*-coding:utf-8-*-frombottleimportBottlefrombottleimportdebug,runfrombottleimportredirect,abort,static_filefrombottleimportjinja2_t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论