参考使用python一步一步搭建微信公众平台(一)尝试搭建微信订阅号,采用较旧的方法:
- 申请订阅号,添加新浪各个节点到ip白名单
- 新浪云sae应用,将代码git到新浪云sae应用
- 配置服务器发现Token验证失败。。。。。
- 查看sae日志中心:
1.earth.applinzi.com 211.94.195.165 0.080 0.080 [23/Nov/2018:10:06:49 +0800] earth 978 1 GET /templates/.placeholder HTTP/1.1 500 65 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" yq30
- 检查代码无果,但config.yaml的webpy, lxml版本都是按照旧的,可能新浪环境变了吧,或者暂时发现不了问题。。。。头大
python微信公众号开发简单流程
2019.1.17 考虑到新浪sae比较旧了,所以就买了阿里云ECS
远程登录ssh root@ip地址
,有了ip就方便多了。
将服务器入端口80打开,打开注册好的微信公共平台,在服务器配置一栏写上:服务器外网IP地址/文件所在包名
,再写好秘钥,token要保持和myapp.py
一致,点击启动配置,就可以了。
使用微信公众平台接口调试工具,发现要配置当前客户端到ip白名单,实际使用用户可以随意关注使用公共号。
新的服务器是空白的,ubuntu14.0.4下自带Python2.7和3.4,我们安装一些常用的tree命令等等,然后在root目录下新建test文件夹,安装pyenv,创建虚拟环境env364
,pyenv activate env364
进入虚拟环境,注意以下操作(主要是安装,运行)都在虚拟环境中进行:
安装python3,flask,uwsgi,新建脚本
配置nginx连接uwsgi失败,目前用nohup python myapp.py
运行脚本,或nohup uwsgi uwsgi_config.ini
,然后关闭终端即可。
脚本同级目录下建立uwsgi_config.ini
,配置如下
[uwsgi]
http = 0.0.0.0:80 # 应该需要是80端口
processes = 4
threads = 2
master = true
pythonpath = /root/test # 包目录
wsgi-file = /root/test/myapp.py # 应用脚本
callable = app # 应用脚本创建的app对象"app = Flask(__name__)"
memory-report = true
# myapp.py
from flask import Flask, request
import hashlib
app = Flask(__name__)
@app.route('/test',methods=['GET','POST'])
def index():
if request.method == 'GET':
token = 'renjianleyuan' # 这里填上你的token
data = request.args
signature = data.get('signature','')
timestamp = data.get('timestamp','')
nonce = data.get('nonce','')
echostr = data.get('echostr','')
ls = [token, timestamp, nonce]
ls.sort()
s = ''.join(ls)
hashcode = hashlib.sha1(s.encode('utf-8')).hexdigest()
if hashcode == signature:
return echostr
else:
return ''
if __name__ == '__main__':
app.run(host='0.0.0.0',port=80,debug=True)
加上处理POST请求,回复处理模块
# myapp.py
...
import xml.etree.ElementTree as ET
import reply
...
...
if request.method == 'POST':
data = request.data
# print(request.args, request.data) # 测试
recv = ET.fromstring(data)
ToUserName = recv.find('ToUserName').text
fromUser = recv.find('FromUserName').text
MsgType = recv.find('MsgType').text
Content = recv.find('Content').text
MsgId = recv.find('MsgId').text
return reply.reply_text(MsgType) % (fromUser, ToUserName, int(time()), Content)
# reply.py
text = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>"
def reply_text(msgType):
print(msgType)
if msgType == 'text':
return text
参考这里,但有一些错误,要注意下 Python3-Flask-微信公众号开发-3