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 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
python对离散变量的one-hot编码方法
Jul 11 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
Python中zip()函数的简单用法举例
Sep 02 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
python之json文件转xml文件案例讲解
Aug 07 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
example1.php
2006/10/09 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
JavaScript实现的拼图算法分析
2019/02/13 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python实现求特征选择的信息增益
2018/12/18 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
如何卸载python插件
2020/07/08 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
C语言如何决定使用那种整数类型
2016/11/26 面试题
实习护士自我鉴定
2013/10/13 职场文书
yy婚礼主持词
2014/03/14 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏