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解析xml文件实例分享
Dec 04 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
python计算日期之间的放假日期
Jun 05 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
python返回数组的索引实例
Nov 28 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Django集成MongoDB实现过程解析
Dec 01 Python
Python字典的基础操作
Nov 01 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解答方法
2012/02/04 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
js函数般调用正则
2008/04/08 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
js同源策略详解
2015/05/21 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
python实现bucket排序算法实例分析
2015/05/04 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
红色旅游心得体会
2014/09/03 职场文书
单位婚育证明范本
2014/11/21 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
Go 语言结构实例分析
2021/07/04 Golang
python pygame 开发五子棋双人对弈
2022/05/02 Python