0x00 背景及介紹
申請一個微信公眾平臺訂閱號专执,將后臺接入到服務(wù)器上蜗顽,驗證服務(wù)器地址的有效性验懊,實現(xiàn)簡單的業(yè)務(wù)邏輯,根據(jù)用戶發(fā)送不同類型的消息做出不同的反應(yīng)嚷堡。
0x01 語言和框架
- 語言:Python
- 框架:Django
- 開發(fā)包:wechat-python-sdk
- Github源碼地址:
https://github.com/PorridgeEater/WeChat
0x02 參考文檔
- 微信公眾平臺開發(fā)文檔:
http://mp.weixin.qq.com/wiki/home/index.html - sdk開發(fā)包文檔:
http://wechat-python-sdk.com/
0x03 服務(wù)器配置
- 系統(tǒng):CentOS
- 配置過程:
- 更新系統(tǒng)
yum update
- 安裝python依賴包
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
- 安裝python和pip及更新
yum install python
yum install python-pip
(sudo) pip install --upgrade pip
- 安裝Django框架
pip install Django
- 安裝wechat-python-sdk開發(fā)包
pip install wechat-sdk
- 新建一個Django實例
django-admin.py startproject PROJECT_NAME
cd PROJECT_NAME
python manage.py startapp APP_NAME
python manage.py makemigrations
python manage.py migrate
- 添加url規(guī)則(urls.py)
urlpatterns = [
url(r'^wechat/', views.wechat_home),
]
- 編寫views邏輯(views.py)
#-*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from django.http.response import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from wechat_sdk import WechatConf
from wechat_sdk import WechatBasic
from wechat_sdk.exceptions import ParseError
from wechat_sdk.messages import (TextMessage, VoiceMessage, ImageMessage, VideoMessage, LinkMessage, LocationMessage, EventMessage, ShortVideoMessage)
conf = WechatConf(
token='YOUR_TOKEN_HERE',
appid='YOUR_APPID',
appsecret='YOUR_APPSECRET',
encrypt_mode='YOUR_MODE',
encoding_aes_key='YOUR_AES_KEY'
)
@csrf_exempt
def wechat_home(request):
signature = request.GET.get('signature')
timestamp = request.GET.get('timestamp')
nonce = request.GET.get('nonce')
wechat_instance = WechatBasic(conf=conf)
if not wechat_instance.check_signature(signature=signature, timestamp=timestamp, nonce=nonce):
return HttpResponseBadRequest('Verify Failed')
else:
if request.method == 'GET':
response = request.GET.get('echostr', 'error')
else:
try:
wechat_instance.parse_data(request.body)
message = wechat_instance.get_message()
if isinstance(message, TextMessage):
reply_text = 'text'
elif isinstance(message, VoiceMessage):
reply_text = 'voice'
elif isinstance(message, ImageMessage):
reply_text = 'image'
elif isinstance(message, LinkMessage):
reply_text = 'link'
elif isinstance(message, LocationMessage):
reply_text = 'location'
elif isinstance(message, VideoMessage):
reply_text = 'video'
elif isinstance(message, ShortVideoMessage):
reply_text = 'shortvideo'
else:
reply_text = 'other'
response = wechat_instance.response_text(content=reply_text)
except ParseError:
return HttpResponseBadRequest('Invalid XML Data')
return HttpResponse(response, content_type="application/xml")
- 開啟django app蝗罗,后臺掛載在80端口
sudo python manage.py runserver 0.0.0.0:80 &
0x04 微信后臺配置
- 記錄APPID和APPSecret填入views.py的conf屬性
- 填寫服務(wù)器配置
- 注意URL最后帶上/,否則django會報POST URL error
- 自定義token蝌戒,填入views.py的conf屬性
- 自定義EncodingAESKey串塑,填入views.py的conf屬性
基本配置
0x05 遇到的坑
- runserver后本地能夠訪問,外網(wǎng)不能訪問
- 綁定ip到0.0.0.0北苟,設(shè)置為對公監(jiān)聽即可
- 輸入中文無法響應(yīng)
- import os后設(shè)置編碼為utf8
- 端口號被占用
- ps aux | grep manage后然后kill -9 相應(yīng)進程號
0x06 后記
-
能夠識別不同的消息類型并進行相應(yīng)回復(fù)
實現(xiàn)效果圖 - 代碼的功能還有待完善桩匪,結(jié)構(gòu)和邏輯也可以再設(shè)計得更清晰一些