匿名通过本文主要向大家介绍了微信开发等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
承启
因为之前设计了要实现一个微信机器人,以向用户响应响应的文章,这个app十分地简单,并不需要特别深入的设计,而且我的想法是:拿来主义, 反正github上面那么多的用python写的博客系统,我只需要实现微信响应的部分,也就是从数据库中获取文章的数据,然后将文章的标题,url,图片等信息打包成xml格式返回给微信服务器,服务器再返回给用户。而且我发现,有菜单的会好很多,就像一个完整的app,可以直接点击察看某篇文章,而不是硬邦邦的回复。我是用别人写的一个博客系统进行改造——saepy-log.而这个博客系统又是基于tornado框架的,本来不打算染指tornado的,但是不得不硬着头皮钻研。其中遇到了很多困难,在sql语句的like写法,察看文档方面有了比较大的收获。
部署与开发
事先说明,由于我是各种折腾,所以可能照本篇文章做是做不成的。下载了saepy-log的源码后,按照这里的操作进行上传后,就可以将博客系统安装在sae平台上了,然后用svn把代码同步下来到本地工作目录,一切准备就绪。
我们要修改的是blog.py是博客的核心功能所在,还有modle.py是数据模型的关键所在,我们将要扩展数据模型功能,使之完成我们的微信功能。
在blog.py里面添加我们的微信功能类 weixin.py(由于是用tornado框架,所以方法与在django里面略有不同):
导入需要用到的包
# weixin used package
import xml.etree.ElementTree as ET
import urllib,urllib2,time,hashlib
import tornado.wsgi
import tornado.escape主要是xml的解析和一些处理字符串的包,接下来我们定义weixin类的主体:
# 添加微信推送帐号
class WeiXinPoster(BaseHandler):
#-----------------------------------------------------------------------
# 处理get方法 对应check_signature
def get(self):
global TOKEN
signature = self.get_argument("signature")
timestamp = self.get_argument("timestamp")
nonce = self.get_argument("nonce")
echoStr = self.get_argument("echostr")
token = TOKEN
tmpList = [token,timestamp,nonce]
tmpList.sort()
tmpstr = "%s%s%s" % tuple(tmpList)
tmpstr = hashlib.sha1(tmpstr).hexdigest()
if tmpstr == signature:
self.write(echoStr)
#return echoStr
else:
self.write(None);
#return None
# 处理post方法,对应response_msg
def post(self):
global SORRY
# 从request中获取请求文本
rawStr = self.request.body
# 将文本进行解析,得到请求的数据
msg = self.parse_request_xml(ET.fromstring(rawStr))
# 根据请求消息来处理内容返回
query_str = msg.get("Content")
query_str = tornado.escape.utf8(query_str)
# TODO 用户发来的数据类型可能多样,所以需要判别
response_msg = ""
return_data = ""
# 使用简单的处理逻辑,有待扩展
if query_str[0] == "h": # send help menu to user
response_msg = self.get_help_menu() # 返回消息
# 包括post_msg,和对应的 response_msg
if response_msg:
return_data = self.pack_text_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
# 分类
elif query_str[0] =="c":
category = query_str[1:]
response_msg = self.get_category_articles(category)
if response_msg:
return_data = self.pack_news_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
# 列出文章列表
elif query_str[0] =="l":
response_msg = self.get_article_list()
if response_msg:
return_data = self.pack_text_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
# 直接获取某篇文章
elif query_str[0] == "a":
# 直接获取文章的id,然后在数据库中查询
article_id = int(query_str[1:])
# 进行操作
response_msg = self.get_response_article_by_id(article_id)
if response_msg:
return_data = self.pack_news_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
# 还要考虑其他
elif query_str[0] == "s":
keyword = str(query_str[1:])
# 搜索关键词,返回相关文章
response_msg = self.get_response_article(keyword)
# 返回图文信息
if response_msg:
return_data = self.pack_news_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
elif query_str[0] == "n":
response_msg = self.get_latest_articles()
# 返回图文信息
if response_msg:
return_data = self.pack_news_xml(msg, response_msg)
else:
response_msg = SORRY
return_data = self.pack_text_xml(msg, response_msg)
self.write(return_data)
# 如果找不到,返回帮助信息
else:
response_msg = get_help_menu()
if response_msg:
return_data = response_msg
else:
return_data = SORRY
self.write(return_data)
# n for 获取最新的文章
def get_latest_articles(self):
global MAX_ARTICLE
global PIC_URL
article_list = Article.get_articles_by_latest()
article_list_length = len(article_list)
count = (article_list_length < MAX_ARTICLE) and article_list_length or MAX_ARTICLE
if article_list:
# 构造图文消息
articles_msg = {'articles':[]}
for i in range(0,count):
article = {
'title': article_list[i].slug,
'description':article_list[i].description,
'picUrl':PIC_URL,
'url':article_list[i].absolute_url
}
# 插入文章
articles_msg['articles'].append(article)
article = {}
# 返回文章
return articles_msg
#-----------------------------------------------------------------------
# 解析请求,拆解到一个字典里
def parse_request_xml(self,root_elem):
msg = {}
if root_elem.tag == 'xml':
for child in root_elem:
msg[child.tag] = child.text # 获得内容
return msg
#-----------------------------------------------------------------------
def get_help_menu(self):
menu_msg = '''欢迎关注南苑随笔,在这里你能获得关于校园的资讯和故事。回复如下按键则可以完成得到相应的回应
h :帮助(help)
l :文章列表(article list)
f : 获得分类列表
n : 获取最新文章
a + 数字 :察看某篇文章 a2 察看第2篇文章
s + 关键字 : 搜索相关文章 s科研 察看科研相关
c + 分类名 : 获取分类文章 c校园生活 察看校园生活分类
其他 : 功能有待丰富'''
return menu_msg
#--------------

