现在自媒体很是火爆,其中腾讯的微信公众号作为其中一员,也是占有一席之地。本着学习python的心理下,想要自己搭建一次公众号开发后台。
因为之前有了解对比过python下的web框架,其中Django几乎占有了60%的市场份额,而且官方文档详细,各类扩展插件也很全面。官方表示:Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.
主要就是后台中一些配置按照官方说明填写完毕,后续开发用到的参数就是AppID、AppSecret以及Token。
1.新建django project 和application
PS F:\python\django\other\mysite> django-admin.py startproject mysite
PS F:\python\django\other\mysite\devnav> python manage.py startapp wechat
执行完得到这样的目录结构:
2.修改路由:
在mysite目录下的urls.py文件中增加:
from django.urls import include urlpatterns = [ path('wx/',include('wechat.urls')), ]
其中include表示所有域名/wx的地址都会被解析到wechat应用的路由中去。
所以我们需要在wechat目录下新建一个urls.py,并添加如下代码:
from django.urls import path from . import views app_name = 'wechat' urlpatterns = [ path('', views.weixin, name='weixin'), ]
这里的‘’表示所有的请求都会被解析到views文件里的weixin方法里去
3.接口验证:
接下来就要开始写具体方法了。
首先需要注意的时候,微信服务器来django请求的时候是属于跨域的,而django默认是开启csrf防护的,所以我们需要通过声明csrf_exempt解除这个防护。
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def weixin_main(request): if request.method == "GET": return HttpResponse("GET") else: return HttpResponse("POST")
微信服务器会在每次发送数据的时候会先发送一个GET请求进行验证,包含4个参数:
#接收4个GET参数 signature = request.GET.get('signature', None) timestamp = request.GET.get('timestamp', None) nonce = request.GET.get('nonce', None) echostr = request.GET.get('echostr', None) #服务器配置中的token token = 'XXXXXXXX' #按照微信官方文档进行校验计算 hashlist = [token, timestamp, nonce] hashlist.sort() hashstr = ''.join(hashlist).encode('utf-8') hashstr = hashlib.sha1(hashstr).hexdigest() #对比加密签名是否等于计算结果,如果相等则返回随机字符串,否则返回false if hashstr == signature: return HttpResponse(echostr) else: return HttpResponse("false")
4.业务逻辑处理:
验证成功后,微信用户每次向公众号发送消息或者有事件触发,都会通过微信服务器POST给我们的应用。数据格式为XML,所以我们需要一个XML解析器来处理每次发送来的消息:
import xml.etree.ElementTree as ET def autoreply(request): try: xml = ET.fromstring(request.body) #四个基础节点,其他节点信息根据消息类型的不同而不同,具体参照微信API msg_type = xml.find('MsgType').text ToUserName = xml.find('ToUserName').text FromUserName = xml.find('FromUserName').text CreateTime = xml.find('CreateTime').text #将发送和接受的对象互换 toUser = FromUserName fromUser = ToUserName rMsg = None #如果消息类型是事件,并事件是订阅该公众号,则发送欢迎信息 if msg_type == 'event': if xmlData.find('Event').text == 'subscribe': replyMsg = TextMsg(toUser, fromUser, '''✨✨✨欢迎关注本公众号✨✨✨\n\n''' elif msg_type == 'text': Content_R = xmlData.find('Content').text rMsg = TextMsg(toUser, fromUser, Content) elif msg_type == 'image': content = "这是图片" rMsg = TextMsg(toUser, fromUser, content) elif msg_type == 'voice': content = "这是语音" rMsg = TextMsg(toUser, fromUser, content) elif msg_type == 'shortvideo': content = "这是小视频" rMsg = TextMsg(toUser, fromUser, content) elif msg_type == 'location': content = "这是位置" rMsg = TextMsg(toUser, fromUser, content) elif msg_type == 'link': content = "这是链接" rMsg = TextMsg(toUser, fromUser, content) else: rMsg = TextMsg(toUser, fromUser, '未知类型') except Exception as Argment: replyMsg = TextMsg(toUser, fromUser, '出错了') finally: return rMsg.toXML()
这样,一个简单的个人微信公众后台就算搭建完毕了。
其实这里只是借用了django的http服务器功能,通过requests库也能实现。但是如果是企业公众号,涉及的功能提供将会多很多,就需要django的更多特性,比如并发、扩展还有安全等等一系列的问题,让开发人员能更加专注于功能的编写。
版权所属,如需转载,请注明出处:搜闲鱼