在使用python一步一步搭建微信公众平台(二)中最后我们留下了一个问题,就是单引号的content在render到xml中时,返回给用户的信息会被转码,如‘<>&’会被转为<>&用户在收到有<>&等内容的时候都会转,非常难看,我查找了一些网页,几乎都是问如果将特殊符号转为转义,而没有说怎么转回来,最后看到说这个转码是因为在<![CDATA[]]> 在CDATA中的内容就是为了避免发生这种由于特殊符号引起的问题,那么我们可以把render的内容不要放在这个CDATA中,那么之前的reply_text.xml就改为
$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content>$content</Content>
</xml>
这样以后特殊字符就是原样的输出了
好了,接着这次的内容,这次我想添加一个当用户关注后自动回复一个欢迎信息与用户回复一个'm’后随机的选一首歌给用户听。
1. 关于“事件推送”的概念,事件推送是用户的一些操作,如果关注你,取消关注你,点击自定义等操作,现在微信支持subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件)事件推送的post数据XML为
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[EVENT]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>
其MsgType为event,Event为subscribe(订阅)、unsubscribe(取消订阅)、CLICK,那么我们就可以通过先判断MsgType,然后再取得Event内容
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)
将上面的代码放在weixinInterface.py的def POST(self)中,注意缩进
这样,当一个新的用户关注你后,这个微信公众账号将会自动回复你代码里写的replayText
2.既然我们在自动回复中提到了输入help来查看帮助内容,那么我们就接着写当用户输入help后返回的内容,这里就扯到另外一个概念,“关键字”回复,如果不是在开发者模式,公共账号可以自已定义的关键词有限,关键词就是用户输入了某些特别的词,相当于操作指令,微信会根据这些关键词返回的相应的内容。但是在开发者模式下,开发者几乎可以定义无限个,看你代码里怎么写了。同时,当用户发送help指令时,其MsgType为’text’,
if mstype == 'text':
content=xml.find("Content").text
if content == 'help':
replayText = u'''1.输入中文或者英文返回对应的英中翻译\n2.输入 book 要查询的书名 返回豆瓣图书中结果\n3.输入cls清除查询记录\n4.输入m随机来首音乐听,建议在wifi下听\n5.输入python 进入python常用模块用法查询(未完成)'''
return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
能过上面的两个例子已经基本上理解微信的回复走的两步,先判断消息类型(MsgType),之后再取消息内容,然后再根据内容来设定特定的回复内容,这样我们就可以建立无限多“关键词”,还是比较简单的。
3.我的help指令中有提到输入m 来随机听一首音乐,那么我们接下来搞一搞。
微信的回复消息有以下几种,回复文本消息 ;回复音乐消息 ;回复图文消息 其实只要按照官方的文档写xml,也挺简单的,音乐消息的xml为,我们根据官方文档,新建一个reply_music.xml,写入
$def with (toUser,fromUser,createTime,musicTitle,musicDes,musicURL)<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[$musicTitle]]></Title>
<Description><![CDATA[$musicDes]]></Description>
<MusicUrl><![CDATA[$musicURL]]></MusicUrl>
<HQMusicUrl><![CDATA[$musicURL]]></HQMusicUrl>
</Music>
<FuncFlag>0</FuncFlag></xml>
基中只要确定MusicUrl最重要,所以接下来,你需要四处搜索音乐文件,但这里建议你用自已的云存储,因为网上的音乐链接要么防盗链,要么过段时间就失效了,很影响用户体验,这里推荐使用百度的云存储BCS,具体的不在这写了,读者可以自已到上面查一查,我们只是将喜欢的音乐放到上面去,然后得到音乐的url即可,bcs注意不要设置为私有,要么微信也读不出来,这里我上传了12首,我是建立了一个以音乐url,歌名,描述为列表的列表musicList = [[url,name,des],[url,name,des],[url,name,des]]
然后引用random模块,使用random.choice() 随机取列表里的一个项返回给用户
这样当用户输入m 后将随机挑选一首歌返回给用户
4. 回复中还有一个是图文回复,后面的教程我想通过搭建一个豆瓣图书的查询工具来利用这个图文回复xml
回顾之前的文章
使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具
使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复
使用python一步一步搭建微信公众平台(五)----使用mysql服务来记录用户的反馈
来源:oschina
链接:https://my.oschina.net/u/614988/blog/196956