mirror of
https://github.com/Sitoi/dailycheckin.git
synced 2024-11-17 21:58:03 +08:00
150 lines
6.2 KiB
Python
150 lines
6.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
import base64
|
|
import hashlib
|
|
import json
|
|
import os
|
|
|
|
import requests
|
|
from cryptography.hazmat.backends import default_backend
|
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
|
|
|
|
class Music163CheckIn:
|
|
def __init__(self, music163_account_list):
|
|
self.music163_account_list = music163_account_list
|
|
|
|
@staticmethod
|
|
def md5(text):
|
|
hl = hashlib.md5()
|
|
hl.update(text.encode(encoding="utf-8"))
|
|
return hl.hexdigest()
|
|
|
|
@staticmethod
|
|
def encrypt(key, text):
|
|
backend = default_backend()
|
|
cipher = Cipher(algorithms.AES(key.encode("utf8")), modes.CBC(b"0102030405060708"), backend=backend)
|
|
encryptor = cipher.encryptor()
|
|
length = 16
|
|
count = len(text.encode("utf-8"))
|
|
if count % length != 0:
|
|
add = length - (count % length)
|
|
else:
|
|
add = 16
|
|
pad = chr(add)
|
|
text1 = text + (pad * add)
|
|
ciphertext = encryptor.update(text1.encode("utf-8")) + encryptor.finalize()
|
|
crypted_str = str(base64.b64encode(ciphertext), encoding="utf-8")
|
|
return crypted_str
|
|
|
|
def protect(self, text):
|
|
return {
|
|
"params": self.encrypt("TA3YiYCfY2dDJQgg", self.encrypt("0CoJUm6Qyw8W8jud", text)),
|
|
"encSecKey": "84ca47bca10bad09a6b04c5c927ef077d9b9f1e37098aa3eac6ea70eb59df0aa28b691b7e75e4f1f9831754919ea784c8f74fbfadf2898b0be17849fd656060162857830e241aba44991601f137624094c114ea8d17bce815b0cd4e5b8e2fbaba978c6d1d14dc3d1faf852bdd28818031ccdaaa13a6018e1024e2aae98844210",
|
|
}
|
|
|
|
def sign(self, session, phone, password):
|
|
sign_msg, music_count_msg = None, None
|
|
url = "https://music.163.com/weapi/login/cellphone"
|
|
daily_task_url = "https://music.163.com/weapi/point/dailyTask"
|
|
resource_url = "https://music.163.com/weapi/v1/discovery/recommend/resource"
|
|
logindata = {
|
|
"phone": phone,
|
|
"countrycode": "86",
|
|
"password": self.md5(password),
|
|
"rememberLogin": "true",
|
|
}
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
|
|
"Referer": "http://music.163.com/",
|
|
"Accept-Encoding": "gzip, deflate",
|
|
}
|
|
headers2 = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
|
|
"Referer": "http://music.163.com/",
|
|
"Accept-Encoding": "gzip, deflate",
|
|
"Cookie": "os=pc; osver=Microsoft-Windows-10-Professional-build-10586-64bit; appver=2.0.3.131777; channel=netease; __remember_me=true;",
|
|
}
|
|
|
|
res = session.post(url=url, data=self.protect(json.dumps(logindata)), headers=headers2)
|
|
temp_cookie = res.cookies
|
|
res_data = res.json()
|
|
if res_data["code"] != 200:
|
|
sign_msg = "登录失败!请检查密码是否正确!"
|
|
return sign_msg, music_count_msg
|
|
res = session.post(url=daily_task_url, data=self.protect('{"type":0}'), headers=headers)
|
|
res_data = json.loads(res.text)
|
|
if res_data["code"] != 200 and res_data["code"] != -2:
|
|
sign_msg = res_data["msg"]
|
|
else:
|
|
if res_data["code"] == 200:
|
|
sign_msg = "签到成功,经验+" + str(res_data["point"])
|
|
else:
|
|
sign_msg = "重复签到"
|
|
|
|
res = session.post(
|
|
url=resource_url,
|
|
data=self.protect('{"csrf_token":"' + requests.utils.dict_from_cookiejar(temp_cookie)["__csrf"] + '"}'),
|
|
headers=headers,
|
|
)
|
|
res_data = json.loads(res.text, strict=False)
|
|
for x in res_data["recommend"]:
|
|
url = (
|
|
"https://music.163.com/weapi/v3/playlist/detail?csrf_token="
|
|
+ requests.utils.dict_from_cookiejar(temp_cookie)["__csrf"]
|
|
)
|
|
protect_data = {
|
|
"id": x["id"],
|
|
"n": 1000,
|
|
"csrf_token": requests.utils.dict_from_cookiejar(temp_cookie)["__csrf"],
|
|
}
|
|
res = session.post(url=url, data=self.protect(json.dumps(protect_data)), headers=headers)
|
|
res_data = json.loads(res.text, strict=False)
|
|
buffer = []
|
|
count = 0
|
|
for j in res_data["playlist"]["trackIds"]:
|
|
data2 = {
|
|
"action": "play",
|
|
"json": {
|
|
"download": 0,
|
|
"end": "playend",
|
|
"id": j["id"],
|
|
"sourceId": "",
|
|
"time": "240",
|
|
"type": "type",
|
|
"wifi": 0,
|
|
},
|
|
}
|
|
buffer.append(data2)
|
|
count += 1
|
|
if count >= 310:
|
|
break
|
|
if count >= 310:
|
|
break
|
|
postdata = {"logs": json.dumps(buffer)}
|
|
res = session.post(url="http://music.163.com/weapi/feedback/weblog", data=self.protect(json.dumps(postdata)))
|
|
res_data = json.loads(res.text, strict=False)
|
|
if res_data["code"] == 200:
|
|
music_count_msg = f"{count} 首"
|
|
else:
|
|
music_count_msg = res_data["message"]
|
|
return sign_msg, music_count_msg
|
|
|
|
def main(self):
|
|
msg_list = []
|
|
for music163_account in self.music163_account_list:
|
|
phone = music163_account.get("music163_phone")
|
|
password = music163_account.get("music163_password")
|
|
session = requests.session()
|
|
sign_msg, music_count_msg = self.sign(session=session, phone=phone, password=password)
|
|
msg = f"【网易云音乐签到】\n帐号信息: {phone}\n签到状态: {sign_msg}\n刷歌数量: {music_count_msg}"
|
|
print(msg)
|
|
msg_list.append(msg)
|
|
return msg_list
|
|
|
|
|
|
if __name__ == "__main__":
|
|
with open(os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json"), "r", encoding="utf-8") as f:
|
|
datas = json.loads(f.read())
|
|
_music163_account_list = datas.get("MUSIC163_ACCOUNT_LIST", [])
|
|
Music163CheckIn(music163_account_list=_music163_account_list).main()
|