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转码问题的解决方法
Oct 07 Python
使用python实现baidu hi自动登录的代码
Feb 10 Python
Python判断直线和矩形是否相交的方法
Jul 14 Python
Python简单实现enum功能的方法
Apr 25 Python
python GUI实例学习
Nov 21 Python
python2.7和NLTK安装详细教程
Sep 19 Python
python实现简单登陆系统
Oct 18 Python
python生成器与迭代器详解
Jan 01 Python
对Python w和w+权限的区别详解
Jan 23 Python
python中的decimal类型转换实例详解
Jun 26 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
python打包多类型文件的操作方法
Sep 21 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
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
js HTML5手机刮刮乐代码
2020/09/29 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
Javascript模拟实现new原理解析
2020/03/03 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
基于Django用户认证系统详解
2018/02/21 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
机械专业应届生求职信
2013/09/21 职场文书
超市营业员求职简历的自我评价
2013/10/17 职场文书
教师申诉制度
2014/01/29 职场文书
合作协议书范本
2014/04/17 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
2014年女职工工作总结
2014/11/27 职场文书
大学推普周活动总结
2015/05/07 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js