本文简单介绍在OpenShift空间中使用Django开发微信公众号实现自动回复的大致框架
一、OpenShift空间文件目录结构
- 使用WinSCP登录后可看到非隐藏的目录:app-deployments、app-root、git、python,主要用到app-roo目录。
- 其中:
app-root/logs/python.log文件存放着部分应用日志,若部署后访问Django应用时出错可在此文件中找到出错信息
app-root/repo/wsgi/(app-root/runtime/repo/wsgi/)文件夹里存放着Django项目文件
二、创建Django应用
- 使用PuTTY连接登录后输入cd app-root/runtime/repo/wsgi/myproject跳转到项目目录下,输入python manage.py startapp WeChat创建应用(或直接上传本地应用)
- 修改myproject/settings.py文件,在INSTALLED_APPS中添加'WeChat'应用:
INSTALLED_APPS = (
......,
'WeChat',
)
三、编码实现
- 以下文件可直接在WinSCP编辑并保存而成,由于Python的中文乱码问题,若以下文件中有中文出现请先将文件下载到本地用记事本打开后另存为utf-8格式然后再上传覆盖可解决中文乱码
- wsgi/myproject/myproject/urls.py:
from django.conf.urls import include, url, patterns
from django.contrib import admin
from WeChat.views import test
urlpatterns = patterns('',
url(r'^test/$', test),
url(r'^admin/', include(admin.site.urls)),
)
- wsgi/myproject/WeChat/views.py
#coding:utf-8
import hashlib
import json
import time
import urllib.request
from django.shortcuts import render
from django.utils.encoding import smart_str
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from xml.etree import ElementTree
WEIXIN_TOKEN = '填写微信公众号接入token'
@csrf_exempt
def test(request):
if request.method == "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)
if signature != None:
token = WEIXIN_TOKEN
tmp_list = [token, timestamp, nonce]
tmp_list.sort()
tmp_str = "%s%s%s" % tuple(tmp_list)
tmp_str = hashlib.sha1(tmp_str.encode("utf-8")).hexdigest()
if tmp_str == signature:
return HttpResponse(echostr)
else:
return HttpResponse("Error")
else:
request_xml = ElementTree.fromstring(request.body)
fromUser = request_xml.find('ToUserName').text
toUser = request_xml.find('FromUserName').text
msgtype = request_xml.find('MsgType').text
nowtime = str(int(time.time()))
if msgtype == 'text':
content = request_xml.find('Content').text
if content == '帮助':
message = 'subscribe'
elif content == '【收到不支持的消息类型,暂无法显示】':
message = '收到动态表情'
else:
message = '收到文本消息'
elif msgtype == 'location':
label = request_xml.find('Label').text
message = (u'收到位置信息:') + label
elif msgtype == 'image':
message = (u'收到图片')
elif msgtype == 'voice':
message = (u'收到语音')
elif msgtype == 'shortvideo':
message = (u'收到短视频')
elif msgtype == 'link':
message = (u'收到链接')
elif msgtype == 'event':
event = request_xml.find('Event').text
if event == 'subscribe':
message = 'subscribe'
return render(request,'text.xml',{'toUser': toUser, 'fromUser': fromUser, 'nowtime': nowtime, 'content': message})
- 新建templates文件夹并新建text.xml模板文件wsgi/myproject/WeChat/templates/text.xml
<xml>
<ToUserName><![CDATA[{{ toUser }}]]></ToUserName>
<FromUserName><![CDATA[{{ fromUser }}]]></FromUserName>
<CreateTime>{{ nowtime }}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{%if content == "subscribe" %}感谢您的关注,以下是功能列表
此处填写帮助列表 {%else%}{{content}}{% endif %}
查看帮助请发送"帮助"]]></Content>
</xml>
四、连接公众号后台
- 用PuTTY连接登录后输入ctl_all restart使应用生效
- 登录公众号后台填写服务器配置,其中URL填OpenShift应用的Public URL,例如https://***.rhcloud.com/test(注意是https),Token与Django项目里的一致,EncodingAESKey随机生成,消息加解密方式选明文模式,填完后提交启用服务器
- 由于OpenShift访问有点慢,若提交失败一般多提交几次即可
- 可查看app-root/logs/python.log日志文件中微信后台发送过来的请求并仿照请求自行用浏览器发送请求测试
五、其他
- 可在app-root/logs/python.log日志文件查看出错信息