根据下面的牛人的引导初探微信公众平台
http://my.oschina.net/yangyanxing/blog/159215
在微信公众平台上申请订阅号
然后再高级功能-》开发模式-》成为开发者
这时候需要填写url & token
url需要一个网站应用,token则是公众平台和url的应用之间约定的一个密码。
为了url应用,我们可以在SAE上申请一个python应用。
config.yaml
配置一些需要用到的python模块
index.wsgi
主程序设置,设置模板目录和url,运行相应的app
templates
下面创建一个模板文件,可以用来render
准备好了url应用,就可以填写公众平台的url和token了
url :http://XXXX.sinaapp.com/weixin
token : 约定token
****************************应用***********************************
1.中英文翻译,使用有道翻译接口
申请之 http://fanyi.youdao.com/openapi?path=data-mode
然后利用urllib2模块,得到接口的返回结果显示给微信用户即可
2.随机获取音乐
同理
3.小黄鸡,申请接口
http://developer.simsimi.com/api
目前申请的只能免费使用九天 Orz...
技术上是使用了SAE的memcache,缓存命令
4.使用mysql服务来记录用户的反馈
同理,开启SAE的mySQL服务
核心代码 weixinInterface.py
# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
import urllib2,json
from lxml import etree
import basic
import random
import pylibmc
import model
class WeixinInterface:
def __init__(self):
self.app_root = os.path.dirname(__file__)
self.templates_root = os.path.join(self.app_root, 'templates')
self.render = web.template.render(self.templates_root)
def GET(self):
#获取输入参数
data = web.input()
signature=data.signature
timestamp=data.timestamp
nonce=data.nonce
echostr=data.echostr
#自己的token
token="luantianjiao" #这里改写你在微信公众平台里输入的token
#字典序排序
list=[token,timestamp,nonce]
list.sort()
sha1=hashlib.sha1()
map(sha1.update,list)
hashcode=sha1.hexdigest()
#sha1加密算法
#如果是来自微信的请求,则回复echostr
if hashcode == signature:
return echostr
def POST(self):
str_xml = web.data() #获得post来的数据
xml = etree.fromstring(str_xml)#进行XML解析
#content=xml.find("Content").text#获得用户所输入的内容
mstype=xml.find("MsgType").text
fromUser=xml.find("FromUserName").text
toUser=xml.find("ToUserName").text
mc=pylibmc.Client()
if mstype == "event":
mscontent = xml.find("Event").text
if mscontent == "subscribe":
replayText = u'''欢迎关注本微信,这个微信是本人业余爱好所建立,也是想一边学习Python一边玩的东西,现在还没有什么功能,只是弄了个翻译与豆瓣图书查询的小工具,你们有什么好的文章也欢迎反馈给我,我会不定期的分享给大家,输入help查看操作指令'''
return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
if mscontent == "unsubscribe":
replayText = u'我现在功能还很简单,知道满足不了您的需求,但是我会慢慢改进,欢迎您以后再来'
return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
if mstype == 'text':
content=xml.find("Content").text
if content.startswith('fk'):
fktime = time.strftime('%Y-%m-%d %H:%M',time.localtime())
model.addfk(fromUser,fktime,content[3:].encode('utf-8'))
return self.render.reply_text(fromUser,toUser,int(time.time()),u'感谢您的反馈')
if content.lower() == 'bye':
mc.delete(fromUser+'_xhj')
return self.render.reply_text(fromUser,toUser,int(time.time()),u'您已经跳出了和小黄鸡的交谈中,输入help来显示操作指令')
if content.lower() == 'xhj':
mc.set(fromUser+'_xhj','xhj')
return self.render.reply_text(fromUser,toUser,int(time.time()),u'您已经进入与小黄鸡的交谈中,请尽情的蹂躏它吧!输入bye跳出与小黄鸡的交谈')
if content.lower() == 'm':
musicList = [
[r'http://bcs.duapp.com/yangyanxingblog3/music/destiny.mp3','Destiny',u'命运'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/5days.mp3','5 Days',u'5日迷情'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/Far%20Away%20%28Album%20Version%29.mp3','Far Away (Album Version)',u'遥远'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E5%B0%91%E5%B9%B4%E6%B8%B8.mp3',u'wandering',u'少年游'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E8%8F%8A.mp3',u'菊',u'关喆'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E7%A6%BB%E4%B8%8D%E5%BC%80%E4%BD%A0.mp3',u"can't live without u",u'离不开你'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E9%99%8C%E7%94%9F%E4%BA%BA.mp3',u'stranger',u'陌生人'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E8%8A%B1%E5%AE%B9%E7%98%A6.mp3',u'花容瘦',u'花开易谢'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/%E4%B9%98%E5%AE%A2.mp3',u'passenger',u'乘客'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/If%20My%20Heart%20Was%20A%20House.mp3',u'If My Heart Was A House',u'心潮澎湃'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/Hello%20Seattle%EF%BC%88Remix%E7%89%88%EF%BC%89.mp3',u'Hello Seattle(Remix版',u'西雅图,你好'],
[r'http://bcs.duapp.com/yangyanxingblog3/music/Everybody%20Hurts.mp3',u'Everybody Hurts',u'不可言说的伤']
]
music = random.choice(musicList)
musicurl = music[0]
musictitle = music[1]
musicdes =music[2]
return self.render.reply_music(fromUser,toUser,int(time.time()),musictitle,musicdes,musicurl)
#读取memcache中的缓存数据
mcxhj = mc.get(fromUser+'_xhj')
if mcxhj =='xhj':
res = basic.xiaohuangji(content)
reply_text = res['response']
if u'微信' in reply_text:
reply_text = u"小黄鸡脑袋出问题了,请换个问题吧~" #这里小黄鸡会有广告,我索性就全给屏蔽了
return self.render.reply_text(fromUser,toUser,int(time.time()),reply_text)
if content == 'help':
replayText = u'''1.输入中文或者英文返回对应的英中翻译
2.输入m随机听一首音乐
3.输入xhj进入调戏小黄鸡模式
4.输入fk+反馈信息,可以给我们反馈呦'''
return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
elif type(content).__name__ == "unicode":
content = content.encode('UTF-8')
Nword = basic.youdao(content)
return self.render.reply_text(fromUser,toUser,int(time.time()),Nword)
引用的basic.py
#coding=utf-8
import json
import urllib2
def youdao(word):
qword = urllib2.quote(word)
baseurl =r'http://fanyi.youdao.com/openapi.do?keyfrom=luan111111&key=1072227670&type=data&doctype=json&version=1.1&q='
url = baseurl+qword
resp = urllib2.urlopen(url)
fanyi = json.loads(resp.read())
if fanyi['errorCode'] == 0:
if 'basic' in fanyi.keys():
trans = u'%s:\n%s\n%s\n网络释义:\n%s'%(fanyi['query'],''.join(fanyi['translation']),' '.join(fanyi['basic']['explains']),''.join(fanyi['web'][0]['value']))
return trans
else:
trans =u'%s:\n基本翻译:%s\n'%(fanyi['query'],''.join(fanyi['translation']))
return trans
elif fanyi['errorCode'] == 20:
return u'对不起,要翻译的文本过长'
elif fanyi['errorCode'] == 30:
return u'对不起,无法进行有效的翻译'
elif fanyi['errorCode'] == 40:
return u'对不起,不支持的语言类型'
else:
return u'对不起,您输入的单词%s无法翻译,请检查拼写'% word
def xiaohuangji(ask):
ask = ask.encode('UTF-8')
enask = urllib2.quote(ask)
#baseurl = r'http://www.simsimi.com/func/reqN?req='
baseurl='''http://sandbox.api.simsimi.com/request.p?key=24ae596d-a367-4105-bc37-c2e12d977378&text='''
url = baseurl+enask+'&lc=ch&ft=0.0'
resp = urllib2.urlopen(url)
reson = json.loads(resp.read())
return reson