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 相关文章推荐
Django Admin 实现外键过滤的方法
Sep 29 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
python实现周期方波信号频谱图
Jul 21 Python
Python中return self的用法详解
Jul 27 Python
Django实现文件上传下载
Oct 06 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
通过cmd进入python的步骤
Jun 16 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
python中如何使用虚拟环境
Oct 14 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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
PHP模板引擎SMARTY
2006/10/09 PHP
PHP新手上路(二)
2006/10/09 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
Node.js学习入门
2017/01/03 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python守护进程用法实例分析
2015/06/04 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
人力资源专业推荐信
2013/11/29 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
毕业感言怎么写
2015/07/31 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript