[Python] 微信公众号开发 Python3
搭建服务
- 开通一个阿里云ecs,安装python3及需要的包(参考下方官方文档)
- 将py文件保存在ecs上,运行
- 在本地访问阿里云的IP地址
- 能完成这步说明网络没问题
server.py


1 # -*- coding: utf-8 -*-
2 # filename: server.py
3 import web
4
5 urls = (
6 '/wx', 'Handle',
7 )
8
9 class Handle(object):
10 def GET(self):
11 return "hello, this is handle view"
12
13 if __name__ == '__main__':
14 app = web.application(urls, globals())
15 app.run()
公众号配置
- 注册公众号
- 验证token
- 官方文档是python2写的,不能直接用,python3代码如下
server.py


1 # -*- coding: utf-8 -*-
2 # filename: main.py
3 import web
4 from handle import Handle
5
6 urls = (
7 '/wx', 'Handle',
8 )
9
10 if __name__ == '__main__':
11 app = web.application(urls, globals())
12 app.run()
handle.py


1 import hashlib
2 import web
3
4 class Handle(object):
5 def GET(self):
6 try:
7 data = web.input()
8 if len(data) == 0:
9 return "hello,this is handle view"
10 signature = data.signature
11 timestamp = data.timestamp
12 nonce = data.nonce
13 echostr = data.echostr
14 token = "hfxlcxc"
15
16 list = [token, timestamp, nonce]
17 list.sort()
18 sha1 = hashlib.sha1()
19 sha1.update(list[0].encode('utf-8'))
20 sha1.update(list[1].encode('utf-8'))
21 sha1.update(list[2].encode('utf-8'))
22 hashcode = sha1.hexdigest()
23
24 print("handle/GET func:hashcode, signature: ", hashcode, signature)
25 if hashcode == signature:
26 return echostr
27 else:
28 return ""
29 except (Exception,Argument):
30 return Argument
自动回复
- 调试接口
- 官方文档python里的xml中间有空格,虽然调试可以通过,但在微信里发消息不会自动回复
server.py


1 # -*- coding: utf-8 -*-
2 # filename: server.py
3 import web
4 from handle import Handle
5
6 urls = (
7 '/wx', 'Handle',
8 )
9
10 if __name__ == '__main__':
11 app = web.application(urls, globals())
12 app.run()
handle.py


1 # -*- coding: utf-8 -*-#
2 # filename: handle.py
3
4 import hashlib
5 import web
6 import receive
7 import reply
8
9 class Handle(object):
10 def POST(self):
11 try:
12 webData = web.data()
13 print("Handle Post webdata is ",webData)
14 # 后台打印日志
15 recMsg = receive.parse_xml(webData)
16 if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
17 toUser = recMsg.FromUserName
18 fromUser = recMsg.ToUserName
19 content = "test!!"
20 replyMsg = reply.TextMsg(toUser, fromUser, content)
21 return replyMsg.send()
22 else:
23 print("暂不处理")
24 return "success"
25 except (Exception,Argment):
26 return Argment
receive.py


1 # -*- coding: utf-8 -*-#
2 # filename: receive.py
3
4 import xml.etree.ElementTree as ET
5
6 def parse_xml(web_data):
7 if len(web_data) == 0:
8 return None
9 xmlData = ET.fromstring(web_data)
10 msg_type = xmlData.find('MsgType').text
11 if msg_type == 'text':
12 return TextMsg(xmlData)
13 elif msg_type == 'image':
14 return ImageMsg(xmlData)
15
16 class Msg(object):
17 def __init__(self,xmlData):
18 self.ToUserName = xmlData.find('ToUserName').text
19 self.FromUserName = xmlData.find('FromUserName').text
20 self.CreateTime = xmlData.find('CreateTime').text
21 self.MsgType = xmlData.find('MsgType').text
22 self.MsgId = xmlData.find('MsgId').text
23
24 class TextMsg(Msg):
25 def __init__(self,xmlData):
26 Msg.__init__(self,xmlData)
27 self.Content = xmlData.find('Content').text.encode("utf-8")
28
29 class ImageMsg(Msg):
30 def __init__(self, xmlData):
31 Msg.__init__(self,xmlData)
32 self.PicUrl = xmlData.find('PicUrl').text
33 self.MediaId = xmlData.find('MediaId').text
reply.py


1 # -*- coding: utf-8 -*-#
2 # filename: reply.py
3 import time
4
5 class Msg(object):
6 def __init__(self):
7 pass
8
9 def send(self):
10 return "success"
11
12 class TextMsg(Msg):
13 def __init__(self, toUserName, fromUserName, content):
14 self.__dict = dict()
15 self.__dict['ToUserName'] = toUserName
16 self.__dict['FromUserName'] = fromUserName
17 self.__dict['CreateTime'] = int(time.time())
18 self.__dict['Content'] = content
19
20 def send(self):
21 XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{Content}]]></Content></xml>"""
22 return XmlForm.format(**self.__dict)
23
24 class ImageMsg(Msg):
25 def __init__(self, toUserName, fromUserName, mediaId):
26 self.__dict = dict()
27 self.__dict['ToUserName'] = toUserName
28 self.__dict['FromUserName'] = fromUserName
29 self.__dict['CreateTime'] = int(time.time())
30 self.__dict['MediaId'] = mediaId
31
32 def send(self):
33 XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[{MediaId}]]></MediaId></Image></xml>"""
34 return XmlForm.format(**self.__dict)
参考
官方文档
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html
w3c教程
https://www.w3cschool.cn/weixinkaifawendang/
token验证失败
https://www.cnblogs.com/roadwide/p/10566946.html
https://blog.csdn.net/qq_39866513/article/details/83218731
获取access token
https://blog.csdn.net/wchenjt/article/details/96154504
https://blog.csdn.net/qq_26626113/article/details/78251932
白名单
https://cloud.tencent.com/developer/article/1034608
接口调试
https://www.cnblogs.com/txw1958/p/mp-weixin-debug.html
自动回复失败
http://www.alixixi.com/biancheng/a/2019022498588.shtml
[Python] 微信公众号开发 Python3的更多相关文章
- Python微信公众号开发—小白篇
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...
- Python微信公众号开发—小白篇(1)
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造社区],欢迎大家关注. github仓库地址http ...
- Python微信公众号开发
最近老大叫我学习开发微信,试着玩了下.网上查了下文档.有点过时. 简单步骤: 1)申请服务器并完成环境配置 去腾讯云购买云服务器.当然你也可以购买其他产品,比如阿里云.因为我是学生,有优惠110一年. ...
- python微信公众号开发学习记录
网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...
- python之微信公众号开发(基本配置和校验)
前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...
- Python微信公众号教程基础篇——收发文本消息
1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...
- 微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行
使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
随机推荐
- nacos下载慢吗?来这里
https://gitee.com/soul_PreCoder/springcloudalibab/repository/archive/master.zip
- 201871030102_崔红梅 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程2. 掌握Github协作开发程序的操作方法.3.阅读<现代软 ...
- BUAA_OO_2020_第四单元与课程总结
BUAA_OO_2020_第四单元与课程总结 第四单元架构 第一次 架构设计 第一次作业要求实现UML类图解析器. 我才用自顶向下依次解析的方法,首先将类图中涉及的所有元素分成三层: 第一层 第二层 ...
- Java8中的Stream流式操作 - 入门篇
作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...
- 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果
映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...
- 如何解压从UK biobank下载下来的tsv.bgz文件?
今天碰到一个问题,就是从UK biobank下载下来的gwas result file是filename.tsv.bgz格式.这东西需要解压才能阅历,可是用zip或者rar都是搞不定,网上搜了一圈,说 ...
- L'ane Trotro(小驴托托) 67集法语字幕+11集无字幕 百度云
<小驴托托>(L'ane Trotro)是法国经典的少儿动画片,讲述了小驴托托的生活,它的对白浅显易懂,非常适合法语初学者培养语感以及学习日常表达. 百度云链接自取:https://pan ...
- Web操作摄像头、高拍仪、指纹仪等设备的功能扩展方案
摘要:信息系统开发中难免会有要操作摄像头.高拍仪.指纹仪等硬件外设,异或诸如获取机器签名.硬件授权保护(加密锁)检测等情况.受限于Web本身运行机制,就不得不使用Active.浏览器插件进行能力扩展了 ...
- kuberadm集群升级
升级kubernetes集群 注意不能跨版本升级 比如1.13.x 要先升级到1.14.x,不能直接升级到1.15.x 举例说明升级到1.15,和1.14有些参数不一样,具体看官网: https:// ...
- hdu4965 巧用矩阵乘法结合律
题意: 给两个矩阵,n*m的矩阵A,和m*n的矩阵B, 求(A*B)^(n*n)其中 m<=6,n<=1000. 思路: 一开始直接模拟,写了个矩阵快速幂,超时了,因 ...