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 输出一个两行字符的变量
Feb 05 Python
python3编写C/S网络程序实例教程
Aug 25 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
Python兔子毒药问题实例分析
Mar 05 Python
Python实现单词拼写检查
Apr 25 Python
介绍Python中的文档测试模块
Apr 28 Python
浅谈Python的文件类型
May 30 Python
python中virtualenvwrapper安装与使用
May 20 Python
python查看模块安装位置的方法
Oct 16 Python
python list转置和前后反转的例子
Aug 26 Python
Django用户认证系统如何实现自定义
Nov 12 Python
如何判断pytorch是否支持GPU加速
Jun 01 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP无敌近乎加密方式!
2010/07/17 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[00:35]可解锁地面特效
2018/12/20 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
百日安全活动总结
2014/05/04 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
公司授权委托书范本
2014/09/18 职场文书