1.说明
本文将上传微信公众号自动回复消息的部分代码,并作简要的说明。在网上查了很多文章,里面的代码多多少少都有问题,所以这里上传自己的代码。
2.正文
1)创建Django项目(我将它命名为wechat)并创建APP(我将它命名为robot)
2)配置路由
/wechat/wechat/urls.py代码如下:
from django.contrib import admin
from django.urls import path
import robot.views as rv
urlpatterns = [
path('admin/', admin.site.urls),
path('message/', rv.message),
]
3)创建xml模板文件,便于返回xml格式的结果
/wechat/templates/reply_text.xml代码如下:
<xml>
<ToUserName><![CDATA[{{toUser}}]]></ToUserName>
<FromUserName><![CDATA[{{fromUser}}]]></FromUserName>
<CreateTime>{{createTime}}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{{content}}]]></Content>
</xml>
4)编写主要功能
/wechat/robot/views.py代码如下:
from django.shortcuts import render
from django.http import HttpResponse
import hashlib
from xml.etree.ElementTree import fromstring
# Create your views here.
def message(request):
if request.method == 'GET':
if __verify(request.GET):
echostr = request.GET.get('echostr')
return HttpResponse(echostr)
else:
return HttpResponse("Access failed!")
elif request.method == 'POST':
try:
if not __verify(request.GET):
return HttpResponse("Access failed!")
# openid = request.GET.get('openid')
xml_data = fromstring(request.body)
from_user = xml_data.find('ToUserName').text
to_user = xml_data.find('FromUserName').text
create_time = xml_data.find('CreateTime').text
msg_type = xml_data.find('MsgType').text
# msg_id = xml_data.find('MsgId').text
if msg_type == 'text':
content = xml_data.find('Content').text
r_content = '[人工智障]:'+content
c = {'toUser': to_user, 'fromUser': from_user, 'createTime': create_time, 'content': r_content}
return render(request, 'reply_text.xml', context=c)
else:
pass
except Exception as e:
print(e)
def __verify(req_get):
token = '你的token'
signature = req_get.get('signature')
timestamp = req_get.get('timestamp')
nonce = req_get.get('nonce')
s = [timestamp, nonce, token]
s.sort() # 字典序排序
s = ''.join(s) # 将列表转成字符串
sha1 = hashlib.sha1()
sha1.update(s.encode("utf8")) # 将s变量utf8编码后加密
return sha1.hexdigest() == signature
在验证token这一步,我查了很多文章,没一个能用的。后来发现问题出在没有进行utf8编码上,可能是因为我用的是Linux,所以才会存在这个问题。
网友评论