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实现基本进制转换的方法
Jul 11 Python
python 写的一个爬虫程序源码
Feb 28 Python
Python在图片中添加文字的两种方法
Apr 29 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
Python 脚本的三种执行方式小结
Dec 21 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
python的数学算法函数及公式用法
Nov 18 Python
Python日志模块logging用法
Jun 05 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
easyui的tabs update正确用法分享
2014/03/21 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
编程语言Python的发展史
2014/09/26 Python
Python编码类型转换方法详解
2016/07/01 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
django框架模板语言使用方法详解
2019/07/18 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
南京某公司笔试题
2013/01/27 面试题
中间件分为哪几类
2012/03/14 面试题
迷你西餐厅创业计划书范文
2013/12/31 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
生死抉择观后感
2015/06/09 职场文书
任命书格式范文
2015/09/22 职场文书