啥?网易云签到可以领取蓝牙耳机?我用Python实现自动签到给女朋友薅了一个!
導語
? ? ?今天日常上班,路上打開網易云.點進去聽歌,有個簽到按鈕,我就順手點了!簽到之后發現可以用簽到積分來兌換藍牙耳機?不知道你們清楚不,我用的是聯通的電話話,用了很多年了,所以每年我都可以用積分兌換保溫杯,洗面奶,紙巾等等這些用品,沒想到網易云也出活動了!
這個是界面
???
簡直是巴適客滴博!
剛好女朋友還沒有藍牙耳機,還是用的那種有線耳機!可以給你來一份了!但是又擔心忘記來簽到,導致耳機被領完,所以我用Python寫了個
網易云音樂自動簽到腳本
好好看,好好學!
關鍵是簽到腳本市場是需求很大的,完全可以通過這個自動簽到腳本來薅羊毛!
?
?
?簡單的介紹一下原理,網易云音樂post參數加密方式詳解這里就不多介紹了,不懂這一塊的直接找我獲取網易云解密的詳細視頻教程就行.
假如這篇文章破2000閱讀,小編就
給你們看!立個flag先.
?
?
?
既然要簽到,首先,自然是需要模擬登錄啦,這里我們還是簡單地利用我們開源的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 Crackercracker = 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這個文件中,這樣下次就不需要再重新輸入一遍賬戶密碼啦。
?
因為涉及到賬戶密碼,我就不錄屏了,就截個效果圖吧(因為測試的時候已經簽到過一次了,所以運行腳本再簽到一次就顯示因為重復簽到而簽到失敗了,懶得找新的賬號了T_T):
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
?到這里就差不多了,也是到了咱們該說再見的時候了,不過我知道你們肯定會問,代碼咋不貼上來,
由于一些特殊情況這里就不貼代碼了,嘿嘿嘿
?
?
?
好了好了,不貼代碼怎么對得起你們的支持,這不就貼上來了嗎!
附源碼
#編程女碼農 import os import re import json import argparse from DecryptLogin import login from DecryptLogin.core.music163 import Cracker'''命令行參數解析''' 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'''網易云音樂自動簽到''' class NeteaseSignin():def __init__(self, username, password, **kwargs):self.username = usernameself.session = NeteaseSignin.login(username, password)self.csrf = re.findall('__csrf=(.*?) for', str(self.session.cookies))[0]self.cracker = Cracker()self.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': '*/*'}'''外部調用'''def run(self):# 簽到接口signin_url = 'https://music.163.com/weapi/point/dailyTask?csrf_token=' + self.csrf# 模擬簽到(typeid為0代表APP上簽到, 為1代表在網頁上簽到)typeids = [0, 1]for typeid in typeids:client_name = 'Web端' if typeid == 1 else 'APP端'# --構造請求獲得響應data = {'type': typeid}data = self.cracker.get(data)res = self.session.post(signin_url, headers=self.headers, data=data)res_json = res.json()# --判斷簽到是否成功if res_json['code'] == 200:print('[INFO]: 賬號%s在%s簽到成功...' % (self.username, client_name))else:print('[INFO]: 賬號%s在%s簽到失敗, 原因: %s...' % (self.username, client_name, res_json.get('msg')))'''模擬登錄'''@staticmethoddef login(username, password):lg = login.Login()_, session = lg.music163(username, password)return session'''run''' if __name__ == '__main__':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()sign_in = NeteaseSignin(username=info.get('username'), password=info.get('password'))sign_in.run()??到這里咱們就該說再見了,咱們下篇見!
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
差點忘了,上面有提到,如果不會解密的童鞋,就看這里啦!視頻,.源碼都在
如果你用得到的話可以直接拿走,點擊領取。
不方便點鏈接的加企鵝群:948351247
?
總結
以上是生活随笔為你收集整理的啥?网易云签到可以领取蓝牙耳机?我用Python实现自动签到给女朋友薅了一个!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻量纯css框架,网页设计的12个轻量C
- 下一篇: 【C++】数字的组合排列情况