mirror of
https://github.com/HChaZZY/NodeSeek-Signin.git
synced 2025-12-06 11:33:49 +08:00
Update nodeseek_sign.py
This commit is contained in:
305
nodeseek_sign.py
305
nodeseek_sign.py
@@ -2,7 +2,6 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import re
|
||||
from curl_cffi import requests
|
||||
from turnstile_solver import TurnstileSolver, TurnstileSolverError
|
||||
from yescaptcha import YesCaptchaSolver, YesCaptchaSolverError
|
||||
@@ -11,9 +10,70 @@ from yescaptcha import YesCaptchaSolver, YesCaptchaSolverError
|
||||
API_BASE_URL = os.environ.get("API_BASE_URL", "")
|
||||
CLIENTT_KEY = os.environ.get("CLIENTT_KEY", "")
|
||||
NS_RANDOM = os.environ.get("NS_RANDOM", "true")
|
||||
NS_COOKIE = os.environ.get("NS_COOKIE", "")
|
||||
SOLVER_TYPE = os.environ.get("SOLVER_TYPE", "turnstile")
|
||||
|
||||
# 多账号支持
|
||||
def parse_multi_accounts():
|
||||
"""解析环境变量中的多账号信息,支持&和换行符作为分隔符"""
|
||||
accounts = []
|
||||
|
||||
# 获取所有可能的账号配置
|
||||
all_users = []
|
||||
all_passes = []
|
||||
all_cookies = []
|
||||
|
||||
# 解析USER/USER数字格式
|
||||
base_user = os.environ.get("USER", "")
|
||||
if base_user:
|
||||
all_users.append(base_user)
|
||||
|
||||
for i in range(1, 100):
|
||||
user_key = f"USER{i}"
|
||||
if user_key in os.environ and os.environ[user_key]:
|
||||
all_users.append(os.environ[user_key])
|
||||
else:
|
||||
break
|
||||
|
||||
# 解析PASS/PASS数字格式
|
||||
base_pass = os.environ.get("PASS", "")
|
||||
if base_pass:
|
||||
all_passes.append(base_pass)
|
||||
|
||||
for i in range(1, 100):
|
||||
pass_key = f"PASS{i}"
|
||||
if pass_key in os.environ and os.environ[pass_key]:
|
||||
all_passes.append(os.environ[pass_key])
|
||||
else:
|
||||
break
|
||||
|
||||
# 解析NS_COOKIE
|
||||
cookie_str = os.environ.get("NS_COOKIE", "")
|
||||
if cookie_str:
|
||||
# 支持&和换行符作为分隔符
|
||||
for separator in ["&", "\n"]:
|
||||
if separator in cookie_str:
|
||||
all_cookies = cookie_str.split(separator)
|
||||
all_cookies = [c.strip() for c in all_cookies if c.strip()]
|
||||
break
|
||||
else:
|
||||
all_cookies = [cookie_str]
|
||||
|
||||
# 组合账号信息
|
||||
# 1. 如果有cookie,先添加只有cookie的账号
|
||||
for i, cookie in enumerate(all_cookies):
|
||||
username = f"账号{i+1}" if i >= len(all_users) else all_users[i]
|
||||
password = "" if i >= len(all_passes) else all_passes[i]
|
||||
accounts.append({"user": username, "pass": password, "cookie": cookie})
|
||||
|
||||
# 2. 如果有用户名密码但没有对应cookie的账号
|
||||
for i in range(len(all_cookies), max(len(all_users), len(all_passes))):
|
||||
if i < len(all_users) and all_users[i]:
|
||||
username = all_users[i]
|
||||
password = all_passes[i] if i < len(all_passes) else ""
|
||||
accounts.append({"user": username, "pass": password, "cookie": ""})
|
||||
|
||||
return accounts
|
||||
|
||||
def load_send():
|
||||
global send
|
||||
global hadsend
|
||||
@@ -32,66 +92,18 @@ def load_send():
|
||||
|
||||
load_send()
|
||||
|
||||
def get_env_account_pairs():
|
||||
"""获取所有账号密码对"""
|
||||
accounts = []
|
||||
|
||||
# 获取基本账号(无编号)
|
||||
base_user = os.environ.get("USER", "")
|
||||
base_pass = os.environ.get("PASS", "")
|
||||
|
||||
if base_user and base_pass and (len(base_user) > 1 and not base_user.startswith("SYSTEM")):
|
||||
print(f"检测到无编号账号: {base_user}")
|
||||
accounts.append((base_user, base_pass))
|
||||
|
||||
# 获取编号账号 (USER1/PASS1, USER2/PASS2...)
|
||||
i = 1
|
||||
while True:
|
||||
user_key = f"USER{i}"
|
||||
pass_key = f"PASS{i}"
|
||||
username = os.environ.get(user_key, "")
|
||||
password = os.environ.get(pass_key, "")
|
||||
|
||||
if not username or not password:
|
||||
break
|
||||
|
||||
print(f"检测到编号账号{i}: {username}")
|
||||
accounts.append((username, password))
|
||||
i += 1
|
||||
|
||||
return accounts
|
||||
|
||||
def parse_accounts(user_str, pass_str):
|
||||
"""解析多账号配置,返回账号密码对列表"""
|
||||
if not user_str or not pass_str:
|
||||
return []
|
||||
|
||||
# 使用正则表达式分割字符串(换行或&符号)
|
||||
users = re.split(r'[\n&]', user_str)
|
||||
passwords = re.split(r'[\n&]', pass_str)
|
||||
|
||||
# 清理空白内容
|
||||
users = [u.strip() for u in users if u.strip()]
|
||||
passwords = [p.strip() for p in passwords if p.strip()]
|
||||
|
||||
# 确保账号和密码数量一致
|
||||
accounts = []
|
||||
for i in range(min(len(users), len(passwords))):
|
||||
accounts.append((users[i], passwords[i]))
|
||||
|
||||
return accounts
|
||||
|
||||
def session_login(username, password):
|
||||
# 根据环境变量选择使用哪个验证码解决器
|
||||
try:
|
||||
if SOLVER_TYPE.lower() == "yescaptcha":
|
||||
print(f"正在使用 YesCaptcha 解决验证码...")
|
||||
print("正在使用 YesCaptcha 解决验证码...")
|
||||
solver = YesCaptchaSolver(
|
||||
api_base_url="https://api.yescaptcha.com",
|
||||
client_key=CLIENTT_KEY
|
||||
)
|
||||
else: # 默认使用 turnstile_solver
|
||||
print(f"正在使用 TurnstileSolver 解决验证码...")
|
||||
print("正在使用 TurnstileSolver 解决验证码...")
|
||||
solver = TurnstileSolver(
|
||||
api_base_url=API_BASE_URL,
|
||||
client_key=CLIENTT_KEY
|
||||
@@ -104,7 +116,7 @@ def session_login(username, password):
|
||||
)
|
||||
|
||||
if not token:
|
||||
print(f"获取验证码令牌失败,无法登录")
|
||||
print("获取验证码令牌失败,无法登录")
|
||||
return None
|
||||
|
||||
except (TurnstileSolverError, YesCaptchaSolverError) as e:
|
||||
@@ -147,24 +159,28 @@ def session_login(username, password):
|
||||
try:
|
||||
response = session.post(url, json=data, headers=headers)
|
||||
response_data = response.json()
|
||||
print(f"账号 {username} 登录结果:", response_data)
|
||||
print(response_data)
|
||||
|
||||
if response_data.get('success') == True:
|
||||
|
||||
cookie_dict = session.cookies.get_dict()
|
||||
cookie_string = '; '.join([f"{name}={value}" for name, value in cookie_dict.items()])
|
||||
#print(f"获取到的Cookie: {cookie_string}")
|
||||
|
||||
return cookie_string
|
||||
else:
|
||||
message = response_data.get('message', '登录失败')
|
||||
print(f"账号 {username} 登录失败: {message}")
|
||||
print(f"登录失败: {message}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"账号 {username} 登录异常:", e)
|
||||
print("登录异常:", e)
|
||||
print("实际响应内容:", response.text if 'response' in locals() else "没有响应")
|
||||
return None
|
||||
|
||||
def sign(cookie, account_name=""):
|
||||
|
||||
def sign(cookie):
|
||||
if not cookie:
|
||||
print(f"账号 {account_name} 请先设置Cookie")
|
||||
print("请先设置Cookie")
|
||||
return "no_cookie", ""
|
||||
|
||||
url = f"https://www.nodeseek.com/api/attendance?random={NS_RANDOM}"
|
||||
@@ -178,136 +194,81 @@ def sign(cookie, account_name=""):
|
||||
try:
|
||||
response = requests.post(url, headers=headers, impersonate="chrome110")
|
||||
response_data = response.json()
|
||||
print(f"账号 {account_name} 签到返回: {response_data}")
|
||||
print(f"签到返回: {response_data}")
|
||||
message = response_data.get('message', '')
|
||||
|
||||
# 简化判断逻辑
|
||||
if "鸡腿" in message or response_data.get('success') == True:
|
||||
# 如果消息中包含"鸡腿"或success为True,都视为签到成功
|
||||
print(f"账号 {account_name} 签到成功: {message}")
|
||||
print(f"签到成功: {message}")
|
||||
return "success", message
|
||||
elif "已完成签到" in message:
|
||||
print(f"账号 {account_name} 已经签到过: {message}")
|
||||
print(f"已经签到过: {message}")
|
||||
return "already_signed", message
|
||||
elif message == "USER NOT FOUND" or response_data.get('status') == 404:
|
||||
print(f"账号 {account_name} Cookie已失效")
|
||||
print("Cookie已失效")
|
||||
return "invalid_cookie", message
|
||||
else:
|
||||
print(f"账号 {account_name} 签到失败: {message}")
|
||||
print(f"签到失败: {message}")
|
||||
return "fail", message
|
||||
|
||||
except Exception as e:
|
||||
print(f"账号 {account_name} 发生异常:", e)
|
||||
print("发生异常:", e)
|
||||
return "error", str(e)
|
||||
|
||||
def parse_cookies(cookie_str):
|
||||
"""解析多个Cookie,返回Cookie列表"""
|
||||
if not cookie_str:
|
||||
return []
|
||||
|
||||
# 使用正则表达式分割字符串(换行或&符号)
|
||||
cookies = re.split(r'[\n&]', cookie_str)
|
||||
|
||||
# 清理空白内容
|
||||
return [c.strip() for c in cookies if c.strip()]
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# 结果统计
|
||||
success_count = 0
|
||||
already_signed_count = 0
|
||||
fail_count = 0
|
||||
total_results = []
|
||||
# 解析多账号信息
|
||||
accounts = parse_multi_accounts()
|
||||
|
||||
# 获取所有账号 - 包括编号账号
|
||||
accounts = get_env_account_pairs()
|
||||
cookies = parse_cookies(NS_COOKIE)
|
||||
|
||||
print(f"检测到 {len(accounts)} 个账号配置:")
|
||||
for i, (username, _) in enumerate(accounts):
|
||||
print(f" - 账号{i+1}: {username}")
|
||||
|
||||
print(f"检测到 {len(cookies)} 个Cookie配置")
|
||||
|
||||
# 先处理已有Cookie的情况
|
||||
for i, cookie in enumerate(cookies):
|
||||
account_name = f"Cookie账号{i+1}"
|
||||
print(f"开始处理 {account_name}")
|
||||
|
||||
sign_result, sign_message = sign(cookie, account_name)
|
||||
|
||||
if sign_result == "success":
|
||||
success_count += 1
|
||||
total_results.append(f"{account_name}: 签到成功 - {sign_message}")
|
||||
elif sign_result == "already_signed":
|
||||
already_signed_count += 1
|
||||
total_results.append(f"{account_name}: 已签到 - {sign_message}")
|
||||
else:
|
||||
fail_count += 1
|
||||
total_results.append(f"{account_name}: 签到失败 - {sign_message}")
|
||||
|
||||
# 再处理需要登录的账号
|
||||
for i, (username, password) in enumerate(accounts):
|
||||
account_name = f"{username}"
|
||||
print(f"开始处理账号 {account_name}")
|
||||
|
||||
# 尝试登录获取Cookie
|
||||
print(f"账号 {account_name} 尝试登录获取新Cookie...")
|
||||
cookie = session_login(username, password)
|
||||
|
||||
if cookie:
|
||||
print(f"账号 {account_name} 登录成功,使用新Cookie签到")
|
||||
|
||||
# 将新的Cookie保存到环境变量
|
||||
gh_env = os.environ.get("GITHUB_ENV")
|
||||
if gh_env:
|
||||
try:
|
||||
with open(gh_env, "a", encoding="utf-8") as f:
|
||||
# 使用追加模式添加或更新Cookie
|
||||
if i == 0 and not cookies: # 如果是第一个账号且没有已有的Cookie
|
||||
f.write(f"NS_COOKIE={cookie}\n")
|
||||
else: # 否则追加到已有Cookie
|
||||
existing_cookie = NS_COOKIE + "&" if NS_COOKIE else ""
|
||||
f.write(f"NS_COOKIE={existing_cookie}{cookie}\n")
|
||||
print(f"账号 {account_name} 的新Cookie已写入GITHUB_ENV环境变量文件")
|
||||
except Exception as e:
|
||||
print(f"写入GITHUB_ENV环境变量文件失败: {e}")
|
||||
else:
|
||||
print("未检测到GITHUB_ENV环境变量,跳过写入")
|
||||
|
||||
# 使用新Cookie签到
|
||||
sign_result, sign_message = sign(cookie, account_name)
|
||||
|
||||
if sign_result == "success":
|
||||
success_count += 1
|
||||
total_results.append(f"{account_name}: 签到成功 - {sign_message}")
|
||||
elif sign_result == "already_signed":
|
||||
already_signed_count += 1
|
||||
total_results.append(f"{account_name}: 已签到 - {sign_message}")
|
||||
else:
|
||||
fail_count += 1
|
||||
total_results.append(f"{account_name}: 签到失败 - {sign_message}")
|
||||
|
||||
else:
|
||||
print(f"账号 {account_name} 登录失败")
|
||||
fail_count += 1
|
||||
total_results.append(f"{account_name}: 登录失败")
|
||||
|
||||
# 汇总结果
|
||||
total_accounts = len(cookies) + len(accounts)
|
||||
summary = f"NodeSeek签到结果统计\n" \
|
||||
f"总计: {total_accounts} 个账号\n" \
|
||||
f"成功: {success_count} 个\n" \
|
||||
f"已签: {already_signed_count} 个\n" \
|
||||
f"失败: {fail_count} 个\n\n" \
|
||||
f"详细结果:\n" + "\n".join(total_results)
|
||||
|
||||
print("\n" + summary)
|
||||
|
||||
# 发送通知
|
||||
if hadsend and total_accounts > 0:
|
||||
send("NodeSeek多账号签到", summary)
|
||||
elif total_accounts == 0:
|
||||
print("无法执行操作:没有有效Cookie且未设置用户名密码")
|
||||
if not accounts:
|
||||
print("未找到任何账号信息")
|
||||
if hadsend:
|
||||
send("NodeSeek签到", "无法执行操作:没有有效Cookie且未设置用户名密码")
|
||||
send("nodeseek签到", "未找到任何账号信息")
|
||||
exit(0)
|
||||
|
||||
# 存储所有账号的通知信息
|
||||
all_messages = []
|
||||
|
||||
# 循环处理每个账号
|
||||
for i, account in enumerate(accounts):
|
||||
account_name = account["user"] if account["user"] else f"账号{i+1}"
|
||||
print(f"\n===== 开始处理{account_name} =====")
|
||||
|
||||
# 尝试使用现有Cookie签到
|
||||
sign_result, sign_message = "no_cookie", ""
|
||||
|
||||
if account["cookie"]:
|
||||
sign_result, sign_message = sign(account["cookie"])
|
||||
|
||||
# 处理签到结果
|
||||
if sign_result in ["success", "already_signed"]:
|
||||
status = "签到成功" if sign_result == "success" else "今天已经签到过了"
|
||||
print(f"{account_name}: {status}")
|
||||
all_messages.append(f"{account_name}: {sign_message}")
|
||||
else:
|
||||
# 签到失败或没有Cookie,尝试登录
|
||||
if account["user"] and account["pass"]:
|
||||
print(f"{account_name}: 尝试登录获取新Cookie...")
|
||||
cookie = session_login(account["user"], account["pass"])
|
||||
if cookie:
|
||||
print(f"{account_name}: 登录成功,使用新Cookie签到")
|
||||
account["cookie"] = cookie
|
||||
sign_result, sign_message = sign(cookie)
|
||||
|
||||
status = "签到成功" if sign_result in ["success", "already_signed"] else "签到失败"
|
||||
print(f"{account_name}: {status}")
|
||||
|
||||
message = f"{account_name}: {sign_message}"
|
||||
if sign_result in ["success", "already_signed"]:
|
||||
message += f"\nCookie: {cookie}"
|
||||
all_messages.append(message)
|
||||
else:
|
||||
print(f"{account_name}: 登录失败")
|
||||
all_messages.append(f"{account_name}: 登录失败")
|
||||
else:
|
||||
print(f"{account_name}: 无法执行操作:没有有效Cookie且未设置用户名密码")
|
||||
all_messages.append(f"{account_name}: 无法执行操作:没有有效Cookie且未设置用户名密码")
|
||||
|
||||
# 发送合并后的通知
|
||||
if hadsend and all_messages:
|
||||
send("nodeseek多账号签到", "\n\n".join(all_messages))
|
||||
|
||||
Reference in New Issue
Block a user