使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能
使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能
Kevin_Yang 发表于4年前
使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能
  • 发表于 4年前
  • 阅读 26944
  • 收藏 220
  • 点赞 17
  • 评论 29

腾讯云 技术升级10大核心产品年终让利>>>   

在使用python一步一步搭建微信公众平台(二)中最后我们留下了一个问题,就是单引号的content在render到xml中时,返回给用户的信息会被转码,如‘<>&’会被转为&lt;&gt;&amp;用户在收到有<>&等内容的时候都会转,非常难看,我查找了一些网页,几乎都是问如果将特殊符号转为转义,而没有说怎么转回来,最后看到说这个转码是因为在<![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)中,注意缩进

微博桌面截图_20140131151658

这样,当一个新的用户关注你后,这个微信公众账号将会自动回复你代码里写的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)


help

能过上面的两个例子已经基本上理解微信的回复走的两步,先判断消息类型(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() 随机取列表里的一个项返回给用户

music2

这样当用户输入m 后将随机挑选一首歌返回给用户

1391191607

4. 回复中还有一个是图文回复,后面的教程我想通过搭建一个豆瓣图书的查询工具来利用这个图文回复xml

回顾之前的文章

使用python一步一步搭建微信公众平台(一)

使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具

使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复

使用python一步一步搭建微信公众平台(五)----使用mysql服务来记录用户的反馈


共有 人打赏支持
粉丝 246
博文 34
码字总数 34570
评论 (29)
TaoBeier
好的, 很赞
苏生不惑
nice
Aprocy
喵,我也写过一个类似的东西……http://blog.kochiya.me/www/posts/Lolibot.html
focusfree
微信订阅号没有 AppID和AppSecret ,是否意味着不能用代码自定义菜单?
Kevin_Yang

引用来自“focusfree”的评论

微信订阅号没有 AppID和AppSecret ,是否意味着不能用代码自定义菜单?

嗯,是的,这些高级接口有一个试用,可以用一天…… 要么你就得做个认证……
程序猿1号
非常不错
天绝弑杀
事件推送的XML写在哪里啊,是重新写一个还是。。。
Kevin_Yang

引用来自“盛志强”的评论

事件推送的XML写在哪里啊,是重新写一个还是。。。

重写,写在模板文件夹下新建一个XML文件,上面有说到啊
hxz_qlh
ThumbMediaId参数,必须是通过微信认证的服务号才能得到,普通的服务号与订阅号可以忽略该参数,如果加上该参数到话会导致没有响应,这个问题折腾我好久,我湿了……18
416548283
为什么给字符串中的字符加上双引号,比如“help”,微信里收到的是",这个怎么不让它解析成这样呢~
416548283
不好意思,之前没有看到第3篇的解答,已经看到解决方案了~ 怒看小黄鸡~
fptxyy

引用来自“Kevin_Yang”的评论

引用来自“盛志强”的评论

事件推送的XML写在哪里啊,是重新写一个还是。。。

重写,写在模板文件夹下新建一个XML文件,上面有说到啊
上面没写名字,是不是取名reply_event.xml呢?
焖墩儿
调试音乐功能时,报错
File "/usr/local/sae/python/lib/python2.7/site-packages/web/template.py", line 911, in compile_template
compiled_code = compile(code, filename, 'exec')
File "/data1/www/htdocs/196/hexie335/1/templates/reply_music.xml", line 2
def __template__ (toUser,fromUser,createTime,musicTitle,musicDes,musicURL)<xml>:
^
SyntaxError: invalid syntax yq26

请问如何解决啊?
Kevin_Yang

引用来自“焖墩儿”的评论

调试音乐功能时,报错
File "/usr/local/sae/python/lib/python2.7/site-packages/web/template.py", line 911, in compile_template
compiled_code = compile(code, filename, 'exec')
File "/data1/www/htdocs/196/hexie335/1/templates/reply_music.xml", line 2
def __template__ (toUser,fromUser,createTime,musicTitle,musicDes,musicURL)<xml>:
^
SyntaxError: invalid syntax yq26

请问如何解决啊?
是$def 你少一个$
norma
我发现music = random.choice(musicList)不行啊
焖墩儿

引用来自“norma”的评论

我发现music = random.choice(musicList)不行啊
就是啊,我的音乐回复功能也调试不出来。楼主能不能把代码全部发上来看下啊
wei-chan
两个都出现了回复无反应 代码有的地方用的是双引号 有的是单引号 风格不统一
wei-chan

引用来自“焖墩儿”的评论

调试音乐功能时,报错
File "/usr/local/sae/python/lib/python2.7/site-packages/web/template.py", line 911, in compile_template
compiled_code = compile(code, filename, 'exec')
File "/data1/www/htdocs/196/hexie335/1/templates/reply_music.xml", line 2
def __template__ (toUser,fromUser,createTime,musicTitle,musicDes,musicURL)<xml>:
^
SyntaxError: invalid syntax yq26

请问如何解决啊?

引用来自“Kevin_Yang”的评论

是$def 你少一个$
不是那个问题 看一下你的参数是否对应 fromuser 或其他变量参数前 有没有加$
Khalil_Leo
博主您好,我按照您的文章加入了欢迎的代码,但是测试的时候始终没有欢迎信息回复,我在模板文件夹加入了reply_event.xml,还是不管用。请问我是哪里出了问题呢?
Kevin_Yang

引用来自“Khalil_Leo”的评论

博主您好,我按照您的文章加入了欢迎的代码,但是测试的时候始终没有欢迎信息回复,我在模板文件夹加入了reply_event.xml,还是不管用。请问我是哪里出了问题呢?
看下ERROR LOG信息,如果代码都和我一样的话可能是缩进问题,直接复制粘贴很容易产生缩进问题
×
Kevin_Yang
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: