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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
python如何实现单链表的反转
Feb 10 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
Python selenium爬虫实现定时任务过程解析
Jun 08 Python
Python基于traceback模块获取异常信息
Jul 23 Python
Python+Appium新手教程
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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
茶叶店创业计划书范文
2014/01/19 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
写给父母的感谢信
2015/01/22 职场文书
python基础之匿名函数详解
2021/04/21 Python
python字典的元素访问实例详解
2021/07/21 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android