前言:
之前在逛一些貼吧論壇上經常看到類似于"跪求xxx網站自動簽到的腳本"這樣的貼子,這麼說來這玩意市場需求量還是挺大的樣子。這一次我們不會采用網上爛大街的selenium作為我們的自動簽到解決方案。話不多說,讓我們愉快地開始實作一下網易雲音樂自動簽到
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuATO2kzMxcDM40SNyYjM0kTM1EjNxcDMxIDMy0SN0cTNzMjMvw1NwEjMwIzLcVDN3UzMzIzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
開發工具
Python版本:3.6.4
相關子產品:
DecryptLogin子產品;
argparse子產品;
以及一些Python自帶的子產品。
環境搭建
安裝Python并添加到環境變量,pip安裝需要的相關子產品即可。
原理簡介
既然要簽到,首先,自然是需要模拟登入啦,這裡我們還是簡單地利用我們開源的DecryptLogin庫來實作網易雲音樂的模拟登入:
'''模拟登入'''
@staticmethod
def login(username, password):
lg = login.Login()
_, session = lg.music163(username, password)
return session
成功登入之後,我們來分析一下如何實作網易雲音樂的自動簽到。按F12打開開發者工具或滑鼠右鍵檢測,然後點選一下網易雲音樂的簽到按鈕:
可以發現一個疑似簽到用的post請求:
其連結構成為:
'https://music.163.com/weapi/point/dailyTask?csrf_token=' + csrf
之前的文章裡我們說過,csrf這個參數在登入後的cookies裡可以找到,類似這樣:
csrf = re.findall('__csrf=(.*?) for', str(session.cookies))[0]
是以我們現在要解決的問題是如何找到該post請求需要送出的data的原文,因為網頁裡看到的内容是加密後的,就像這樣:
第一個顯然是我們找到簽到接口,那就點開第二個看看吧:
query不會就是我們想要的原文吧。嘗試成功的話豈不是血賺?于是,調用一下DecryptLogin庫裡寫好的網易雲音樂post參數加密算法,來加密一下data(網易雲音樂所有post請求的攜帶的data原文都要先用一個加密算法進行加密之後再送出):
from DecryptLogin.platforms.music163 import Cracker
cracker = Cracker()
# 注: typeid為0代表APP上簽到, 為1代表在網頁上簽到
data = {
'type': typeid
}
data = cracker.get(data)
然後發送請求測試一下:
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)
發現傳回的資料是這樣的:
這個結果說明我們剛剛的猜想完全正确,隻是因為我們已經簽到過了,是以才顯示重複簽到。最後,為了節約每天在指令行輸入賬号密碼的時間,我們可以在腳本的最前面添加幾行代碼:
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()
解釋一下代碼含義,就是如果目前檔案夾裡有config.json這個檔案:
那麼我們就直接從這個json檔案裡讀取使用者的賬戶名密碼,否則就啟動指令行參數解析函數:
'''指令行參數解析'''
def parseArgs():
parser = argparse.ArgumentParser(description='網易雲音樂自動簽到')
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
讓使用者手動輸入賬戶密碼,并自動儲存到config.json這個檔案中,這樣下次就不需要再重新輸入一遍賬戶密碼啦。
效果展示
運作方式:
python signin.py --username 使用者名 --password 密碼
文章到這裡就結束了,感謝你的觀看,關注我每天分享Python模拟登入系列,下篇文章分享爬取微網誌表情包。