python代码实现扫码关注公众号登录的实战
作者:冰风漫天 时间:2021-11-18 04:40:43
目录
获取二维码部分
获取关注状态值
解析微信服务器报文
大致思路:调用微信带参数二维码接口生成二维码,前端显示二维码同时于服务器进行长链接通信,监控关注状态,如果有对应的场景码参数的关注,则进行登录操作。
下面是服务示意图
主要代码实现:
获取二维码部分
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'}
来源:https://juejin.cn/post/7024324555476828168
标签:python,扫码,关注,公众号,登录
0
投稿
猜你喜欢
Go Gin实现文件上传下载的示例代码
2023-06-21 15:11:13
Python使用函数默认值实现函数静态变量的方法
2023-03-11 16:54:46
Django中数据在前后端传递的方式之表单、JSON与ajax
2022-08-09 11:32:44
python中的线程threading.Thread()使用详解
2021-02-25 21:38:38
python matplotlib库绘制条形图练习题
2023-04-20 05:49:51
整理几个js日历源代码
2008-01-03 13:13:00
IE及Opera浏览器兼容笔记
2008-08-21 17:53:00
python定时执行指定函数的方法
2021-04-09 03:20:14
MySQL字符串前缀索引使用
2024-01-22 17:58:58
Python中装饰器兼容加括号和不加括号的写法详解
2022-08-09 10:46:25
如何判断pytorch是否支持GPU加速
2023-10-06 11:46:49
PHP计算字符串真正的宽度和高度像素(图片加文字水印示例)
2023-05-28 06:48:44
浅谈Python中re.match()和re.search()的使用及区别
2022-05-11 12:48:44
SELECT...INTO的具体用法
2024-01-29 02:20:43
golang import自定义包方式
2024-04-25 15:08:55
python多线程扫描端口示例
2022-06-28 23:18:58
Python 标准库 fileinput与文件迭代器
2023-10-31 22:36:50
推荐四款可视化工具(解决99%的可视化大屏需求)
2022-05-06 03:37:39
Python实现双向链表基本操作
2022-07-22 10:14:12
兼容IE,FF的弹出层登陆界面代码
2008-01-04 12:13:00