Django2.2 開(kāi)發(fā)微信公眾號(hào)

1.說(shuō)明

本文將上傳微信公眾號(hào)自動(dòng)回復(fù)消息的部分代碼,并作簡(jiǎn)要的說(shuō)明。在網(wǎng)上查了很多文章,里面的代碼多多少少都有問(wèn)題,所以這里上傳自己的代碼。

2.正文

1)創(chuàng)建Django項(xiàng)目(我將它命名為wechat)并創(chuàng)建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)創(chuàng)建xml模板文件,便于返回xml格式的結(jié)果

/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)編寫(xiě)主要功能

/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)  # 將列表轉(zhuǎn)成字符串
    sha1 = hashlib.sha1()
    sha1.update(s.encode("utf8"))  # 將s變量utf8編碼后加密
    return sha1.hexdigest() == signature

在驗(yàn)證token這一步,我查了很多文章,沒(méi)一個(gè)能用的。后來(lái)發(fā)現(xiàn)問(wèn)題出在沒(méi)有進(jìn)行utf8編碼上,可能是因?yàn)槲矣玫氖荓inux,所以才會(huì)存在這個(gè)問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Robot Framework官方教程(一)入門(mén)Robot Framework官方教程(二)測(cè)試數(shù)據(jù)語(yǔ)法Robot...
    程序員文集閱讀 273,618評(píng)論 0 84
  • 摘要 1 前言 2 AS 規(guī)范 3 命名規(guī)范 4 代碼樣式規(guī)范 5 資源文件規(guī)范 6 版本統(tǒng)一規(guī)范 7 第三方庫(kù)規(guī)...
    浪夠_閱讀 1,113評(píng)論 0 3
  • 1. 引子 圖像識(shí)別可通過(guò)輪廓,直方圖等方式實(shí)現(xiàn),像人臉識(shí)別這種復(fù)雜應(yīng)用,實(shí)現(xiàn)它的方法很多,通常是基礎(chǔ)方...
    xieyan0811閱讀 3,441評(píng)論 0 4
  • 微信小程序開(kāi)發(fā)教程(基礎(chǔ)篇)9-事件 在實(shí)際的移動(dòng)應(yīng)用程序交互方式中,最常見(jiàn)的就是滑動(dòng)操作。像左右滑動(dòng)切換頁(yè)面,手...
    哈哈哈哈哈哈哦哦閱讀 7,758評(píng)論 1 13
  • 練習(xí)七 記錄一 【如何面對(duì)自己的不愿意和害怕】 觀察自己一整天的工作,當(dāng)發(fā)現(xiàn)自己面對(duì)其中 [一件事], 心里感覺(jué) ...
    花開(kāi)荼靡E閱讀 361評(píng)論 0 0

友情鏈接更多精彩內(nèi)容