django打造微信个人公众号

现在自媒体很是火爆,其中腾讯的微信公众号作为其中一员,也是占有一席之地。本着学习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的更多特性,比如并发、扩展还有安全等等一系列的问题,让开发人员能更加专注于功能的编写。

版权所属,如需转载,请注明出处:搜闲鱼

2,303 次浏览

发表评论

邮箱地址不会被公开。 必填项已用*标注