原文参考

从零开始 Python 微信公众号开发
使用python一步一步搭建微信公众平台
添加用户关注后的欢迎信息与听音乐功能
Python快速搭建自动回复微信公众号
未认证订阅号自定义菜单与开发者兼得

所遇问题

git push sae master:1时候报如下错误:

1
2
G:\Web_python\xyPyTest>git push sae master:1
fatal: Authentication failed for 'https://git.sinacloud.com/super3h/'

解决方案:用户名密码就是你的github账户邮箱和密码,输入密码不是没反应,是你输入了但是不会显示,你输入完直接enter就ok了,sshkey是另外一种提交方式罢了!

lxml安装问题

1
2
3
4
5
6
E:\>easy_install lxml
Searching for lxml
Reading https://pypi.python.org/simple/lxml/
Best match: lxml 3.7.2
Downloading https://pypi.python.org/packages/66/45/f11fc376f784c6f2e77ffc7a9d02374ff3ceb07ede8c56f918939409577c/lxml-3.7.2.tar.gz#md5=8dcf8d6c692b7aed9370f7462ff09935
error: ('The read operation timed out',)

解决方案:
从官方网站下载与系统,Python版本匹配的lxml文件:lxml 2.3
执行 easy_install lxml-2.3-py2.7-win-amd64.egg即可。

详细解决方案请参考Python lxml模块安装教程

‘not found’页面

这个属于正常页面,因为index.wsgi只会接受http://6.super3h.applinzi.com/weixin的入口才会响应,对应微信配置如下:

具体详情请参考新浪云SAE搭建python环境SAE部署Python-让云端自动运行Python代码

自动回复无反应问题

原文参考代码有错index.wsgi中将import lxml改为import lxml.etree as etree,可进入sae日志中心查看代码错误原因,具体过程如下:

添加第三方依赖包

除了使用新浪云上已经预装的模块之外,您还可以通过以下方式给自己的应用添加第三方依赖包。

首先,在应用的根目录下创建一个第三方依赖包目录 vendor
调用pip命令安装依赖包,使用其-t选项指定第三方包的安装目录。3

1
$ pip install -t vendor PACKAGE ...

vendor 目录和应用的代码一起提交,即可在应用代码里使用安装的第三方依赖包了。

如果依赖包安装的目录名不为 vendor ,你需要在 index.wsgi 文件的最开始,添加以下代码,将目录加入到 sys.path 中。

1
2
3
import sae
sae.add_vendor_dir('路径')
# 注意:以上代码得放在 index.wsgi 的最前面,所有其它代码之前。

详情参考:添加第三方依赖包

编码问题

1
(unicode error) 'utf8' codec can't decode byte 0xd6 in position 2: invalid continuation byte yq26

具体原因:编码不一致,微信为gbk编码,本地为utf-8编码二导致编码不一致
解决方案:将本地用gbk解码,具体操作如下:

1
return self.render.reply_text(fromUser, toUser, int(time.time()), ('图中人物性别为:'+datas[0]+'\n'+'年龄为:'+datas[1]).decode('gbk'))

输入<>会被转义问题

由于![CDATA[$content]]而发生转义问题,改成如下模式即可:

1
2
3
4
5
6
7
8
$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>

音乐问题

由于百度云存储要钱的缘故。。。所以我选择了新浪云。

问题: 苹果手机中不能听

解决方案: 还没解决。。能力有限。

后续: 那天闲来无事,进公众号点了首歌,发现不能放了,原来是新浪云把歌的链接给改了。。没办法存在了qq邮箱的中转站,原文点击此教你快速添加qq空间背景音乐免费网络歌曲链接

新闻列表

templates\reply_url.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$def with (toUser,fromUser,createTime,content,title,description,picUrl,url)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[$content]]></Content>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[$title]]></Title>
<Description><![CDATA[$description]]>
</Description>
<PicUrl><![CDATA[$picUrl]]></PicUrl>
<Url><![CDATA[$url]]></Url>
</item>
</Articles>
<FuncFlag>0</FuncFlag>
</xml>

weixinInterface.py添加这一句:

1
2
3
4
5
6
7
8
def POST(self):
if msgType == 'text':
content = xml.find("Content").text
#添加这一句
if isinstance(replayText,list):
articleList = [article['article']+'\n详情'.decode('gbk')+article['detailurl'] for article in replayText]# 一定要写在此文件里,写在tulingAutoReply.py会报缩进问题
reply = random.choice(articleList)
return self.render.reply_text(fromUser,toUser,int(time.time()),reply)

tulingAutoReply.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# coding:utf-8
import json
import requests
import traceback
from random import choice
class TulingAutoReply:
def __init__(self, tuling_key, tuling_url):
self.key = tuling_key
self.url = tuling_url
def reply(self, reply):
body = {'key': self.key, 'info': reply}
r = requests.post(self.url, data=body)
#设置编码
r.encoding = 'utf-8'
resp = r.text
if resp is None or len(resp) == 0:
return None
try:
js = json.loads(resp)
# 回复为文本类
if js['code'] == 100000:
return js['text']
# 回复为链接类
elif js['code'] == 200000:
return js['url']
# 回复为新闻类
elif js['code'] == 302000:
return js['list']
# 其他
else:
return None
except Exception:
traceback.print_exc()
return None

博主本来准备做语音识别,结果好像认证后才提供此接口,这里把原文贴出来,供大家参考听得懂语音消息的聊天机器人

微信图文信息直接跳转至外部链接

点击菜单跳转到网页必须要认证才行,我们可以用关键字回复来实现跳转至外部链接
在templates下添加reply_url.xml,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$def with (toUser,fromUser,createTime,content,title,description,picUrl,url)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[$content]]></Content>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[$title]]></Title>
<Description><![CDATA[$description]]>
</Description>
<PicUrl><![CDATA[$picUrl]]></PicUrl>
<Url><![CDATA[$url]]></Url>
</item>
</Articles>
<FuncFlag>0</FuncFlag>
</xml>

weixinInterface.py添加这一句:

1
2
3
4
if msgType == 'text':
content = xml.find("Content").text
if content == '博客'.decode('gbk'):
return self.render.reply_url(fromUser,toUser,int(time.time()),content,'个人博客'.decode('gbk'),'HHH的个人博客'.decode('gbk'),r'https://mmbiz.qlogo.cn/mmbiz_jpg/z67Nqg3yAzRNVazozLUD7icuibRJdnCDaJd1dTfQ9673IDS6ttA5cFQwQCic7IrjPhbTcX1ycQDGibJhlGaFbwzyyg/0?wx_fmt=jpeg',r'http://super3h.github.io')

源码链接

欢迎订阅 ProgrammerBy3H 求star star star!!