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脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
python中__call__内置函数用法实例
Jun 04 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
python队列queue模块详解
Apr 27 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
用python实现学生管理系统
Jul 24 Python
Python正则re模块使用步骤及原理解析
Aug 18 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操作XML作为数据库的类
2010/12/19 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python pickle模块用法实例
2015/04/14 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python实现的栈(Stack)
2018/01/26 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python安装requests库的实例代码
2019/06/25 Python
python ETL工具 pyetl
2020/06/07 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
火山动力Java笔试题
2014/06/26 面试题
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
党员示范岗材料
2014/12/19 职场文书
2016公司新年问候语
2015/11/11 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP