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网络编程学习笔记(三):socket网络服务器
Jun 09 Python
python使用Berkeley DB数据库实例
Sep 26 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Python建立Map写Excel表实例解析
Jan 17 Python
Python函数参数操作详解
Aug 03 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
Mar 01 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python跳出双层for循环的解决方法
Jun 24 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
python3 配置logging日志类的操作
Apr 08 Python
python绘制雷达图实例讲解
Jan 03 Python
Django REST framework 限流功能的使用
Jun 24 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
Cannot modify header information错误解决方法
2008/10/08 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
详解Python中import机制
2020/09/11 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
大队干部竞选演讲稿
2014/04/28 职场文书
部门活动策划方案
2014/08/16 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
Go 内联优化让程序员爱不释手
2022/06/21 Golang