zoukankan      html  css  js  c++  java
  • Python微信公众号教程基础篇——收发文本消息

    1. 概述:

    在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果给最终用户。整个处理流程如下图所示:

    image.png

    您需要了解的背景知识有: CentOS(Linux)操作系统、PHP语言、Web.py框架、HTTP/XML协议。

    1.1 准备事项

    申请微信公众号

    微信公众号申请链接:https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN

    image.png

    考虑到申请便利性,本教程中使用订阅号“云图说”为例说明。

    购买华为弹性云服务

    华为弹性云服务购买链接:https://console.huaweicloud.com/ecm/?region=cn-east-2#/ecs/createVm

    如果没有华为云账号,需先注册华为云账号并完成实名认证。

     

    本教程中,使用公共镜像CentOS 7.4

    image.png

    建议同时购买弹性IP,后面需要再微信公众号上配置服务地址需要公网IP。

    image.png

    2. 操作步骤:

    2.1 基础软件安装

    本教程中使用Python+Web.py组合完成微信公众号开发,需要安装如下软件:

    升级默认Python版本

    CentOS 7.4自带Python版本比较老,建议升级到Python3。

    1、  查看Python版本,使用命令:

    python --version

    image.png

    2、  下载Python安装包,这里以Python 3.6.0版本为例,使用命令:

    wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0a1.tar.xz

    image.png

    3、  解压安装包,使用命令:

    tar xvf Python-3.6.0a1.tar.xz

    image.png

    4、  执行命令:

     ./configure

    执行成功出现类似如下提示:

    image.png

    如果出现类似“configure: error: no acceptable C compiler found in $PATH”提示,是因为未安装合适的编译器。

    image.png

    解决方法:安装/升级gcc及其他依赖的包,使用命令:

    sudo yum install gcc-c++

    并在随后提示安装包是否OK是,输入y并回车。出现类似如下提示说明依赖的包安装成功:

    image.png

    再重新执行./configure 命令即可。

    5、  执行命令:

     make && make install

    执行成功,提示pip错误,原因是我的系统中少了openssl-devel包,可以先忽略。

    image.png

    6、  查看python3版本,使用命令:

    python3 --version

    image.png

    7、  再使用命令:

      python3

    出现类似如下提示,则说明python3安装成功。

    image.png

    升级默认pip版本

    pip通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。Python3安装成功后自带pip3,但版本比较老,建议升级到pip最新版本。同时前面安装python3提示“Ignoring ensurepip failure: pip 8.1.1 requires SSL/TLS”错误,导致pip未成功安装。

    1、先安装openssl-devel包,使用命令:

    yum install openssl-devel -y

    image.png

    2、重新执行命令:

    make && make install

    出现如下提示说明安装pip成功:

    image.png

    3、升级pip3,使用命令:

    pip3 install --upgrade pip

    出现如下提示说明升级pip到最新版本了:

    image.png

    安装Web.py框架

    pip3 install web.py==0.40.dev0

    image.png

    安装WinSCP

    通常情况下,我们在本地Windows操作系统上编辑代码,完成后再上传至弹性云服务器上(CentOS Linux系统)。WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端, 同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。

    WinSCP安装链接:https://winscp.net/eng/docs/lang:chs

    2.2 上传代码

    1、新建main.py文件,拷贝如下代码:

    这里为和微信公众技术平台教程保持一致,也使用Web.py框架。Web.py官方教程地址:http://webpy.org/,使用如下命令安装web.py:

    # -*- coding: utf-8 -*-
    # filename: main.py
    import web
    from handle import Handle
     
    urls = (
        '/wx', 'Handle',
    )
     
    if __name__ == '__main__':
        app = web.application(urls, globals())
        app.run()

    2、新建handle.py文件,拷贝如下代码:

    # -*- coding: utf-8 -*-
    # filename: handle.py
     
    import hashlib
    import web
    import receive
    import time
    import os
     
    class Handle(object):
     
        def __init__(self):
            self.app_root = os.path.dirname(__file__)
            self.templates_root = os.path.join(self.app_root, 'templates')
            self.render = web.template.render(self.templates_root)
            
        def GET(self):
            try:
                data = web.input()
                if len(data) == 0:
                    return "hello, this is handle view"
                signature = data.signature
                timestamp = data.timestamp
                nonce = data.nonce
                echostr = data.echostr
                token = "此处内容与公众号基本配置里Token字段取值保持一致"
     
                list = [token, timestamp, nonce]
                list.sort()
                s = list[0] + list[1] + list[2]
                hashcode = hashlib.sha1(s.encode('utf-8')).hexdigest()
                print( "handle/GET func: hashcode, signature: ", hashcode, signature)
                if hashcode == signature:
                    return echostr
                else:
                    return echostr
            except (Exception) as Argument:
                return Argument
     
        def POST(self):
            try:
                webData = web.data()
                print("Handle Post webdata is:
    ", webData)
                #打印消息体日志
                recMsg = receive.parse_xml(webData)
                
                if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
                    toUser = recMsg.FromUserName
                    fromUser = recMsg.ToUserName
                    content = "欢迎关注云图说!" + str(recMsg.Content)
                    print('Reply message info:
    ')
                    print('toUser =', toUser)
                    print('fromUser = ', fromUser)
                    print('content = ', content)
                    return self.render.reply_text(toUser, fromUser, int(time.time()), content)
                else:
                    print("不支持的消息类型:",recMsg.MsgType)
                    return "success"
            except (Exception) as Argment:
                return Argment

    3、新建receive.py文件,拷贝如下代码:

    # -*- coding: utf-8 -*-
    # filename: receive.py
    import xml.etree.ElementTree as ET
     
    def parse_xml(web_data):
        if len(web_data) == 0:
            return None
        xmlData = ET.fromstring(web_data)
        msg_type = xmlData.find('MsgType').text
        if msg_type == 'text':
            return TextMsg(xmlData)
        elif msg_type == 'image':
            return ImageMsg(xmlData)
        elif msg_type == 'location':
            return LocationMsg(xmlData)
        elif msg_type == 'event':
            return EventMsg(xmlData)
                  
    class Event(object):
        def __init__(self, xmlData):
            self.ToUserName = xmlData.find('ToUserName').text
            self.FromUserName = xmlData.find('FromUserName').text
            self.CreateTime = xmlData.find('CreateTime').text
            self.MsgType = xmlData.find('MsgType').text
            self.Eventkey = xmlData.find('EventKey').text
     
    class Msg(object):
        def __init__(self, xmlData):
            self.ToUserName = xmlData.find('ToUserName').text
            self.FromUserName = xmlData.find('FromUserName').text
            self.CreateTime = xmlData.find('CreateTime').text
            self.MsgType = xmlData.find('MsgType').text
            self.MsgId = xmlData.find('MsgId').text
            
    class TextMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.Content = xmlData.find('Content').text
            
    class ImageMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.PicUrl = xmlData.find('PicUrl').text
            self.MediaId = xmlData.find('MediaId').text
     
    class LocationMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.Location_X = xmlData.find('Location_X').text
            self.Location_Y = xmlData.find('Location_Y').text
     
    class EventMsg(Msg):
        def __init__(self, xmlData):
            Event.__init__(self, xmlData)
            self.Event = xmlData.find('Event').text

    4、新建templates文件夹,在文件夹下新建reply_text.xml文件,拷贝如下代码:

    $def with (toUser,fromUser,createTime,content)
    <xml>
    <ToUserName><![CDATA[$toUser]]></ToUserName>
    <FromUserName><![CDATA[$fromUser]]></FromUserName>
    <CreateTime>$createTime</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[$content]]></Content>
    </xml>

    5、最终本地代码文件形成如下:

    image.png

    通过WinSCP工具将上述文件与目录上传至弹性云服务指定目录下:

    image.png

    2.3 启动服务

    使用如下命令启动服务:

    python3 main.py 80

    未报错,则说明启动成功,参考如下:

    image.png

    2.4 启用开发者模式

    1、公众平台官网登录之后,找到“开发”——>“基本配置”菜单栏,点击“修改配置”。

    image.png

    2、填写URL与Token取值,EncodingAESKey可以随机生成,加解密方式简单起见使用“明文模式”,点击“提交”。参考如下:

    image.png

    3、在弹出的提示框中,点击“确定”。

    image.png

    4、验证token成功,点击启用。

    image.png

    备注:如果token验证失败,请检查Token取值配置与handle.py中GET消息处理代码。

    2.5 验证

    使用微信关注公众号,任意发送一条文本消息,看是否能够收到回复。出现如下回复则表明系统处理正常。

    image.png

    来源:华为云开发者中心 

  • 相关阅读:
    SAP OPEN UI5 Step 8: Translatable Texts
    SAP OPEN UI5 Step7 JSON Model
    SAP OPEN UI5 Step6 Modules
    SAP OPEN UI5 Step5 Controllers
    SAP OPEN UI5 Step4 Xml View
    SAP OPEN UI5 Step3 Controls
    SAP OPEN UI5 Step2 Bootstrap
    SAP OPEN UI5 Step1 环境安装和hello world
    2021php最新composer的使用攻略
    Php使用gzdeflate和ZLIB_ENCODING_DEFLATE结果gzinflate报data error
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165977.html
Copyright © 2011-2022 走看看