Files
3288588344-toulu/联想延保签到.py
2024-08-04 12:25:16 +08:00

250 lines
9.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'''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()