python代碼實現掃碼關注公眾號登錄

冰風漫天 2021-10-29 16:00:32
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://pythonmana.com/2021/10/20211029160032223v.html

  1. Inverse un entier de 3 bits (implémentation Python)
  2. Compared with Excel, it is easy to learn Python report automation practice!
  3. 7 excellent open source libraries for learning Python Programming
  4. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
  5. Use of Python pandas!!!!! Explain in detail
  6. 2n行输入,Python,判断字母个数
  7. Notes de Python (XV): dérivation de liste
  8. Notes sur Python (XVI): générateur et Itérateur
  9. Notes de Python (18): décorateur
  10. 2n entrée de ligne, Python, nombre de lettres de jugement
  11. Notes Python (17): fermetures
  12. Notes sur Python (20): fonctions d'ordre supérieur intégrées
  13. 想问问这个Python编程咋做呀?
  14. 想問問這個Python編程咋做呀?
  15. Vous voulez savoir ce que fait cette programmation python?
  16. 11.5K Star,一个开源的 Python 静态类型检查库
  17. Sweetviz:让你只需三行代码实现Python探索性数据分析
  18. Sweetviz:讓你只需三行代碼實現Python探索性數據分析
  19. Sweetviz: vous permet d'effectuer une analyse exploratoire des données python avec seulement trois lignes de code
  20. 11.5k Star, une bibliothèque de vérification de type statique Python Open Source
  21. 刚学Python,想让大大给我解释一下代码
  22. 剛學Python,想讓大大給我解釋一下代碼
  23. Je viens d'apprendre Python et je veux que tu m'expliques le Code.
  24. Python QT GUI Design: qmainwindow, QWidget and qdialog window classes (Fundamentals - 10)
  25. Python爬虫项目实战:快手网页版滑块captchaSession分析
  26. python计算时间十二小时制
  27. Temps de calcul Python 12 heures
  28. Python crawler Project actual Fighting: faster Web Version Slider CAPTCHA session Analysis
  29. Python要学习多久可以掌握?多久可以精通?
  30. Combien de temps Python va - t - il apprendre à maîtriser? Combien de temps faut - il pour maîtriser?
  31. 从官网上下载的python安装包安装不了
  32. 深度学习项目:如何使用Python和OpenCV进行人脸识别
  33. python编辑语言如内容所示
  34. La langue d'édition Python est affichée dans le contenu
  35. 有谁知道这怎么回事嘛(Python的简单代码)
  36. 有誰知道這怎麼回事嘛(Python的簡單代碼)
  37. Qui sait ce qui se passe?
  38. Python求某个数的因数【因数是指能被这个数整除的数。例如6的因数有:1、2、3、6; 7的因数有:1、7; 8的因数有:1、2、4、8】。
  39. Python calcule les facteurs d'un nombre [les facteurs sont des nombres qui peuvent être divisés par ce nombre. Par exemple, les facteurs de 6 sont: 1, 2, 3, 6; les facteurs de 7 sont: 1, 7; et les facteurs de 8 sont: 1, 2, 4, 8].
  40. 请问这个实验如何做(用python3.x的环境)
  41. 如何创建一个python程序来模拟电影院的座位预订
  42. [algorithm learning] 1486. Array XOR operation (Java / C / C + + / Python / go / trust)
  43. Comment créer un programme Python pour simuler la réservation de sièges dans un cinéma
  44. Comment faire cette expérience (en utilisant l'environnement Python 3.x)
  45. Python之绘制多角星
  46. Pandas的SettingWithCopyWarning报警怎么解决
  47. Comment résoudre l'alarme de réglage avec copywarning de pandas
  48. 使用 Python 进行数据可视化之Matplotlib
  49. Python 常见问题 - 使用 poetry build 打包构建失败,报 ModuleOrPackageNotFound No file/folder found for package
  50. 万圣节奇妙夜,不给糖就捣蛋—Python带你点击解锁恐怖新道具(南瓜头、骷髅、蝙蝠、糖......)
  51. 【算法学习】1221. 分割平衡字符串(java / c / c++ / python / go / rust)
  52. 教你用Python 编写 Hadoop MapReduce 程序
  53. Je t'ai appris à écrire Hadoop mapreduce en Python.
  54. Pandas下载最新版和python不匹配
  55. python tkinter GUI编程如何实现一个时钟,无论主线程怎么卡住,都不影响时钟正常进行走时间。
  56. python tkinter GUI編程如何實現一個時鐘,無論主線程怎麼卡住,都不影響時鐘正常進行走時間。
  57. La programmation de l'interface graphique Python tkinter pour implémenter une horloge n'affecte pas le temps de fonctionnement normal de l'horloge, peu importe comment le fil principal est coincé.
  58. Pandas télécharger la dernière version ne correspond pas à Python
  59. Make a cool music player with Python [V3.0 including source code and packaged exe]
  60. 编写一个函数,可以传入两个实参或三个实参。如果传入两个实参,返回求和。如果传入三个实参,返回的话。前两个实参的和对第三个实参求余的结果Python