您的位置:首页 > 编程语言 > Python开发

使用python进行微信开发

2017-03-03 00:00 417 查看
摘要: 项目地址https://git.oschina.net/nanxun/python_weixin

1.view文件

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.http.response import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from weixin01.cdb import Cdata
from wechat_sdk import WechatBasic
from wechat_sdk.exceptions import ParseError
from wechat_sdk.messages import TextMessage
from .models import KeyWord as KeyWordModel
WECHAT_TOKEN = "lifecb"
WEIXIN_APPID = 'wx2392fc3aed016634'
WEIXIN_APPSECRET = 'wx2392fc3aed016634'
from wechat_sdk.messages import (TextMessage, VoiceMessage, ImageMessage,
VideoMessage, LinkMessage, LocationMessage, EventMessage
)
# 实例化 WechatBasic
wechat_instance = WechatBasic(
token=WECHAT_TOKEN,
appid=WEIXIN_APPID,
appsecret=WEIXIN_APPSECRET
)

@csrf_exempt
def index(request):
if request.method == 'GET':
# 检验合法性
# 从 request 中提取基本信息 (signature, timestamp, nonce, xml)
signature = request.GET.get('signature')
timestamp = request.GET.get('timestamp')
nonce = request.GET.get('nonce')

if not wechat_instance.check_signature(
signature=signature, timestamp=timestamp, nonce=nonce):
return HttpResponseBadRequest('Verify Failed')

return HttpResponse(
request.GET.get('echostr', ''), content_type="text/plain")

# 解析本次请求的 XML 数据
try:
wechat_instance.parse_data(data=request.body)
except ParseError:
return HttpResponseBadRequest('Invalid XML Data')

# 获取解析好的微信请求信息
message = wechat_instance.get_message()
# 利用本次请求中的用户OpenID来初始化上下文对话
context = Cdata()
context.set(id=message.source)
# 关注事件以及不匹配时的默认回复
response = None

if isinstance(message, TextMessage):
# 当前会话内容
step=context.get('step',1)
content = message.content.strip()
if message.content == '新闻':
response = wechat_instance.response_news([
{
'title': '百度新闻',
'picurl': 'http://box.bdimg.com/static/fisp_static/common/img/searchbox/logo_news_276_88_1f9876a.png',
'description': '百度新闻是百度公司推出的中文新闻搜索平台,每天发布多条新闻,新闻源包括500多个权威网站,热点新闻由新闻源网站和媒体每天“民主投票”选出,不含任何人工编辑成分,真实反映每时每刻的新闻热点;百度新闻保留自建立以来所有日期的新闻,更助您掌握整个新闻事件的发展脉络。',
'url': 'http://news.baidu.com/',
}, {
'title': '百度',
'picurl': 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png',
'url': 'http://www.baidu.com',
}, {
'title': 'Django 教程',
'picurl': 'http://www.ziqiangxuetang.com/media/uploads/images/django_logo_20140508_061519_35.jpg',
'url': 'http://www.ziqiangxuetang.com/django/django-tutorial.html',
}
])
return HttpResponse(response, content_type="application/xml")
else:
try:
keyword_object = KeyWordModel.objects.get(keyword=content)
reply_text = keyword_object.content
except KeyWordModel.DoesNotExist:
try:
reply_text = KeyWordModel.objects.get(keyword='提示').content
except KeyWordModel.DoesNotExist:
reply_text = ('/:P-(好委屈,数据库翻个遍也没找到你输的关键词!\n'
'试试下面这些关键词吧:\nKEYWORD_LIST\n'
'<a href="https://my.oschina.net/u/3264690/blog">chen</a>'
'感谢您的支持!/:rose'
)
context.step= step + 1
context.last_text= content
#context.save()
if 'KEYWORD_LIST' in reply_text:
keyword_objects = KeyWordModel.objects.exclude(keyword__in=[
'关注事件', '测试', 'test', '提示']).filter(published=True)
keywords = ('{}. {}'.format(str(i), k.keyword)
for i, k in enumerate(keyword_objects, 1))
reply_text = reply_text.replace(
'KEYWORD_LIST', '\n'.join(keywords))
elif isinstance(message, VoiceMessage):
reply_text = '语音信息我听不懂/:P-(/:P-(/:P-('
elif isinstance(message, ImageMessage):
reply_text = '图片信息我也看不懂/:P-(/:P-(/:P-('
elif isinstance(message, VideoMessage):
reply_text = '视频我不会看/:P-('
elif isinstance(message, LinkMessage):
reply_text = '链接信息'
elif isinstance(message, LocationMessage):
reply_text = '地理位置信息'
elif isinstance(message, EventMessage):  # 事件信息
if message.type == 'subscribe':  # 关注事件(包括普通关注事件和扫描二维码造成的关注事件)
#follow_event = KeyWordModel.objects.get(keyword='关注事件')
reply_text = '欢迎您的关注,您可以发送任意指令和我聊天!例如:新闻'

# 如果 key 和 ticket 均不为空,则是扫描二维码造成的关注事件
if message.key and message.ticket:
reply_text += '\n来源:扫描二维码关注'
else:
reply_text += '\n来源:搜索名称关注'
elif message.type == 'unsubscribe':
reply_text = '取消关注事件'
elif message.type == 'scan':
reply_text = '已关注用户扫描二维码!'
elif message.type == 'location':
reply_text = '上报地理位置'
elif message.type == 'click':
reply_text = '自定义菜单点击'
elif message.type == 'view':
reply_text = '自定义菜单跳转链接'
elif message.type == 'templatesendjobfinish':
reply_text = '模板消息'
response = wechat_instance.response_text(content=reply_text)

return HttpResponse(response, content_type="application/xml")

2.models文件

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

class KeyWord(models.Model):
keyword = models.CharField(
'关键词', max_length=256, primary_key=True, help_text='用户发出的关键词')
content = models.TextField(
'内容', null=True, blank=True, help_text='回复给用户的内容')

pub_date = models.DateTimeField('发表时间', auto_now_add=True)
update_time = models.DateTimeField('更新时间', auto_now=True, null=True)
published = models.BooleanField('发布状态', default=True)

def __unicode__(self):
return self.keyword

class Meta:
verbose_name = '关键词'
verbose_name_plural = verbose_name

class Cda(models.Model):
openid=models.TextField(unique=True)
step=models.IntegerField()
content=models.TextField(max_length=256)

3.cdb.py

from weixin01 import models
class Cdata(dict):

def __init__(self):
self.str=None
self.step=0
self.openid=None
self.last_text=None
def set(self,id):
self.openid=id
def get(self, k, d=1):
if self.step == 0:
return d
else:
return self.step

def save(self):
d=models.Cda(
openid=self.openid,
step=self.step,
content=self.last_text,

)
# d.openid=self.openid
# d.step=self.step
# d.content=self.last_text
d.save()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息