简介
本文总结了开发微信公众号的后台接入过程的步骤和经验,主要包括:
VPS
服务器搭建 Python
+ Werobot
环境,搭建 FTP
服务器,使用FileZilla
方便代码上传(环境为 Ubuntu 16.04LTS
);
成果展示
如下图所示:
安装Python3
# 切换到root
sudo -i
apt-get install python3 python3-pip python3-dev
安装Werobot
pip3 install werobot
安装FTP
博主已经预装 lnmp
环境,直接选择压缩文件的 pureftpd.sh
执行
一键安装lnmp环境
注意:执行 lnmp ftp add
操作前先创建一个网站目录,否则安装完后要重新添加软连接
创建 ftp
账号, 按步骤输入 name
, password
, directory
注意:第三步目录位置要写绝对路径
# 列出所有ftp账户
lnmp ftp list
# 删除某个ftp账户
lnmp ftp del
使用FileZilla连接FTP服务器
获取微信公众平台配置
注意:先别点击提交,会提示 token
验证失败,需要后面操作完成后在保存
创建简单案例hello.py
#coding:utf-8
# Filename:hello_world.py
# 验证服务器,并且收到的所有消息都回复'Hello World!'
import werobot
# token 来自于微信公众平台基本配置
robot = werobot.WeRoBot(token='your token')
# @robot.handler 处理所有消息
@robot.handler
def hello(message):
return 'Hello World!'
# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()
python3 hello.py # 运行
此时在公众平台点击提交,提示 token
验证成功,然后点击启用
创建目录结构
完善帮助提示help.py
class Help:
def start():
reply = '帮助文档\n'
reply_1 = '【1】 查询天气: 城市+天气,例如“杭州天气”\n'
reply_2 = '【2】 短网址: 输入“短网址+链接”转成短网址\n'
reply_3 = '【3】 搜歌: 输入“歌曲:歌名”搜索歌曲,例如(歌曲-男孩)\n'
return reply + reply_1 + reply_2 + reply_3
完善短网址功能shortUrl.py
百度短网址API
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
class ShortUrl:
def create(address):
newAddress = address.split('短网址', 1)
host = 'https://dwz.cn'
path = '/admin/v2/create'
url = host + path
method = 'POST'
content_type = 'application/json'
# TODO: 设置Token
token = '填入百度开发者的token'
# TODO:设置待创建的长网址
bodys = {'Url':newAddress[1],'TermOfValidity':'1-year'}
# 配置headers
headers = {'Content-Type':content_type, 'Token':token}
# 发起请求
response = requests.post(url=url, data=json.dumps(bodys), headers=headers)
# 读取响应
# print(response.text['ErrMsg'])
resDict = json.loads(response.text)
if (resDict['ErrMsg'] == ''):
return resDict['ShortUrl']
else:
return resDict['ErrMsg']
完善搜歌功能music163.py
音乐集成API
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
class Music163:
# 歌曲Id
def searchSong(musicName):
newMusicName = musicName.split('歌曲-', 1)
defaulUrl = 'https://v1.itooi.cn/netease/search?type=song&pageSize=1&page=0&'
searchStr = 'keyword=' + newMusicName[1]
url = defaulUrl + searchStr
method = 'GET'
# 发起请求
response = requests.get(url)
# 读取响应
resDict = json.loads(response.text)
songIds = resDict['data']['songs']
name = songIds[0]['name']
singer = songIds[0]['ar'][0]['name']
id = songIds[0]['id']
singleSong = {'name': name, 'singer': singer, 'id': id}
return singleSong
# 歌曲地址
def songUrl(singleSong):
tempArr = []
defaulUrl = 'https://v1.itooi.cn/netease/url?quality=320&isRedirect=0&'
searchStr = 'id=' + str(singleSong['id'])
url = defaulUrl + searchStr
method = 'GET'
# 发起请求
response = requests.get(url)
# 读取响应
resDict = json.loads(response.text)
name = singleSong['name']
singer = singleSong['singer']
url = resDict['data']
return [name, singer, url]
完善主入口hello.py
#coding:utf-8
import sys, random, json, re
sys.path.append('./util/')
from werobot import WeRoBot
from werobot.replies import TextReply, ArticlesReply, Article, MusicReply
# 帮助wiki
from help import Help
# 转换短网址
from shortUrl import ShortUrl
# 歌曲搜索
from music163 import Music163
robot = WeRoBot(token='填入公众号token')
# 文本消息
@robot.filter('天气')
def start():
return Help.start()
# 短网址
@robot.filter(re.compile('短网址.*?'))
def transUrl(message):
# return message.content
reply = TextReply(message=message, content=ShortUrl.create(message.content))
return reply
# 歌曲搜索
@robot.filter(re.compile('歌曲-.*?'))
def searchMusic(message):
singleSong = Music163.searchSong(message.content)
dealArr = Music163.songUrl(singleSong)
return dealArr
# 图片消息
@robot.image
def img(message):
return message.img
# 被关注
@robot.subscribe
def showWiki():
return Help.start()
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()
暗坑
在开发前一定要统一环境,确定使用 python2
还是 python3
,否则写代码和调试很容易出问题,我本地 python2
运行正常,线上 python3
报错,后来发现 python3
有些方法没有了:示例
token
验证仅支持 80
端口和 443
端口,否则会一直出现 token验证失败
python3
在 print
的内容必须用括号包裹(调试常遇到)
在 python3 hello.py
运行报错端口被占用,解决如下:
netstat -lnp|grep 80 # 查看80端口被哪些服务占用
# 大概率是nginx,杀掉即可
nginx -s stop
# 重新运行
python3 hello.py
报错类似 'ascii' codec can't encode character
请检查返回值是否正确 string
有时候线上运行代码报错,但是调试其实只需要改动一点点,避免 ftp
重复劳动,直接 putty
连接使用 vi
修改
其实最一开始我是选的 Django
+ wechatpy
开发的,写了 Demo
,token
验证也能通过,就是在消息 reply
处理总是出现各种莫名问题,很烦,然后继续找框架,才用上 werobot
参考文档