|
1
|
|
|
# -*- coding: utf-8 -*- |
|
2
|
|
|
""" |
|
3
|
|
|
cron: 45 5 * * * |
|
4
|
|
|
new Env('哔咔漫画'); |
|
5
|
|
|
""" |
|
6
|
|
|
|
|
7
|
|
|
import hashlib |
|
8
|
|
|
import hmac |
|
9
|
|
|
import random |
|
10
|
|
|
import string |
|
11
|
|
|
import time |
|
12
|
|
|
|
|
13
|
|
|
import requests |
|
14
|
|
|
|
|
15
|
|
|
from notify_mtr import send |
|
16
|
|
|
from utils import get_data |
|
17
|
|
|
|
|
18
|
|
|
|
|
19
|
|
|
class Picacomic: |
|
20
|
|
|
def __init__(self, check_items): |
|
21
|
|
|
self.check_items = check_items |
|
22
|
|
|
|
|
23
|
|
|
@staticmethod |
|
24
|
|
|
def generate_headers(path, data=None, token=None): |
|
25
|
|
|
api_key = "C69BAF41DA5ABD1FFEDC6D2FEA56B" |
|
26
|
|
|
api_secret = "~d}$Q7$eIni=V)9\\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn" |
|
27
|
|
|
current_time = str(int(time.time())) |
|
28
|
|
|
nonce = "".join(random.choices(string.ascii_lowercase + string.digits, k=32)) |
|
29
|
|
|
raw = path + current_time + nonce + "POST" + api_key |
|
30
|
|
|
raw = raw.lower() |
|
31
|
|
|
h = hmac.new(api_secret.encode(), digestmod=hashlib.sha256) |
|
32
|
|
|
h.update(raw.encode()) |
|
33
|
|
|
signature = h.hexdigest() |
|
34
|
|
|
headers = { |
|
35
|
|
|
"api-key": api_key, |
|
36
|
|
|
"accept": "application/vnd.picacomic.com.v1+json", |
|
37
|
|
|
"app-channel": "2", |
|
38
|
|
|
"app-version": "2.2.1.2.3.3", |
|
39
|
|
|
"app-uuid": "defaultUuid", |
|
40
|
|
|
"app-platform": "android", |
|
41
|
|
|
"app-build-version": "44", |
|
42
|
|
|
"User-Agent": "okhttp/3.8.1", |
|
43
|
|
|
"image-quality": "original", |
|
44
|
|
|
"time": current_time, |
|
45
|
|
|
"nonce": nonce, |
|
46
|
|
|
"signature": signature, |
|
47
|
|
|
} |
|
48
|
|
|
|
|
49
|
|
|
if data is not None: |
|
50
|
|
|
headers["Content-Type"] = "application/json; charset=UTF-8" |
|
51
|
|
|
if token is not None: |
|
52
|
|
|
headers["authorization"] = token |
|
53
|
|
|
return headers |
|
54
|
|
|
|
|
55
|
|
|
def sign(self, email, password): |
|
56
|
|
|
try: |
|
57
|
|
|
data = {"email": email, "password": password} |
|
58
|
|
|
sign_headers = self.generate_headers(path="auth/sign-in", data=data) |
|
59
|
|
|
sign_res = requests.post( |
|
60
|
|
|
"https://picaapi.picacomic.com/auth/sign-in", |
|
61
|
|
|
json={"email": email, "password": password}, |
|
62
|
|
|
headers=sign_headers, |
|
63
|
|
|
timeout=60, |
|
64
|
|
|
).json() |
|
65
|
|
|
token = sign_res.get("data", {}).get("token") |
|
66
|
|
|
|
|
67
|
|
|
punch_headers = self.generate_headers(path="users/punch-in", token=token) |
|
68
|
|
|
res = requests.post( |
|
69
|
|
|
"https://picaapi.picacomic.com/users/punch-in", |
|
70
|
|
|
headers=punch_headers, |
|
71
|
|
|
timeout=60, |
|
72
|
|
|
).json() |
|
73
|
|
|
if res.get("data", {}).get("res", {}).get("status", {}) == "ok": |
|
74
|
|
|
msg = "打卡成功" |
|
75
|
|
|
else: |
|
76
|
|
|
msg = "重复签到" |
|
77
|
|
|
except Exception as e: |
|
78
|
|
|
msg = str(e) |
|
79
|
|
|
return msg |
|
80
|
|
|
|
|
81
|
|
|
def main(self): |
|
82
|
|
|
msg_all = "" |
|
83
|
|
|
for check_item in self.check_items: |
|
84
|
|
|
email = check_item.get("email") |
|
85
|
|
|
password = check_item.get("password") |
|
86
|
|
|
sign_msg = self.sign(email, password) |
|
87
|
|
|
msg = f"帐号信息: {email}\n签到状态: {sign_msg}" |
|
88
|
|
|
msg_all += msg + "\n\n" |
|
89
|
|
|
return msg_all |
|
90
|
|
|
|
|
91
|
|
|
|
|
92
|
|
|
if __name__ == "__main__": |
|
93
|
|
|
_data = get_data() |
|
94
|
|
|
_check_items = _data.get("PICACOMIC", []) |
|
95
|
|
|
result = Picacomic(check_items=_check_items).main() |
|
96
|
|
|
send("哔咔漫画", result) |
|
97
|
|
|
|