python代码实现扫码关注公众号登录的实战


Posted in Python onNovember 01, 2021

大致思路:调用微信带参数二维码接口生成二维码,前端显示二维码同时于服务器进行长链接通信,监控关注状态,如果有对应的场景码参数的关注,则进行登录操作。

下面是服务示意图

python代码实现扫码关注公众号登录的实战

主要代码实现:

获取二维码部分

1.取access_token

app_id = 'xxxx'
app_secret = 'xxxxxx'
url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'.format(app_id, app_secret)
resp = requests.get(url)
rs = util.get_redis_con()
access_token = resp.json()['access_token']
print(access_token)

这个access_token的有效期是两小时,所以建议写个定时任务,每一小时执行一下,存到redis,用的时候redis取一下。

2.取ticket

my_scene_str = 'xxxxx'  # 场景码可以做个key放到redis里并设置一个和二维码一样的过期时间 
url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}'.format(access_token)
data = {
        "expire_seconds": 604800,
        "action_name": "QR_STR_SCENE",
        "action_info": {"scene": {"scene_str": md5_user_key}}
}
resp = requests.post(url, json=data)
ticket = resp.json()['ticket']

3.取二维码图片(这里返回图片的同时把场景码也一并返回给前端,这样如果前端用轮询获取关注状态的话就可以不使用长链接了)

url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket
resp = requests.get(url)
img = base64.b64encode(resp.content).decode('ascii')
print(img)

这个里取到的图片用base64返回给前端,前端使用src="data:image/png;base64,"+img 就可以显示了

获取关注状态值

方法一:使用场景码轮询
发送请求轮询md5_user_key
方法二:使用场景码建立长链接连接,等待服务器推送
flask建议使用socketio

解析微信服务器报文

新关注用户扫码报文内容

<xml>
<ToUserName><![CDATA[xxxxxxxxxxxxx]]></ToUserName>
<FromUserName><![CDATA[xxxxxxxxxxx]]></FromUserName>
<CreateTime>1609128953</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[xxxxxx]]></EventKey>
<Ticket><![CDATA[xxxxxxxx]]></Ticket>
</xml>

老用户扫码报文内容

<xml>
<ToUserName><![CDATA[xxxxxxxxxxxx]]></ToUserName>
<FromUserName><![CDATA[xxxxxxxxxxxxx]]></FromUserName>
<CreateTime>1609127524</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[xxxxxxxxxxxxxx]]></EventKey>
<Ticket><![CDATA[xxxxxxxxxxxxxxxxxxx]]></Ticket>
</xml>

ToUserName:公众号的id
FromUserName:用户的openid 

import xml.etree.ElementTree as ET
root = ET.fromstring(request.data.decode('utf-8'))
dic = {}
for x in root:
    dic[x.tag] = x.text

if dic.get('MsgType') == 'event':
    if dic.get('Event') == 'subscribe':
        parse_subscribe(dic)  # 新关注用户扫码
    if dic.get('Event') == 'SCAN':
        parse_scan(dic)  # 已经关注用户扫码

使用openid获取关注的微信用户信息

url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={access_token}&openid={open_id}&lang=zh_CN"
resp = requests.get(url.format(access_token=access_token, open_id=open_id))
resp.encoding = 'utf-8'
return resp.json()

返回参数

{'subscribe': 1, 
'openid': 'xxxxxxxxxxxxxxxxxxx', 
'nickname': 'xxx', 
'sex': 1, 
'language': 'zh_CN', 
'city': 'xx',
 'province': 'xx', 
 'country': 'xx', 
 'headimgurl': 'http://thirdwx.qlogo.cn/mmopen/xxxxxxxxxxxxxxxxxx/xxx', 
 'subscribe_time': 1609128953, 
 'unionid': 'xxxxxxxxxxxxxxxxx', 
 'remark': '', 
 'groupid': 0, 
 'tagid_list': [], 
 'subscribe_scene': 'ADD_SCENE_QR_CODE', 
 'qr_scene': 0, 
 'qr_scene_str': 'xxxxxxxxxxxxxxxxxxxx'}

到此这篇关于python代码实现扫码关注公众号登录的实战的文章就介绍到这了,更多相关python 扫码关注公众号登录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python类定义的讲解
Nov 01 Python
浅析Python编写函数装饰器
Mar 18 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
python可视化爬虫界面之天气查询
Jul 03 Python
python移位运算的实现
Jul 15 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python简单实现最大似然估计&amp;scipy库的使用详解
Apr 15 Python
Python3基于print打印带颜色字符串
Jul 06 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
python编程实现清理微信重复缓存文件
Nov 01 #Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 #Python
Python字典的基础操作
Nov 01 #Python
Python集合的基础操作
Nov 01 #Python
python基础之类属性和实例属性
python基础之类方法和静态方法
Python Matplotlib绘制条形图的全过程
You might like
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
javascript屏蔽右键代码
2014/05/15 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
python实现的udp协议Server和Client代码实例
2014/06/04 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
python中加背景音乐如何操作
2020/07/19 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
总裁岗位职责
2013/12/04 职场文书
医大实习自我鉴定
2013/12/07 职场文书
平面设计求职信
2014/03/10 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
2014年三万活动总结
2014/04/26 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2015年预算员工作总结
2015/05/14 职场文书