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提取字典key列表的方法
Jul 11 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
Python使用剪切板的方法
Jun 06 Python
Python构建网页爬虫原理分析
Dec 19 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
python3.7.0的安装步骤
Aug 27 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
python中列表的含义及用法
2020/05/26 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
用python实现一个简单的验证码
2020/12/09 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
一套Java笔试题
2016/08/20 面试题
费用会计岗位职责
2014/01/01 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
共产党员承诺书
2014/03/25 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
2014年稽查工作总结
2014/12/20 职场文书
银行自荐信怎么写
2015/03/05 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
四则混合运算教学反思
2016/02/23 职场文书