Files
qinglong/脚本库/web版/抓包/小黑盒每日签到/2026-05-24_Heybox_cf7af030.py
2026-05-24 03:53:42 +00:00

225 lines
7.2 KiB
Python

# Source: https://github.com/CN-Grace/QinglongScripts/blob/main/Heybox.py
# Raw: https://raw.githubusercontent.com/CN-Grace/QinglongScripts/main/Heybox.py
# Repo: CN-Grace/QinglongScripts
# Path: Heybox.py
# UploadedAt: 2026-05-24T03:44:01Z
# SHA256: cf7af03059bd3d2d7e1afc7c76282554853e47ce7576ceaadfb124683364afc1
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#!/usr/bin/env python3
"""
cron: 0 8 * * *
new Env("小黑盒每日签到")
小黑盒 (Heybox) 每日签到脚本
- 获取签到日历和任务列表
- 执行每日签到
- 推送签到结果和奖励信息
"""
import os
import random
import string
import requests
from datetime import datetime, timezone, timedelta
from utils import log_info, log_success, log_warning, log_error, beijing_time_str
from notifier import send as notify_send
# ==================== 用户配置 ====================
HEYBOX_COOKIE = os.environ.get("HEYBOX_COOKIE", "") # pkey=...;x_xhh_tokenid=...
HEYBOX_ID = os.environ.get("HEYBOX_ID", "") # 小黑盒用户 ID
IMEI = os.environ.get("HEYBOX_IMEI", "") # 设备标识
API_BASE = "https://api.xiaoheihe.cn"
TZ_BEIJING = timezone(timedelta(hours=8))
def _random_str(length: int = 32) -> str:
chars = string.ascii_letters + string.digits
return "".join(random.choice(chars) for _ in range(length))
def _random_hex(length: int = 8) -> str:
return "".join(random.choice("0123456789ABCDEF") for _ in range(length))
def create_session() -> requests.Session:
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 ApiMaxJia/1.0",
"Accept-Encoding": "gzip",
})
if HEYBOX_COOKIE:
for item in HEYBOX_COOKIE.split(";"):
item = item.strip()
if "=" in item:
k, v = item.split("=", 1)
session.cookies.set(k.strip(), v.strip(), domain="xiaoheihe.cn")
return session
def build_params() -> str:
"""构建通用 Query 参数"""
heybox_id = HEYBOX_ID or _extract_from_cookie("heybox_id", "30182259")
imei = IMEI or _extract_from_cookie("imei", "a9381821da647661")
params = [
f"heybox_id={heybox_id}",
f"imei={imei}",
"device_info=25102RKBEC",
f"nonce={_random_str(32)}",
f"hkey={_random_hex(8)}",
"os_type=Android",
"x_os_type=Android",
"x_client_type=mobile",
"os_version=16",
"version=1.3.382",
"build=1076",
]
return "&".join(params)
def _extract_from_cookie(key: str, default: str = "") -> str:
for item in HEYBOX_COOKIE.split(";"):
item = item.strip()
if "=" in item and item.split("=", 1)[0].strip() == key:
return item.split("=", 1)[1].strip()
return default
def api_get(session: requests.Session, path: str) -> dict:
"""通用 GET 请求"""
url = f"{API_BASE}{path}?{build_params()}"
try:
resp = session.get(url, timeout=15)
return resp.json()
except Exception as e:
log_error(f"API 请求失败 [{path}]: {e}")
return {}
def get_sign_status(session: requests.Session) -> tuple:
"""检查今日签到状态,返回 (is_signed_today, sign_streak, calendar)"""
result = api_get(session, "/task/sign_list/")
if result.get("status") != "ok":
log_error(f"获取签到日历失败: {result}")
return False, 0, []
sign_list = result.get("result", {}).get("sign_list", [])
today_start = datetime.now(TZ_BEIJING).replace(hour=0, minute=0, second=0, microsecond=0)
today_ts = int(today_start.timestamp())
is_signed = False
for item in sign_list:
if item["date"] == today_ts:
is_signed = item.get("is_sign", False)
break
return is_signed, sign_list
def do_sign(session: requests.Session) -> str:
"""执行签到 (v3 API),返回 state: success/ignore/fail"""
result = api_get(session, "/task/sign_v3/sign")
if result.get("status") != "ok":
log_error(f"签到请求失败: {result}")
return "fail"
state = result.get("result", {}).get("state", "fail")
state_map = {
"success": "签到成功 ✅",
"ignore": "今日已签到,无需重复 ⚠️",
"fail": "签到失败 ❌",
}
log_info(f"签到结果: {state_map.get(state, state)}")
return state
def get_task_list(session: requests.Session) -> dict:
"""获取任务列表,含签到奖励信息"""
result = api_get(session, "/task/list_v2/")
if result.get("status") != "ok":
log_warning(f"获取任务列表失败: {result}")
return {}
return result.get("result", {})
def get_account_info(session: requests.Session) -> str:
"""获取用户昵称"""
result = api_get(session, "/account/info/")
if result.get("msg") == "":
profile = result.get("result", {}).get("profile", {})
return profile.get("nickname", "未知")
return "未知"
def build_report(nickname: str, state: str, task_info: dict) -> str:
"""构建签到报告"""
lines = ["🎮 小黑盒 每日签到", "", f"👤 账号: {nickname}"]
if state == "success":
lines.append("✅ 签到状态: 签到成功!")
# 提取签到奖励
award_found = False
for group in task_info.get("task_list", []):
for task in group.get("tasks", []):
if task.get("type") == "sign":
awards = task.get("award_desc_v2", [])
if awards:
award_found = True
lines.append(f"🎁 签到奖励:")
for a in awards:
lines.append(f" {a.get('desc', '')}")
lines.append(f"🔥 连续签到: {task.get('sign_in_streak', '?')}")
break
if not award_found:
lines.append("🎁 奖励: 已自动发放")
elif state == "ignore":
lines.append("⚠️ 签到状态: 今日已签到")
lines.append("🎁 无需重复签到")
else:
lines.append("❌ 签到状态: 签到失败")
lines.append("💡 请检查 Cookie 是否有效")
lines.append("")
lines.append("" * 18)
lines.append(f"🕒 执行时间: {beijing_time_str()}")
return "\n".join(lines)
def main():
if not HEYBOX_COOKIE:
log_error("未配置 HEYBOX_COOKIE")
notify_send("小黑盒签到 错误", "❌ 未配置 HEYBOX_COOKIE")
return
session = create_session()
nickname = get_account_info(session)
log_info(f"账号: {nickname}")
# 检查签到状态
is_signed, sign_list = get_sign_status(session)
state = "ignore"
if not is_signed:
log_info("今日未签到,开始执行签到...")
state = do_sign(session)
is_signed = (state in ("success", "ignore"))
else:
log_info("今日已签到,无需重复签到")
task_info = get_task_list(session)
task_info = task_info or {}
# 构建报告
report = build_report(nickname, state, task_info)
notify_send("小黑盒 签到报告", report)
log_success("推送完成")
if __name__ == "__main__":
main()