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 相关文章推荐
pycharm 使用心得(四)显示行号
Jun 05 Python
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
零基础写python爬虫之抓取糗事百科代码分享
Nov 06 Python
Python编程中的反模式实例分析
Dec 08 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
Python实现截屏的函数
Jul 25 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
VSCode下好用的Python插件及配置
Apr 06 Python
python实现log日志的示例代码
Apr 28 Python
Python处理session的方法整理
Aug 29 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
Python小白学习爬虫常用请求报头
Jun 03 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
angularjs 页面自适应高度的方法
2018/01/17 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
django反向解析和正向解析的方式
2018/06/05 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
Python函数调用追踪实现代码
2020/11/27 Python
剪枝的学问教学反思
2014/02/07 职场文书
趣味比赛活动方案
2014/02/15 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
职工年度考核评语
2014/12/31 职场文书
检讨书范文1000字
2015/01/28 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js