Python模擬登錄網(wǎng)易云音樂并自動(dòng)簽到
一、開發(fā)工具
**Python****版本:**3.6.4
相關(guān)模塊:
DecryptLogin模塊;
argparse模塊;
以及一些Python自帶的模塊。
二、環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
三、原理簡介
既然要簽到,首先,自然是需要模擬登錄啦,這里我們還是簡單地利用我們開源的DecryptLogin庫來實(shí)現(xiàn)網(wǎng)易云音樂的模擬登錄:
'''模擬登錄''' @staticmethod def login(username, password): lg = login.Login() _, session = lg.music163(username, password) return session
成功登錄之后,我們來分析一下如何實(shí)現(xiàn)網(wǎng)易云音樂的自動(dòng)簽到。按F12打開開發(fā)者工具或鼠標(biāo)右鍵檢測,然后點(diǎn)擊一下網(wǎng)易云音樂的簽到按鈕:
可以發(fā)現(xiàn)一個(gè)疑似簽到用的post請(qǐng)求:
其鏈接構(gòu)成為:
'https://music.163.com/weapi/point/dailyTask?csrf_token=' + csrf
之前的文章里我們說過,csrf這個(gè)參數(shù)在登錄后的cookies里可以找到,類似這樣:
csrf = re.findall('__csrf=(.*?) for', str(session.cookies))[0]
所以我們現(xiàn)在要解決的問題是如何找到該post請(qǐng)求需要提交的data的原文,因?yàn)榫W(wǎng)頁里看到的內(nèi)容是加密后的,就像這樣:
第一個(gè)顯然是我們找到簽到接口,那就點(diǎn)開第二個(gè)看看吧:
query不會(huì)就是我們想要的原文吧。嘗試成功的話豈不是血賺?于是,調(diào)用一下DecryptLogin庫里寫好的網(wǎng)易云音樂post參數(shù)加密算法,來加密一下data(網(wǎng)易云音樂所有post請(qǐng)求的攜帶的data原文都要先用一個(gè)加密算法進(jìn)行加密之后再提交):
from DecryptLogin.platforms.music163 import Cracker cracker = Cracker() # 注: typeid為0代表APP上簽到, 為1代表在網(wǎng)頁上簽到 data = { 'type': typeid } data = cracker.get(data)
然后發(fā)送請(qǐng)求測試一下:
signin_url = 'https://music.163.com/weapi/point/dailyTask?csrf_token=' + csrf headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': 'http://music.163.com/discover', 'Accept': '*/*' } res = self.session.post(signin_url, headers=headers, data=data)
發(fā)現(xiàn)返回的數(shù)據(jù)是這樣的:
這個(gè)結(jié)果說明我們剛剛的猜想完全正確,只是因?yàn)槲覀円呀?jīng)簽到過了,所以才顯示重復(fù)簽到。最后,為了節(jié)約每天在命令行輸入賬號(hào)密碼的時(shí)間,我們可以在腳本的最前面添加幾行代碼:
if os.path.exists('config.json'): f = open('config.json', 'r', encoding='utf-8') info = json.load(f) f.close() else: args = parseArgs() info = {'username': args.username, 'password': args.password} f = open('config.json', 'w', encoding='utf-8') json.dump(info, f) f.close()
解釋一下代碼含義,就是如果當(dāng)前文件夾里有config.json這個(gè)文件:
那么我們就直接從這個(gè)json文件里讀取用戶的賬戶名密碼,否則就啟動(dòng)命令行參數(shù)解析函數(shù):
'''命令行參數(shù)解析''' def parseArgs(): parser = argparse.ArgumentParser(description='網(wǎng)易云音樂自動(dòng)簽到') parser.add_argument('--username', dest='username', help='用戶名', type=str, required=True) parser.add_argument('--password', dest='password', help='密碼', type=str, required=True) args = parser.parse_args() return args
讓用戶手動(dòng)輸入賬戶密碼,并自動(dòng)保存到config.json這個(gè)文件中,這樣下次就不需要再重新輸入一遍賬戶密碼啦。
四、效果展示
運(yùn)行方式:
python signin.py --username 用戶名 --password 密碼
到此這篇關(guān)于Python模擬登錄網(wǎng)易云音樂并自動(dòng)簽到的文章就介紹到這了,更多相關(guān)Python模擬登錄并簽到內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python時(shí)間管理黑科技之datetime函數(shù)詳解
在Python中,datetime模塊是處理日期和時(shí)間的標(biāo)準(zhǔn)庫,它提供了一系列功能強(qiáng)大的函數(shù)和類,用于處理日期、時(shí)間、時(shí)間間隔等,本文將深入探討datetime模塊的使用方法,感興趣的可以了解下2023-08-08tensorflow實(shí)現(xiàn)從.ckpt文件中讀取任意變量
這篇文章主要介紹了tensorflow實(shí)現(xiàn)從.ckpt文件中讀取任意變量,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python多進(jìn)程池 multiprocessing Pool用法示例
這篇文章主要介紹了Python多進(jìn)程池 multiprocessing Pool用法,結(jié)合實(shí)例形式分析了多進(jìn)程池 multiprocessing Pool相關(guān)概念、原理及簡單使用技巧,需要的朋友可以參考下2018-09-09Python運(yùn)行出現(xiàn)DeprecationWarning的問題及解決
這篇文章主要介紹了Python運(yùn)行出現(xiàn)DeprecationWarning的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python tkinter圖形界面代碼統(tǒng)計(jì)工具(更新)
這篇文章主要為大家詳細(xì)介紹了python tkinter圖形界面代碼統(tǒng)計(jì)工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09