python代碼實(shí)現(xiàn)掃碼關(guān)注公眾號(hào)登錄的實(shí)戰(zhàn)
大致思路:調(diào)用微信帶參數(shù)二維碼接口生成二維碼,前端顯示二維碼同時(shí)于服務(wù)器進(jìn)行長(zhǎng)鏈接通信,監(jiān)控關(guān)注狀態(tài),如果有對(duì)應(yīng)的場(chǎng)景碼參數(shù)的關(guān)注,則進(jìn)行登錄操作。
下面是服務(wù)示意圖

主要代碼實(shí)現(xiàn):
獲取二維碼部分
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)
這個(gè)access_token的有效期是兩小時(shí),所以建議寫(xiě)個(gè)定時(shí)任務(wù),每一小時(shí)執(zhí)行一下,存到redis,用的時(shí)候redis取一下。
2.取ticket
my_scene_str = 'xxxxx' # 場(chǎng)景碼可以做個(gè)key放到redis里并設(shè)置一個(gè)和二維碼一樣的過(guò)期時(shí)間
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.取二維碼圖片(這里返回圖片的同時(shí)把場(chǎng)景碼也一并返回給前端,這樣如果前端用輪詢(xún)獲取關(guān)注狀態(tài)的話(huà)就可以不使用長(zhǎng)鏈接了)
url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket
resp = requests.get(url)
img = base64.b64encode(resp.content).decode('ascii')
print(img)
這個(gè)里取到的圖片用base64返回給前端,前端使用src="data:image/png;base64,"+img 就可以顯示了
獲取關(guān)注狀態(tài)值
方法一:使用場(chǎng)景碼輪詢(xún)
發(fā)送請(qǐng)求輪詢(xún)md5_user_key
方法二:使用場(chǎng)景碼建立長(zhǎng)鏈接連接,等待服務(wù)器推送
flask建議使用socketio
解析微信服務(wù)器報(bào)文
新關(guān)注用戶(hù)掃碼報(bào)文內(nèi)容
<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>
老用戶(hù)掃碼報(bào)文內(nèi)容
<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:公眾號(hào)的id
FromUserName:用戶(hù)的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) # 新關(guān)注用戶(hù)掃碼
if dic.get('Event') == 'SCAN':
parse_scan(dic) # 已經(jīng)關(guān)注用戶(hù)掃碼
使用openid獲取關(guān)注的微信用戶(hù)信息
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()
返回參數(shù)
{'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'}
到此這篇關(guān)于python代碼實(shí)現(xiàn)掃碼關(guān)注公眾號(hào)登錄的實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)python 掃碼關(guān)注公眾號(hào)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫(kù),它能輕松地將數(shù)據(jù)進(jìn)行可視化,作出精美的圖表2022-08-08
Python模擬登陸網(wǎng)頁(yè)的三種方法小結(jié)
如何使用Python模擬登陸網(wǎng)頁(yè),尤其是在涉及到復(fù)雜的認(rèn)證機(jī)制時(shí)?這篇文章將詳細(xì)介紹Python模擬登陸網(wǎng)頁(yè)的三種方法,以及如何繞過(guò)一些常見(jiàn)的安全防護(hù)措施,需要的朋友可以參考下2024-01-01
Python使用sklearn實(shí)現(xiàn)的各種回歸算法示例
這篇文章主要介紹了Python使用sklearn實(shí)現(xiàn)的各種回歸算法,結(jié)合實(shí)例形式分析了Python使用sklearn庫(kù)實(shí)現(xiàn)的決策樹(shù)回歸、線(xiàn)性回歸、SVM回歸、KNN回歸、隨機(jī)森林回歸等各種回歸算法,需要的朋友可以參考下2019-07-07
關(guān)于Python 多重繼承時(shí)metaclass conflict問(wèn)題解決與原理探究
這篇文章主要介紹了Python 多重繼承時(shí)metaclass conflict問(wèn)題解決與原理探究 ,需要的朋友可以參考下2022-10-10
pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
這篇文章主要介紹了pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Pycharm Terminal 與Project interpreter 安裝
本文主要介紹了Pycharm Terminal 與Project interpreter 安裝包不同步問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
解決Python paramiko 模塊遠(yuǎn)程執(zhí)行ssh 命令 nohup 不生效的問(wèn)題
這篇文章主要介紹了解決Python paramiko 模塊遠(yuǎn)程執(zhí)行ssh 命令 nohup 不生效的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
python機(jī)器學(xué)習(xí)XGBoost梯度提升決策樹(shù)的高效且可擴(kuò)展實(shí)現(xiàn)
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)XGBoost梯度提升決策樹(shù)的高效且可擴(kuò)展實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python smtplib模塊實(shí)現(xiàn)發(fā)送郵件帶附件sendmail
這篇文章主要為大家詳細(xì)介紹了python smtplib模塊實(shí)現(xiàn)發(fā)送郵件帶附件sendmail,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

