Skip to content

Instantly share code, notes, and snippets.

@Kingson
Last active October 12, 2016 15:52
Show Gist options
  • Save Kingson/5133117 to your computer and use it in GitHub Desktop.
Save Kingson/5133117 to your computer and use it in GitHub Desktop.
豆瓣电影查询助手V2.0 #1.0中通过电影ID来查询电影信息,显然让用户蛋很疼,使用电影名称才是王道,本版本就是使用电影名称,调用豆瓣Movie Search接口和Subject接口,拿到电影海报,Title,Description等信息,以图文信息返给微信用户。 #但,本版本直接返回查询出的第一条数据,有时会不准确,显示的结果不是自己所要查询的,这个问题争取在下一个版本中解决。
#! /usr/bin/env python
# coding=utf-8
__author__ = 'jszhou'
from bottle import *
import hashlib
import xml.etree.ElementTree as ET
import urllib2
# import requests
import json
@get("/")
def checkSignature():
token = "xiaomayi"
signature = request.GET.get('signature', None) # 拼写不对害死人那,把signature写成singnature,直接导致怎么也认证不成功
timestamp = request.GET.get('timestamp', None)
nonce = request.GET.get('nonce', None)
echostr = request.GET.get('echostr', None)
tmpList = [token, timestamp, nonce]
tmpList.sort()
tmpstr = "%s%s%s" % tuple(tmpList)
hashstr = hashlib.sha1(tmpstr).hexdigest()
# return "echostr: %s" % echostr
if hashstr == signature:
return echostr
else:
return None
def parse_msg():
recvmsg = request.body.read()
root = ET.fromstring(recvmsg)
msg = {}
for child in root:
msg[child.tag] = child.text
return msg
def query_movie_info():
movieurlbase = "http://api.douban.com/v2/movie/search"
# movieurlbase = "http://api.douban.com/v2/movie/subject/"
DOUBAN_APIKEY = "*************************"
movieinfo = parse_msg()
searchkeys = urllib2.quote(movieinfo["Content"].encode("utf-8"))
url = '%s?q=%s&apikey=%s' % (movieurlbase, searchkeys, DOUBAN_APIKEY)
# return "<p>{'url': %s}</p>" % url
# url = '%s%s?apikey=%s' % (movieurlbase, id["Content"], DOUBAN_APIKEY)
# header = {'Referer': url, 'Content-Type': 'application/json'}
# resp = requests.get(url=url, headers=header)
resp = urllib2.urlopen(url)
movie = json.loads(resp.read())
# return "<p>{'movie': %s}</p>" % movie
# info = movie["subjects"][0]["title"] + movie["subjects"][0]["alt"]
# info = movie['title'] + ': ' + ''.join(movie['summary'])
return movie
# return info
def query_movie_details():
movieurlbase = "http://api.douban.com/v2/movie/subject/"
DOUBAN_APIKEY = "***************************"
id = query_movie_info()
url = '%s%s?apikey=%s' % (movieurlbase, id["subjects"][0]["id"], DOUBAN_APIKEY)
resp = urllib2.urlopen(url)
description = json.loads(resp.read())
description = ''.join(description['summary'])
return description
@post("/")
def response_msg():
# 拿到Post过来的数据
# 分析数据(拿到FromUserName、ToUserName、CreateTime、MsgType和content)
# 构造回复信息(将其中content变为返回给用户的信息)
msg = parse_msg()
textTpl = """<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>"""
pictextTpl = """<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
<FuncFlag>1</FuncFlag>
</xml> """
Content = query_movie_info()
description = query_movie_details()
# if Content is not False:
# echostr = textTpl % (msg['FromUserName'], msg['ToUserName'], str(int(time.time())), msg['MsgType'], Content)
echostr = pictextTpl % (msg['FromUserName'], msg['ToUserName'], str(int(time.time())),
Content["subjects"][0]["title"], description,
Content["subjects"][0]["images"]["large"], Content["subjects"][0]["alt"])
return echostr
# else:
# echostr = textTpl % (msg['FromUserName'], msg['ToUserName'], str(int(time.time())), msg['MsgType'], "Content")
# return echostr
if __name__ == "__main__":
# Interactive mode
debug(True)
run(host='127.0.0.1', port=8888, reloader=True)
else:
# Mod WSGI launch
import sae
debug(True)
os.chdir(os.path.dirname(__file__))
app = default_app()
application = sae.create_wsgi_app(app)
@Kingson
Copy link
Author

Kingson commented Mar 12, 2013

本地调试的问题:可以使用Chrome或Firefox上的Advanced Rest Client插件来模拟微信服务器向你的应用发送请求,然后把Bottle的Debug功能打开,就可以看到详细的报错信息。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment