python代码实现扫码关注公众号登录的实战

作者:冰风漫天 时间:2021-11-18 04:40:43 

目录
  • 获取二维码部分

  • 获取关注状态值

  • 解析微信服务器报文

大致思路:调用微信带参数二维码接口生成二维码,前端显示二维码同时于服务器进行长链接通信,监控关注状态,如果有对应的场景码参数的关注,则进行登录操作。

下面是服务示意图

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'}

来源:https://juejin.cn/post/7024324555476828168

标签:python,扫码,关注,公众号,登录
0
投稿

猜你喜欢

  • 从Vista地址栏到网站导航菜单

    2009-09-08 12:35:00
  • asp如何实现点击数的计算?

    2010-05-18 18:39:00
  • python 包实现 urllib 网络请求操作

    2023-11-03 07:19:50
  • 如何利用python正确地为图像添加高斯噪声

    2023-08-03 08:26:22
  • MySQL Server 5.0安装教程(图解)

    2010-10-14 14:26:00
  • 解析CSS列表样式属性list-style

    2009-03-26 13:16:00
  • 用css3-tranistions实现平滑过渡

    2009-12-23 19:24:00
  • sql ntext数据类型字符替换实现代码

    2011-09-30 11:08:00
  • 关于交互设计在QQ秀赠送流程中的优化

    2009-06-11 12:30:00
  • 不同情况下修复Access数据库的实用方法

    2008-11-28 16:18:00
  • ASP脚本循环语句

    2009-02-19 13:34:00
  • asp使用session防止网页频繁刷新

    2007-09-26 14:25:00
  • ORACLE 常用函数总结(80个)第1/2页

    2009-09-18 13:23:00
  • 使用PHP实现生成HTML静态页面

    2023-11-14 11:14:41
  • SQL Server 2005日志文件损坏的处理方法

    2008-12-02 14:36:00
  • javascript开发经验谈

    2009-05-01 12:14:00
  • 原创一个js对联广告类(兼容FireFox)

    2008-08-01 18:08:00
  • PHP 中文简繁互转代码 完美支持大陆、香港、台湾及新加坡

    2023-11-15 11:46:16
  • 简单的淡入淡出图片轮换效果

    2009-05-22 18:38:00
  • tensorflow 重置/清除计算图的实现

    2023-07-23 00:41:58
  • asp之家 网络编程 m.aspxhome.com