Collect authenticated Qinglong scripts batch
This commit is contained in:
141
脚本库/web版/抓包/NodeSeek签到/2026-05-23_Nodeseek_fe954847.py
Normal file
141
脚本库/web版/抓包/NodeSeek签到/2026-05-23_Nodeseek_fe954847.py
Normal file
@@ -0,0 +1,141 @@
|
||||
# Source: https://github.com/CN-Grace/QinglongScripts/blob/main/Nodeseek.py
|
||||
# Raw: https://raw.githubusercontent.com/CN-Grace/QinglongScripts/main/Nodeseek.py
|
||||
# Repo: CN-Grace/QinglongScripts
|
||||
# Path: Nodeseek.py
|
||||
# UploadedAt: 2026-05-23T15:48:24Z
|
||||
# SHA256: fe954847cd0f827c46a977716be00547e6496cf4df72f558542e5c846db4a19d
|
||||
# Category: web版/抓包
|
||||
# Evidence: web/H5关键词 + cookie/token/header
|
||||
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
cron: 0 0 * * *
|
||||
new Env("NodeSeek签到")
|
||||
NodeSeek 论坛自动签到脚本
|
||||
- 使用 curl_cffi 模拟浏览器指纹
|
||||
- 支持随机延迟签到
|
||||
"""
|
||||
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
from datetime import datetime
|
||||
from typing import Tuple
|
||||
|
||||
import requests
|
||||
from curl_cffi import requests as cffi_requests
|
||||
|
||||
from utils import log_info, log_success, log_warning, log_error, beijing_now, beijing_time_str
|
||||
from notifier import send as notify_send
|
||||
|
||||
# ==================== 用户配置 ====================
|
||||
NS_COOKIE = os.getenv("NS_COOKIE", "").strip()
|
||||
NS_RANDOM = os.getenv("NS_RANDOM", "true").strip().lower()
|
||||
NS_IMPERSONATE = os.getenv("NS_IMPERSONATE", "chrome110").strip()
|
||||
|
||||
|
||||
def _curl_post_json(url: str, headers: dict, timeout: int = 25):
|
||||
return cffi_requests.post(url, headers=headers, json={}, timeout=timeout, impersonate=NS_IMPERSONATE)
|
||||
|
||||
|
||||
def _normalize_random_flag(v: str) -> str:
|
||||
v = (v or "").strip().lower()
|
||||
return v if v in ("true", "false") else "true"
|
||||
|
||||
|
||||
def _sleep_jitter_before_checkin() -> int:
|
||||
"""签到前随机延迟 0~5 分钟"""
|
||||
delay_seconds = random.randint(0, 5 * 60)
|
||||
if delay_seconds <= 0:
|
||||
log_info("签到前随机延迟: 0s(跳过)")
|
||||
return 0
|
||||
minutes = delay_seconds // 60
|
||||
seconds = delay_seconds % 60
|
||||
log_info(f"签到前随机延迟: {minutes}m {seconds}s ...")
|
||||
time.sleep(delay_seconds)
|
||||
return delay_seconds
|
||||
|
||||
|
||||
def nodeseek_checkin(cookie: str, ns_random: str) -> Tuple[bool, str, str]:
|
||||
"""返回 (ok, status, message)"""
|
||||
if not cookie:
|
||||
return False, "invalid", "无有效 Cookie"
|
||||
|
||||
random_flag = _normalize_random_flag(ns_random)
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
||||
"origin": "https://www.nodeseek.com",
|
||||
"referer": "https://www.nodeseek.com/board",
|
||||
"Content-Type": "application/json",
|
||||
"Cookie": cookie,
|
||||
}
|
||||
|
||||
url = f"https://www.nodeseek.com/api/attendance?random={random_flag}"
|
||||
try:
|
||||
start = datetime.now()
|
||||
r = _curl_post_json(url, headers=headers)
|
||||
elapsed_ms = int((datetime.now() - start).total_seconds() * 1000)
|
||||
|
||||
data = None
|
||||
try:
|
||||
data = r.json()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
msg = ""
|
||||
success_flag = None
|
||||
if isinstance(data, dict):
|
||||
msg = str(data.get("message") or "")
|
||||
success_flag = data.get("success")
|
||||
|
||||
if "鸡腿" in msg or bool(success_flag) is True:
|
||||
return True, "success", msg or "签到成功"
|
||||
if "已完成签到" in msg:
|
||||
return True, "already", msg
|
||||
if isinstance(data, dict) and data.get("status") == 404:
|
||||
return False, "invalid", msg or "Cookie 已失效"
|
||||
if getattr(r, "status_code", 0) >= 400:
|
||||
snippet = (r.text or "").strip()[:200]
|
||||
return False, "error", f"HTTP {r.status_code}: {snippet or '请求失败'}"
|
||||
return False, "fail", msg or "签到失败"
|
||||
except Exception as e:
|
||||
return False, "error", f"签到异常: {e}"
|
||||
|
||||
|
||||
def _format_result(ok: bool, status: str, message: str, elapsed_ms: int, delay_seconds: int) -> str:
|
||||
icon = "✅" if ok else "❌"
|
||||
delay_str = f"{delay_seconds // 60}m {delay_seconds % 60}s" if delay_seconds else "0s"
|
||||
lines = [
|
||||
f"{icon} 状态: {status}",
|
||||
f"🕒 时间: {beijing_time_str()} (UTC+8)",
|
||||
f"⏱️ 耗时: {elapsed_ms} ms",
|
||||
f"🕯️ 延迟: {delay_str} (签到前随机延迟)",
|
||||
f"📝 说明: {message}",
|
||||
]
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
log_info(f"NodeSeek 签到脚本启动(单账号)")
|
||||
|
||||
if not NS_COOKIE:
|
||||
content = _format_result(False, "invalid", "未配置 NS_COOKIE,无法签到。", 0, 0)
|
||||
print("\n" + content)
|
||||
notify_send("NodeSeek 签到结果", content)
|
||||
return 1
|
||||
|
||||
delay_seconds = _sleep_jitter_before_checkin()
|
||||
start = datetime.now()
|
||||
ok, status, message = nodeseek_checkin(NS_COOKIE, NS_RANDOM)
|
||||
elapsed_ms = int((datetime.now() - start).total_seconds() * 1000)
|
||||
|
||||
content = _format_result(ok, status, message, elapsed_ms, delay_seconds)
|
||||
title = f"NodeSeek 签到结果 @ {beijing_time_str()}"
|
||||
print("\n" + content)
|
||||
notify_send(title, content)
|
||||
return 0 if ok else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user