• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >微信公众号 > 微信公众开发使用消息接的方法

微信公众开发使用消息接的方法

作者:匿名 字体:[增加 减小] 来源:互联网

匿名通过本文主要向大家介绍了微信开发等相关知识,希望对您有所帮助,也希望大家支持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
    #--------------



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 微信公众号开发网页授权获取用户基本信息
  • 微信开发入门(八)页面路由
  • 微信公众号开发:通过accesstoken将长连接转换为短链接
  • 详解微信开发微信jsapi与java初步接入方法
  • 微信开发使用.Net认证"成为开发者"代码解析
  • C#开发微信门户及应用-微信小店货架信息管理
  • python基于itchat实现微信群消息同步机器人
  • 微信协议详解
  • 微信开发之springmvc mybatis项目结构搭建的java代码详解
  • 实战项目编译后不在根目录怎么办

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何获取微信好友的地理位置信息
    • 微信红包接口使用方法汇总
    • 微信公众平台开发砸金蛋
    • 开发微信公众平台测试接口准备工作介绍
    • 微信开发之生命周期函数的实例教程
    • 微信开发入门(六)用户数据解密
    • 微信开发之推送消息的实现
    • 微信公众平台开发 上传下载多媒体文件
    • 微信开发之获取access_token
    • 微信开发回复用户消息的代码实例分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有