python + 腾讯云函数 实现微信公众号开发


前言

本章需创建好腾讯云账户 + 微信公众号 + python实现

并且如果想使用自己的服务器来配置微信公众号(必须要有域名不能使用ip地址)。

这里我们使用的是腾讯云函数(创建成功后自带域名)我们只要根据使用方法实现即可。

微信公众号文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

腾讯云函数使用文档:https://cloud.tencent.com/document/product/583

一、创建腾讯云函数

流程如下:
在这里插入图片描述
在这里插入图片描述
选择自定义创建->设置函数名称->往下拉到触发器配置

在这里插入图片描述
选择触发方式为aip网关触发->完成->跳转到云函数

在这里插入图片描述

日志查询用于查看服务器请求打印

在这里插入图片描述
这里用来写我们视图函数(可以把event当做request,main_handler当作主函数)

在这里插入图片描述

触发管理->访问路径就是我们微信公众号的服务器url了。

二、微信公众号接收实现

代码如下(index.py):

import json, hashlib, time
import xml.etree.ElementTree as ET
from reply import TypeMsg

def main_handler(event, context):
	print(event)
    if event['httpMethod'] == 'GET':
        return {
            "isBase64Encoded": False,
            "statusCode": 200,
            "headers": {"Content-Type": "plain/text"},
            "body": event['queryString']['echostr']
        }

    if event['httpMethod'] == 'POST':
        webData = event.get("body", None)
        xmlData = ET.fromstring(webData)
        recMsg = TypeMsg(xmlData)
        result = recMsg.send()
        return result

创建一个reply.py用于处理一些微信公众号返回参数(不要在主函数写的太复杂)。

代码如下(reply.py):

class TypeMsg(object):
    def __init__(self, xmlData):
        # 私有对象,禁止外部访问
        self.__dict = dict()
        self.__dict['ToUserName'] = xmlData.find('ToUserName').text
        self.__dict['FromUserName'] = xmlData.find('FromUserName').text
        self.__dict['CreateTime'] = xmlData.find('CreateTime').text
        self.__dict['MsgType'] = xmlData.find('MsgType').text
        self.__dict['MsgId'] = xmlData.find('MsgId').text
        if self.__dict['MsgType'] == 'text':
            self.__dict['Content'] = xmlData.find('Content').text
        elif self.__dict['MsgType'] == 'image':
            self.__dict['PicUrl'] = xmlData.find('PicUrl').text
            self.__dict['MediaId'] = xmlData.find('MediaId').text
        print(self.__dict)
    def send(self):
        result = getattr(self, self.__dict['MsgType'])
        return result

    @property
    def text(self):
        XmlForm = """
                    <xml>
                        <ToUserName><![CDATA[{FromUserName}]]></ToUserName>
                        <FromUserName><![CDATA[{ToUserName}]]></FromUserName>
                        <CreateTime>{CreateTime}</CreateTime>
                        <MsgType><![CDATA[{MsgType}]]></MsgType>
                        <Content><![CDATA[{Content}]]></Content>
                        <MsgId>{MsgId}</MsgId>
                    </xml>
                    """
        return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "headers": {"Content-Type": "application/xml"},
        "body": XmlForm.format(**self.__dict)
        }

    @property
    def image(self):
        XmlForm = """
                    <xml>
                        <ToUserName><![CDATA[{FromUserName}]]></ToUserName>
                        <FromUserName><![CDATA[{ToUserName}]]></FromUserName>
                        <CreateTime>{CreateTime}</CreateTime>
                        <MsgType><![CDATA[{MsgType}]]></MsgType>
                        <Image>
                            <MediaId><![CDATA[{MediaId}]]></MediaId>
                        </Image>
                    </xml>
                    """
        return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "headers": {"Content-Type": "application/xml"},
        "body": XmlForm.format(**self.__dict)
        }


该类主要做用户类型处理(其他都是类似的,这里以图片、消息的接收进行处理),具体可以参考微信公众号文档。

最后进行部署
在这里插入图片描述

三、配置微信公众号服务器

流程如下:
在这里插入图片描述

提交完成后,我们可以返回云函数->日志查询,在前面中我们有打印了event参数,所有的信息都可以在里面看到,比如token的加密参数echostr(通过hashlib加密来实现的,本次示例没有使用验证token,作用是判别是否为本人操作)。

此时微信公众号配置就已经部署成功了,剩下的功能都可以通过官方文档进行了解。

四、展示效果

为方便本次通过电脑登录微信的方式、手机发信息模拟进行演示。

演示如下:

在这里插入图片描述

可以看到对于动画图片而言也是基于text的类型,并且还需要做其他处理,而表情也可以解析出来,图片上传那块也没出现问题。

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值