-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy path联想延保签到.py
249 lines (222 loc) · 9.57 KB
/
联想延保签到.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
'''QQ频道:98do10s246
联系:3288588344(看心情回,巨婴别来问)
下载config.toml文件,上传到同目录,在config.toml文件中填联想APP的手机号和密码
通知可填可不填
config.toml文件下载链接:https://raw.githubusercontent.com/3288588344/toulu/main/config.toml
'''
import base64
import json
import logging
import random
import re
from sys import exit
import smtplib
from email.mime.text import MIMEText
from smtplib import SMTP_SSL
from email.header import Header
import requests
import toml
from requests.utils import cookiejar_from_dict, dict_from_cookiejar
USER_AGENT = [
"Mozilla/5.0 (Linux; U; Android 11; zh-cn; PDYM20 Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36 HeyTapBrowser/40.7.24.9",
"Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36"
]
class Push_messages:
class Server_chan:
def __init__(self, send_key: str) -> None:
self.send_key = send_key
def send_message(self, content: str) -> bool:
data = {"title": "联想签到", "desp": content}
response = requests.post(
f"https://sctapi.ftqq.com/{self.send_key}.send", data=data
)
res_data = response.json().get("data")
pushid = res_data.get("pushid")
readkey = res_data.get("readkey")
result = requests.get(
f"https://sctapi.ftqq.com/push?id={pushid}&readkey={readkey}"
)
return True if result.json().get("code") == 0 else False
class Wechat_message:
def __init__(self, corpid: str, corpsecret: str, agentid: str) -> None:
self.corpid = corpid
self.corpsecret = corpsecret
self.agentid = agentid
self.token = (
requests.get(
f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corpid}&corpsecret={self.corpsecret}"
)
.json()
.get("access_token")
)
def send_message(self, content: str) -> bool:
data = {
"touser": "@all",
"msgtype": "text",
"agentid": self.agentid,
"text": {"content": content},
"safe": 0,
}
response = requests.post(
f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self.token}",
data=json.dumps(data),
)
return True if response.json().get("errcode") == 0 else False
class Dingtalk_message:
def __init__(self, ding_accesstoken: str) -> None:
self.ding_accesstoken = ding_accesstoken
def send_message(self, content: str) -> bool:
data = {
"msgtype": "text",
"text": {"content": content},
"at": {"isAtAll": True},
}
response = requests.post(
f"https://oapi.dingtalk.com/robot/send?access_token={self.ding_accesstoken}",
data=json.dumps(data),
)
return True if response.json().get("errcode") == 0 else False
class Email_message:
def __init__(self, sender_email: str, sender_password: str, receiver_email: str, smtp_server: str,
smtp_port: int) -> None:
self.sender_email = sender_email
self.sender_password = sender_password
self.receiver_email = receiver_email
self.smtp_server = smtp_server
self.smtp_port = smtp_port
def send_message(self, content: str) -> bool:
receiver_email = [self.receiver_email]
message = MIMEText(content, 'plain', 'utf-8')
message['Subject'] = Header("联想智选定时签到结果", "utf-8")
message['From'] = Header("联想智选定时签到程序", "utf-8")
message['To'] = receiver_email[0]
try:
smtp = SMTP_SSL(self.smtp_server, self.smtp_port)
smtp.login(self.sender_email, self.sender_password)
smtp.sendmail(
self.sender_email, receiver_email, message.as_string())
smtp.quit()
return True
except smtplib.SMTPException as e:
print('send email error', e)
return False
def set_push_type():
for type, key in config.get("message_push").items():
key_list = key.values()
if "".join(key_list):
return getattr(Push_messages(), type)(*key_list).send_message
else:
return logger
def login(username, password):
def get_cookie():
session.headers = {
"user-agent": ua,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}
session.get(url="https://reg.lenovo.com.cn/auth/rebuildleid")
session.get(
url="https://reg.lenovo.com.cn/auth/v1/login?ticket=5e9b6d3d-4500-47fc-b32b-f2b4a1230fd3&ru=https%3A%2F%2Fmclub.lenovo.com.cn%2F"
)
data = f"account={username}&password={base64.b64encode(str(password).encode()).decode()}\
&ps=1&ticket=5e9b6d3d-4500-47fc-b32b-f2b4a1230fd3&codeid=&code=&slide=v2&applicationPlatform=2&shopId=\
1&os=web&deviceId=BIT%2F8ZTwWmvKpMsz3bQspIZRY9o9hK1Ce3zKIt5js7WSUgGQNnwvYmjcRjVHvJbQ00fe3T2wxgjZAVSd\
OYl8rrQ%3D%3D&t=1655187183738&websiteCode=10000001&websiteName=%25E5%2595%2586%25E5%259F%258E%25E\
7%25AB%2599&forwardPageUrl=https%253A%252F%252Fmclub.lenovo.com.cn%252F"
login_response = session.post(
url="https://reg.lenovo.com.cn/auth/v2/doLogin", data=data
)
if login_response.json().get("ret") == "1":
logger(f"{username}账号或密码错误")
return None
ck_dict = dict_from_cookiejar(session.cookies)
config["cookies"][username] = f"{ck_dict}"
toml.dump(config, open(config_file, "w"))
session.cookies = cookiejar_from_dict(ck_dict)
return session
session = requests.Session()
session.headers = {
"user-agent": ua,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}
if cookie_dict := config.get("cookies").get(username):
session.cookies = cookiejar_from_dict(eval(cookie_dict))
ledou = session.post(
"https://i.lenovo.com.cn/info/uledou.jhtml",
data={"sts": "b044d754-bda2-4f56-9fea-dcf3aecfe782"},
)
try:
int(ledou.text)
except ValueError:
logger(f"{username} ck有错,重新获取ck并保存")
session = get_cookie()
return session
logger(f"{username} ck没有错")
return session
else:
logger(f"{username} ck为空,重新获取ck并保存")
session = get_cookie()
return session
def sign(session):
res = session.get(url="https://mclub.lenovo.com.cn/signlist/")
token = re.findall('token\s=\s"(.*?)"', res.text)[0]
data = f"_token={token}&memberSource=1"
headers = {
"Host": "mclub.lenovo.com.cn",
"pragma": "no-cache",
"cache-control": "no-cache",
"accept": "application/json, text/javascript, */*; q=0.01",
"origin": "https://mclub.lenovo.com.cn",
"x-requested-with": "XMLHttpRequest",
"user-agent": ua
+ "/lenovoofficialapp/16554342219868859_10128085590/newversion/versioncode-1000080/",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"referer": "https://mclub.lenovo.com.cn/signlist?pmf_group=in-push&pmf_medium=app&pmf_source=Z00025783T000",
"accept-language": "zh-CN,en-US;q=0.8",
}
sign_response = session.post(
"https://mclub.lenovo.com.cn/signadd", data=data, headers=headers
)
sign_days = (
session.get(url="https://mclub.lenovo.com.cn/getsignincal")
.json()
.get("signinCal")
.get("continueCount")
)
sign_user_info = session.get("https://mclub.lenovo.com.cn/signuserinfo")
try:
serviceAmount = sign_user_info.json().get("serviceAmount")
ledou = sign_user_info.json().get("ledou")
except Exception as e:
logger(sign_user_info.headers["content-type"])
logger(sign_user_info.status_code)
logger(e)
serviceAmount, ledou = None, None
session.close()
if sign_response.json().get("success"):
return f"\U00002705账号{username}签到成功, \U0001F4C6连续签到{sign_days}天, \U0001F954共有乐豆{ledou}个, \U0001F4C5共有延保{serviceAmount}天\n"
else:
return f"\U0001F6AB账号{username}今天已经签到, \U0001F4C6连续签到{sign_days}天, \U0001F954共有乐豆{ledou}个, \U0001F4C5共有延保{serviceAmount}天\n"
def main():
global logger, config_file, config, ua, username
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s"
)
logger = logging.getLogger(__name__).info
config_file = r"config.toml"
config = toml.load(config_file)
account = config.get("account")
if not account:
exit(1)
if not (ua := config.get("browser").get("ua")):
ua = random.choice(USER_AGENT)
config["browser"]["ua"] = ua
push = set_push_type()
message = "联想签到: \n"
for username, password in account.items():
session = login(username, password)
if not session:
continue
message += sign(session)
push(message)
if __name__ == "__main__":
main()