微信公众号python开发_Python微信公众号开发
准备工作
首先,申请一个属于自己的微信公众号(必须保证全局管理员是自己的微信账户,否则会很麻烦),还要拥有自己的服务器(Ubuntu 系统)来部署代码,且服务器已经成功安装了网络相关的两个常用软件 uwsgi 和 nginx ,前者一般用于进程控制,后者用于反向代理。
服务器端部署流程
第一步,在 Ubuntu 系统安装 venv :
sudo apt-get install python3-venv
第二步,创建 Python3 的虚拟环境:
python3 -m venv myvenv
注意:source myvenv/bin/activate表示激活虚拟环境,deactivate退出虚拟环境
第三步,在虚拟环境中升级pip:
pip install --upgrade pip
然后安装requirements.txt文件内的模块:
pip install -r requirements.txt
第四步:主代码的编写,主要有两种方法:
一种方法,直接下载我已经写好的代码运行即可:
git clone git@github.com:zfb132/wechatPlatform.git
另一种方法,自己逐个创建代码,创建所有代码后的目录文件结构如下:
wechatPlatform/
wechatPlatform/app/
wechatPlatform/app/__init__.py
wechatPlatform/app/config.py
wechatPlatform/app/controller/
wechatPlatform/app/controller/main.py
wechatPlatform/log.py
wechatPlatform/requirements.txt
wechatPlatform/runserver.py
各文件内容附在文章的最后。其中,要把config.example.py文件重命名为config.py,然后把里面的token改成自己的
第五步,编辑nginx.conf文件:
sudo vi /etc/nginx/nginx.conf
在合适位置添加以下内容:
server{
listen 80;
server_name xxxx.whuzfb.cn;
access_log /home/ubuntu/wechatPlatform/log/access.log;
error_log /home/ubuntu/wechatPlatform/log/error.log;
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:8111;
proxy_pass http://127.0.0.1:8111/;
}
}
然后再重启 nginx 服务:
service nginx restart
最后启动本代码在后台运行:
uwsgi uwsgi_wechat.ini -d ./server.log
至此,服务器端的代码已经全部编写并部署完成
注意:在启动uwsgi后会生成四个进程监听8111端口,如果想要杀死他们,先查看占用8111端口的所有进程的ID(不能直接关闭uwsgi,这可能会影响到其他项目),终端输入lsof -i:8111命令即可查看,然后使用kill -9 id依次杀死各个进程;这种方法比较麻烦,另一种快速的方法是:
kill -9 $(lsof -t -i:8111)
此命令可一步到位杀死所有占用8111端口的进程
微信平台网页端配置
浏览器打开微信公众平台登录自己的管理员账户,点击开发栏目,选择基本配置,根据网页提示填写这三个内容(一般选择明文模式):
网页端配置
需要注意的是,一定要先在服务器端把代码运行起来,这样才能成功保存网页端的配置
附录
log.py文件内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import logging
from logging.handlers import RotatingFileHandler
LOG_FORMAT = "%(asctime)s [%(funcName)s: %(filename)s,%(lineno)d] - %(levelname)s : %(message)s"
DATE_FORMAT = "%m/%d/%Y %H:%M:%S"
LOG_PATH = "./log/"
# 初始化日志文件配置
def initLog(fileName,logger):
# 创建日志文件夹
if not os.path.exists(LOG_PATH):
os.mkdir(LOG_PATH)
myapp = logging.getLogger(logger)
myapp.setLevel(logging.DEBUG)
# 切割日志文件
handler = RotatingFileHandler(LOG_PATH+fileName, maxBytes=128*1024,backupCount=60)
handler.setFormatter(logging.Formatter(LOG_FORMAT,DATE_FORMAT))
myapp.addHandler(handler)
return myapp
runserver.py文件内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from app import app
from log import initLog
logging = initLog('wechat.log','runserver')
if __name__ == '__main__':
app.run(debug=True,port=8111)
application = app
config.py文件内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
DEFAULTMESSAGE = "你好,消息已收到"
token = "mytoken"
__init__.py文件内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
import logging
import os
app = Flask(__name__)
app.secret_key = "thisissecretkey"
from app.controller.main import *
main.py文件内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from app import app
from flask import request
import app.config as config
import logging
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply
from wechatpy.replies import ImageReply
logging = logging.getLogger('runserver.main')
def handlemsg(data):
msg = parse_message(data)
print(msg)
logging.debug('handle msg:'.format(msg))
xml = txtreply(msg,msg.content)
return xml
# 微信消息接口
@app.route('/',methods=["POST","GET"])
def main():
logging.debug('进入主页面')
try:
signature = request.args.get("signature", "")
timestamp = request.args.get("timestamp", "")
nonce = request.args.get("nonce", "")
echostr = request.args.get("echostr", "")
# echostr是微信用来验证服务器的参数,需原样返回
if echostr:
try:
logging.debug('正在验证服务器签名')
check_signature(config.token, signature, timestamp, nonce)
logging.debug('验证签名成功')
return echostr
except InvalidSignatureException as e:
logging.error('检查签名出错: '.format(e))
return 'Check Error'
# 也可以通过POST与GET来区别
# 不是在进行服务器验证,而是正常提交用户数据
logging.debug('开始处理用户消息')
xml = handlemsg(request.data)
return xml
# 处理异常情况或忽略
except Exception as e:
logging.error('获取参数失败: '.format(e))
def imgreply(msg,id):
reply = ImageReply(message=msg)
reply.media_id = id
xml = reply.render()
return xml
def txtreply(msg,txt):
reply = TextReply(content=txt, message=msg)
xml = reply.render()
return xml
uwsgi_wechat.ini文件内容:
[uwsgi]
# http协议对客户端开发的端口号
http = 0.0.0.0:8111
# 应用目录,即python代码所在目录
pythonpath = ./
# web 应用python主程序
wsgi-file = ./runserver.py
# 一般在主运行程序里指定 app = Flask(__name__)
callable = app
# 工作进程数
processes = 4
# 线程数
threads = 2
# 指定日志文件
demonize = ./server.log
# python 虚拟环境目录
home = ./myvenv
后记
虽然目前这个代码只是把用户发来的消息再原封不动的返回给用户,看起来好像折腾了半天并没有实现啥有趣的功能,但是它最少实现了解析用户发来的消息以及返回给用户文字消息的功能,这已经足够了。消息处理的逻辑可以自己继续慢慢完善,比如接入图灵机器人等有趣功能
微信公众号python开发_Python微信公众号开发相关推荐
- python抓取微信文件_fiddle python抓取微信公众号文章
分析 1,先进行准备工作:使用fiddle抓包(大家可以自行百度怎么使用哦) 2,打开电脑端微信,找到需要爬取的公众号 点击进入公众号,再打开fiddle,微信停留在这一步 打开fiddle后再点击微 ...
- python开发微信小程序-Python 开发者的微信小程序开发实践
导读 在知乎上,有人提问"如何使用 Python 开发微信小程序". 其实微信小程序作为一个前端的机制,Python 并不能插上边.只不过可以作为后端接口为微信小程序提供数据服务而 ...
- 微信防撤回python代码_Python实现微信防撤回
微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:"摇一摇"."漂流 ...
- 微信防撤回python代码_python实现微信消息防撤回
微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:"摇一摇"."漂 ...
- 微信小程序python自动化测试_微信小程序的自动化测试框架
微信小程序的自动化测试框架 微信发布了小程序的自动化测试框架Minium,提供了多种运行验证方式,其特点: 支持一套脚本,iOS & Android & 模拟器,三端运行 提供丰富的页 ...
- 微信小程序 python 自动化测试_微信小程序的自动化测试框架
微信小程序的自动化测试框架 微信发布了小程序的自动化测试框架Minium,提供了多种运行验证方式,其特点: 支持一套脚本,iOS & Android & 模拟器,三端运行 提供丰富的页 ...
- python基础教程微信_用Python实现让微信地球转起来附代码!
微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片. 大概是站在月亮上看地球的效果. 你有没有想过,如果上面那个地球转起来会是怎样? 素材 这里有两个表面素材,一个是地球表面素材,一个是云图素 ...
- linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)
shell或python调用企业微信发送消息(实现报警功能) 官方文档 注册登陆企业微信 登录企业微信管理端 -> 应用与小程序 -> 应用 -> 自建,点击"创建应用&q ...
- 微信运营——利用python自动加微信(通往销冠之路)
前言: 运营获客,微信运营也是其中一种,没想到不是老客户运营,而是直接加陌生微信.先不管效果怎么样,说说如果利用python自动加微信.我们公司和兔展合作,还建立了公司,估计也花了不少钱,但是我自己一 ...
- 微信 小程序 python 商城_微信小程序——商城篇
前言 随着wepy和mpvue的出现及流行,开发小程序变的越来越便捷和强大,作为基佬社区的一份子,我们都需要把自己遇到的问题以及如何解决的方式相互分享,这样才能帮助到更多的朋(ji)友(lao).如有 ...
最新文章
- android 不同activity之间传递数据
- OpenStack七年盘点,热潮褪去后的明天在哪?
- 【专栏】好Leader和差Leader的8个区别
- opencv 罗曼滤波_勒罗曼杜罗伊
- webui框架的利与弊
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- Android:日常学习笔记(8)———探究UI开发(5)
- Web开发中的矢量绘图(vml,svg)处理和应用
- 泰勒及洛朗展开学习笔记
- 零基础小白学习UI设计的4个步骤
- Hazelcast发布开源流处理引擎Jet
- 高盛:Github开源、Marquee、SecDB
- E-Prime2.0安装避坑指南
- Netty4 websocke实现聊天功能
- 个人网页LOGO设计(作业)
- 工具应用——Chrome浏览器 F12控制台中文改成英文
- 一个IOS音乐播放器源码
- webuploader怎样上传文件夹
- CodeSmith Professional v5.1.3.8510 破解(2009.7.1)
- FileZilla Server报错Could not load TLS libraries 的解决方法