Last active
October 12, 2016 15:52
-
-
Save Kingson/5133117 to your computer and use it in GitHub Desktop.
豆瓣电影查询助手V2.0 #1.0中通过电影ID来查询电影信息,显然让用户蛋很疼,使用电影名称才是王道,本版本就是使用电影名称,调用豆瓣Movie Search接口和Subject接口,拿到电影海报,Title,Description等信息,以图文信息返给微信用户。
#但,本版本直接返回查询出的第一条数据,有时会不准确,显示的结果不是自己所要查询的,这个问题争取在下一个版本中解决。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
本地调试的问题:可以使用Chrome或Firefox上的Advanced Rest Client插件来模拟微信服务器向你的应用发送请求,然后把Bottle的Debug功能打开,就可以看到详细的报错信息。