zoukankan      html  css  js  c++  java
  • python3 flask 微信公众号消息接收测试代码

    code

    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask import request
    import hashlib
    import time
    import re
    import xml.etree.ElementTree as ET
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "Hello World!"
    
    @app.route("/wechat", methods=["GET","POST"])
    def weixin():
        if request.method == "GET":     # 判断请求方式是GET请求
            my_signature = request.args.get('signature')     # 获取携带的signature参数
            my_timestamp = request.args.get('timestamp')     # 获取携带的timestamp参数
            my_nonce = request.args.get('nonce')        # 获取携带的nonce参数
            my_echostr = request.args.get('echostr')         # 获取携带的echostr参数
            # my_token = request.args.get('token')
            print(my_signature)
            print(my_timestamp)
            print(my_nonce)
            print(my_echostr)
            # print(my_token)
            token = '123456'     # 一定要跟刚刚填写的token一致
    
            # 进行字典排序
            data = [token,my_timestamp ,my_nonce ]
            data.sort()
            # 拼接成字符串,进行hash加密时需为字符串
            data = ''.join(data)
            #创建一个hash对象
            s = hashlib.sha1()
            #对创建的hash对象更新需要加密的字符串
            s.update(data.encode("utf-8"))
            #加密处理
            mysignature = s.hexdigest()
    
            print("handle/GET func: mysignature, my_signature: ", mysignature, my_signature)
    
            # 加密后的字符串可与signature对比,标识该请求来源于微信
            if my_signature == mysignature:
                return my_echostr
            else:
                return ""
        else:
                # 解析xml
                xml = ET.fromstring(request.data)
                toUser = xml.find('ToUserName').text
                fromUser = xml.find('FromUserName').text
                msgType = xml.find("MsgType").text
                createTime = xml.find("CreateTime")
                # 判断类型并回复
                if msgType == "text":
                    content = xml.find('Content').text
                    content=content+"已收到"
                    return reply_text(fromUser, toUser, content)
                else:
                    return reply_text(fromUser, toUser, "我只懂文字")
    
    def reply_text(to_user, from_user, content):
        """
        以文本类型的方式回复请求
        """
        return """
        <xml>
            <ToUserName><![CDATA[{}]]></ToUserName>
            <FromUserName><![CDATA[{}]]></FromUserName>
            <CreateTime>{}</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[{}]]></Content>
        </xml>
        """.format(to_user, from_user, int(time.time() * 1000), content)
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', port=879)

  • 相关阅读:
    Docker启动ubuntu容器中使用sudo后报错,bash: sudo: command not found
    Redis持久化rdb&aof
    Python3中copy模块常用功能及其他几种copy方式比较
    学习笔记:tkinter模块常用参数(python3)
    Python核心编程第二版(中文).pdf 目录整理
    11、487-3279
    10、Crashing Balloon
    9、Exponentiation
    8、Fire Net
    7、Reverse Root
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14181920.html
Copyright © 2011-2022 走看看