Collect authenticated Qinglong scripts batch

This commit is contained in:
Hermes Agent
2026-05-24 03:53:42 +00:00
parent 0d80b33d25
commit 28d62fef03
86 changed files with 18420 additions and 5 deletions

View File

@@ -0,0 +1,58 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/17k.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/17k.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/17k.js
// # UploadedAt: 2023-03-01T15:17:32Z
// # SHA256: dfe209b30bd8581cd2b2b80fac56de604614270edda9a410af9ccb054389cc3b
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
//17k小说签到 app/网页cookie通用
const axios = require("axios");
const y7kck = config.y7k.cookie
function get(url, method = "get", data = null) {
return new Promise(async (resolve) => {
try {
let headers = { "cookie" : y7kck }
if (method == "get") res = await axios.get(url, {
headers
});
if (method == "post") res = await axios.post(url, data, {
headers
});
resolve(res.data)
} catch (err) {
console.log(err);
resolve("签到接口请求出错")
}
resolve();
});
}
async function y7k() {
my = "";signResult1 ="";signResult2 ="";
//网页签到
let res1 = await get("https://h5.17k.com/userSigninH5/saveUserSigninH5.html", "post", "0")
signResult1 = res1.msg
//app任务 阅读30min
let res2 =await get("http://api.17k.com/user/task/receive-prize","post","taskId=5&cpsOpid=0&_filterData=1&device_id=32536325221b1ba1&channel=0&_versions=1110&merchant=17Kyyb&platform=2&manufacturer=Xiaomi&clientType=1&appKey=4037465544&model=Redmi%20K30&cpsSource=0&brand=Redmi")
console.log(res2.status.msg)
//app签到
let signInfo = await get("http://api.17k.com/sign/user/info?access_token=1&clientType=1&cpsOpid=0&_filterData=1&channel=0&_versions=1070&merchant=17Kyyb&appKey=4037465544&cpsSource=0&platform=2")
signResult2 =(signInfo.status.code == 0)?"签到成功":signInfo.status.msg
//查询
let info = await get("http://api.17k.com/user/mine/merge?access_token=1&accountInfo=1&bindInfo=1&benefitsType=1&cpsOpid=0&_filterData=1&device_id=&channel=0&_versions=1230&merchant=17Khwyysd&platform=2&manufacturer=Xiaomi&clientType=1&width=1080&appKey=4037465544&cpsSource=0&youthModel=0&height=2175")
if (info.status.code == 0 && info.data) {
data = info.data
my = `昵称:${data.nickname}\nK币${data.accountInfo.balance}\nVIPLv${data.vipLevel}\n代金券:${data.accountInfo.totalBalance}\n推荐票:${data.cardInfo.recommendTicketCount}\napp签到${signResult2}\nweb签到${signResult1}`
} else my = info.status.msg
console.log(my)
return "【17k小说】"+my
}
//y7k()
module.exports = y7k;

View File

@@ -0,0 +1,297 @@
# Source: https://github.com/CN-Grace/QinglongScripts/blob/main/Bilibili.py
# Raw: https://raw.githubusercontent.com/CN-Grace/QinglongScripts/main/Bilibili.py
# Repo: CN-Grace/QinglongScripts
# Path: Bilibili.py
# UploadedAt: 2026-05-23T15:48:24Z
# SHA256: 3f2f0084618aefdba5d3f7361244ebec508c7db5a09cbe80d0b8170bb5d2d27f
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#!/usr/bin/env python3
"""
cron: 0 0 * * *
new Env("B站每日任务")
Bilibili 每日任务脚本
- 漫画签到
- 投币任务(支持指定投币数和投币来源)
- 观看视频任务
- 分享视频任务
- 银瓜子兑换硬币(可选)
- 获取今日经验、当前经验、预计升级天数
"""
import os
import time
import requests
from utils import log_info, log_success, log_warning, log_error, beijing_time_str
from notifier import send as notify_send
# ==================== 用户配置 ====================
BILIBILI_COOKIE = os.environ.get("BILIBILI_COOKIE", "")
COIN_NUM = int(os.environ.get("BILIBILI_COIN_NUM", "0"))
COIN_TYPE = int(os.environ.get("BILIBILI_COIN_TYPE", "1"))
SILVER2COIN = os.environ.get("BILIBILI_SILVER2COIN", "false").lower() == "true"
report_data = {}
# ---------- Bilibili API ----------
def get_nav(session):
"""获取用户导航信息"""
url = "https://api.bilibili.com/x/web-interface/nav"
ret = session.get(url=url).json()
data = ret.get("data", {})
return data.get("uname"), data.get("mid"), data.get("isLogin"), data.get("money"), data.get("vipType"), data.get("level_info", {}).get("current_exp")
def get_today_exp(session):
"""获取今日经验明细"""
url = "https://api.bilibili.com/x/member/web/exp/log?jsonp=jsonp"
today = beijing_time_str("%Y-%m-%d")
try:
data_list = session.get(url=url).json().get("data", {}).get("list", [])
return list(filter(lambda x: x["time"].split()[0] == today, data_list))
except Exception:
return []
def manga_sign(session, platform="android"):
"""漫画签到"""
try:
url = "https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn"
ret = session.post(url=url, data={"platform": platform}).json()
if ret["code"] == 0:
return "✅ 签到成功"
elif ret.get("msg") == "clockin clockin is duplicate":
return "✅ 今天已经签到过了"
else:
msg = f"❌ 签到失败: {ret.get('msg', '未知错误')}"
log_error(msg)
return msg
except Exception as e:
msg = f"❌ 签到异常: {e!s}"
log_error(msg)
return msg
def report_task(session, bili_jct, aid, cid, progres=300):
"""上报视频观看进度"""
url = "http://api.bilibili.com/x/v2/history/report"
return session.post(url=url, data={"aid": aid, "cid": cid, "progres": progres, "csrf": bili_jct}).json()
def share_task(session, bili_jct, aid):
"""分享视频"""
url = "https://api.bilibili.com/x/web-interface/share/add"
return session.post(url=url, data={"aid": aid, "csrf": bili_jct}).json()
def get_followings(session, uid, pn=1, ps=50, order="desc", order_type="attention"):
"""获取关注的 up 主列表"""
params = {"vmid": uid, "pn": pn, "ps": ps, "order": order, "order_type": order_type}
return session.get(url="https://api.bilibili.com/x/relation/followings", params=params).json()
def space_arc_search(session, uid, pn=1, ps=30, tid=0, order="pubdate", keyword=""):
"""获取指定 up 主的视频投稿"""
params = {"mid": uid, "pn": pn, "Ps": ps, "tid": tid, "order": order, "keyword": keyword}
ret = session.get(url="https://api.bilibili.com/x/space/arc/search", params=params).json()
data_list = [
{"aid": one.get("aid"), "cid": 0, "title": one.get("title"), "owner": one.get("author")}
for one in ret.get("data", {}).get("list", {}).get("vlist", [])[:2]
]
return data_list, 2
def coin_add(session, bili_jct, aid, num=1, select_like=1):
"""给视频投币"""
url = "https://api.bilibili.com/x/web-interface/coin/add"
return session.post(url=url, data={"aid": aid, "multiply": num, "select_like": select_like, "cross_domain": "true", "csrf": bili_jct}).json()
def live_status(session):
"""获取直播瓜子状态"""
ret = session.get(url="https://api.live.bilibili.com/pay/v1/Exchange/getStatus").json()
data = ret.get("data", {})
return {"coin": data.get("coin", 0), "gold": data.get("gold", 0), "silver": data.get("silver", 0)}
def get_region(session, rid=1, num=6):
"""获取分区视频列表"""
url = f"https://api.bilibili.com/x/web-interface/dynamic/region?ps={num}&rid={rid}"
ret = session.get(url=url).json()
return [{"aid": one.get("aid"), "cid": one.get("cid"), "title": one.get("title"), "owner": one.get("owner", {}).get("name")} for one in ret.get("data", {}).get("archives", [])]
def silver2coin(session, bili_jct):
"""银瓜子兑换硬币"""
url = "https://api.live.bilibili.com/xlive/revenue/v1/wallet/silver2coin"
return session.post(url=url, data={"csrf": bili_jct}).json()
def main():
global report_data
report_data = {}
bilibili_cookie = {item.split("=")[0]: item.split("=")[1] for item in BILIBILI_COOKIE.split("; ")}
bili_jct = bilibili_cookie.get("bili_jct")
session = requests.session()
requests.utils.add_dict_to_cookiejar(session.cookies, bilibili_cookie)
session.headers.update({
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64",
"Referer": "https://www.bilibili.com/",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
})
uname, uid, is_login, coin, vip_type, current_exp = get_nav(session=session)
if not is_login:
log_error("登录失败,请检查 cookie")
return "登录失败,请检查 cookie"
log_success(f"登录成功,用户名: {uname}UID: {uid},当前硬币: {coin}")
report_data["账号"] = uname
# 漫画签到
manhua_msg = manga_sign(session=session)
log_info(f"漫画签到: {manhua_msg}")
report_data["漫画签到"] = manhua_msg
# 获取分区视频列表
aid_list = get_region(session=session)
# 计算今日已投币数
today_exp_list = get_today_exp(session=session)
coins_av_count = len(list(filter(lambda x: x.get("reason") == "视频投币奖励", today_exp_list)))
need_coin_num = COIN_NUM - coins_av_count
need_coin_num = need_coin_num if need_coin_num < coin else coin
log_info(f"今日已投币 {coins_av_count} 个,目标投币 {COIN_NUM} 个,还需投 {need_coin_num}")
# 根据 coin_type 选择投币来源
if COIN_TYPE == 1:
following_list = get_followings(session=session, uid=uid)
count = 0
for following in following_list.get("data", {}).get("list", []):
mid = following.get("mid")
if mid:
tmplist, tmpcount = space_arc_search(session=session, uid=mid)
aid_list += tmplist
count += tmpcount
if count > need_coin_num:
log_info("已获取足够关注用户的视频")
break
else:
aid_list += get_region(session=session)
# 投币循环
success_count = 0
if need_coin_num > 0:
for one in aid_list[::-1]:
ret = coin_add(session=session, aid=one.get("aid"), bili_jct=bili_jct)
if ret.get("code") == 0:
need_coin_num -= 1
log_success(f"成功给《{one.get('title')}》投一个币")
success_count += 1
elif ret.get("code") == 34005:
log_warning(f"投币《{one.get('title')}》失败: {ret.get('message')},继续下一个")
continue
else:
log_error(f"投币《{one.get('title')}》失败: {ret.get('message')},跳过投币")
break
if need_coin_num <= 0:
break
coin_msg = f"今日成功投币 {success_count + coins_av_count}/{COIN_NUM}"
else:
coin_msg = f"今日成功投币 {coins_av_count}/{COIN_NUM}"
log_info(coin_msg)
report_data["投币任务"] = coin_msg
# 观看视频任务
if aid_list:
first = aid_list[0]
report_ret = report_task(session=session, bili_jct=bili_jct, aid=first.get("aid"), cid=first.get("cid"))
report_msg = f"✅ 观看《{first.get('title')}》300秒" if report_ret.get("code") == 0 else "❌ 观看任务失败"
log_success(report_msg) if report_ret.get("code") == 0 else log_error(report_msg)
share_ret = share_task(session=session, bili_jct=bili_jct, aid=first.get("aid"))
share_msg = f"✅ 分享《{first.get('title')}》成功" if share_ret.get("code") == 0 else "❌ 分享失败"
log_success(share_msg) if share_ret.get("code") == 0 else log_error(share_msg)
else:
report_msg = "⚠️ 无视频可观看"; share_msg = "⚠️ 无视频可分享"
log_warning(report_msg); log_warning(share_msg)
report_data["观看视频"] = report_msg
report_data["分享任务"] = share_msg
# 银瓜子兑换硬币
s2c_msg = "⚪ 未开启兑换"
if SILVER2COIN:
silver2coin_ret = silver2coin(session=session, bili_jct=bili_jct)
if silver2coin_ret.get("code") == 0:
s2c_msg = "✅ 银瓜子兑换硬币成功"
log_success(s2c_msg)
else:
s2c_msg = f"❌ 兑换失败: {silver2coin_ret.get('message', '未知错误')}"
log_error(s2c_msg)
report_data["瓜子兑换"] = s2c_msg
# 获取直播瓜子状态
live_stats = live_status(session=session)
report_data["硬币数量"] = live_stats["coin"]
report_data["金瓜子数"] = live_stats["gold"]
report_data["银瓜子数"] = live_stats["silver"]
# 再次获取用户信息,更新经验
uname, uid, is_login, new_coin, vip_type, new_current_exp = get_nav(session=session)
today_exp = sum(map(lambda x: x.get("delta", 0), get_today_exp(session=session)))
update_data = (28800 - new_current_exp) // (today_exp if today_exp else 1) if today_exp else "未知"
report_data["今日经验"] = today_exp
report_data["当前经验"] = new_current_exp
report_data["升级还需"] = f"{update_data}"
log_success("========== 任务执行汇总 ==========")
for k, v in report_data.items():
log_info(f"{k}: {v}")
return report_data
def build_report(data):
"""构建签到报告"""
lines = ["🎯 Bilibili 每日任务报告", "", f"👤 账号: {data.get('账号', '未知')}", ""]
tasks = [
("📖 漫画签到", data.get("漫画签到", "")),
("📺 观看视频", data.get("观看视频", "")),
("🔗 分享任务", data.get("分享任务", "")),
("💰 投币任务", data.get("投币任务", "")),
("💱 瓜子兑换", data.get("瓜子兑换", "")),
]
for name, value in tasks:
lines.append(f"{name}: {value}")
lines.append("")
lines.append("📊 数据统计")
lines.append(f"⭐ 今日经验: {data.get('今日经验', 0)}")
lines.append(f"📈 当前经验: {data.get('当前经验', 0)}")
lines.append(f"⏳ 升级还需: {data.get('升级还需', '未知')}")
lines.append("")
lines.append("🥜 瓜子库存")
lines.append(f"🪙 硬币数量: {data.get('硬币数量', 0)}")
lines.append(f"✨ 金瓜子数: {data.get('金瓜子数', 0)}")
lines.append(f"🥈 银瓜子数: {data.get('银瓜子数', 0)}")
lines.append("")
lines.append("" * 18)
lines.append(f"🕒 执行时间: {beijing_time_str()}")
return "\n".join(lines)
if __name__ == "__main__":
report = main()
if report and isinstance(report, dict):
tg_text = build_report(report)
notify_send("Bilibili 每日任务报告", tg_text)

View 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())

View File

@@ -0,0 +1,47 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/acdog.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/acdog.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/acdog.js
// # UploadedAt: 2021-04-16T00:43:18Z
// # SHA256: 6f2a1d7c68045d9ac88c8f18c0c1f636c7f8b1b950882b61b4ed1bf2a24a12f6
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
let header = {
headers: {
'referer': 'https://www.acgndog.com/category/qingxiaoshuo',
'cookie': config.acdog.cookie }
}
const axios = require("axios")
let result = "【次元🐕】:"
async function getnonce() {
var res = await axios.get('https://www.acgndog.com/wp-admin/admin-ajax.php?action=d2e5b56b75e2f3d4ab412a6d9561faee&%5Btype%5D=checkSigned&6bce68d6adeec8e9a3fb135daeb30b7f%5Btype%5D=checkUnread&7a2a6dd56f97c9a9a1b3bd5ade6d8f17%5Btype%5D=getUnreadCount', header)
if (res.data.user.uid) {
msg = "当前共" + res.data.customPoint.point + "狗爪 "
nonce = res.data._nonce
result += msg
console.log(msg)
await dailysign(nonce)
} else {
msg = "cookie已失效"
result += msg
console.log(msg)
}
return result
}
async function dailysign(nonce) {
var res = await axios.get("https://www.acgndog.com/wp-admin/admin-ajax.php?_nonce=" + nonce + "&action=5ced0113734a2bc46ecf3f30b0685b7b&type=goSign", header)
if (res.data.code == 0) {
msg = res.data.msg
} else {
msg = "签到失败"
console.log(res.data)
}
console.log(msg)
result += msg
}
module.exports = getnonce

View File

@@ -0,0 +1,54 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/aihao.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/aihao.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/aihao.js
// # UploadedAt: 2021-04-16T00:43:18Z
// # SHA256: 096bad643c3f6c635572eea4ec218275001b9e4d8f0de7c26f3ca05b81db43a3
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require("axios");
let result = "【爱好论坛】:";
function aihao() {
return new Promise(async (resolve) => {
try {
console.log("爱好论坛打卡开始...");
let cookie = config.aihao.cookie;
let header = { headers: { cookie: cookie } };
for (i of [1, 2, 3, 4]) {
str = ["上午打卡", "下午打卡", "晚上打卡", "全勤奖励"];
data = `button${i}=`;
res = await axios.post(
"https://www.aihao.cc/plugin.php?id=daka",
data,
header
);
if (!res.data.match(/请先登录后才能继续使用/)) {
if (res.data.match(/未到打卡时间|您本月还未打卡|已过打卡时间/)) {
msg = "还没到打卡时间呢亲_(:D)∠)_";
} else if (res.data.match(/打卡成功/)) {
msg = res.data.match(/打卡成功!奖励金钱:\d+/);
} else if (res.data.match(/请勿重复打卡/)) {
msg = "当前时间段已经打过卡了嗷(๑°3°๑)";
} else if (res.data.match(/无法获得全勤奖励/)) {
msg = res.data.match(/无法获得全勤奖励!您本月打卡次数:\d+/);
} else {
msg = "签到失败!原因未知";
console.log(res.data);
}
} else {
msg = "cookie已失效";
}
console.log(str[i - 1] + "" + msg);
result += str[i - 1] + "" + msg+" ";
}
} catch (err) {
console.log(err);
}
resolve(result);
});
}
//aihao()
module.exports = aihao;

View File

@@ -0,0 +1,69 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/ccw.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/ccw.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/ccw.js
// # UploadedAt: 2024-01-22T22:39:08Z
// # SHA256: ad367a776ed1a81284f3532d277a20e1e2dc050d9915ac9e5916aee6e310de3c
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require('axios');
let msg = "【共创世界】:\n";
const token = config.ccw.token
const headers = {
'Content-Type': 'application/json',
token
};
async function checkIn() {
const url = 'https://community-web.ccw.site/study-community/check_in_record/insert';
const body = {
"scene": "HOMEPAGE"
};
try {
const response = await axios.post(url, body, { headers });
if (response.data && response.data.code === "200") {
console.log("签到成功");
return "成功";
} else if (response.data && response.data.code === "10736001") {
console.log("用户已签到");
return "用户已签到";
} else {
return "签到失败";
}
} catch (error) {
console.error("签到失败", error);
return "签到失败";
}
}
async function queryBalance() {
const url = 'https://community-web.ccw.site/currency/account/personal';
try {
const response = await axios.post(url, {}, { headers });
if (response.data && response.data.code === "200" && response.data.body) {
console.log("当前积分:", response.data.body.internalCurrencyBalance);
return response.data.body.internalCurrencyBalance.toString();
} else {
return "获取积分失败";
}
} catch (error) {
console.error("查询失败", error);
return "查询失败";
}
}
async function task() {
let checkInMsg = await checkIn();
let balanceMsg = await queryBalance();
msg += `签到:${checkInMsg}\n积分:${balanceMsg}`;
// console.log(msg);
return msg
}
//task(); // 如果你想在文件执行时直接运行 task 函数
module.exports = task; // 允许其他文件导入并使用 task 函数

View File

@@ -0,0 +1,63 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/cg163.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/cg163.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/cg163.js
// # UploadedAt: 2021-09-16T02:16:27Z
// # SHA256: 71024025bbb27a426f7d5e1899ada14ca39b718b0b04918f478fd8b0deda6c7e
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const headers = {
headers: {
Authorization:
config.cg163.Authorization || " bearer xxxxx",
"user-agent":
"Mozilla/5.0 (Linux; Android 10; Redmi K30 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36",
// "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
};
const axios = require("axios")
function check() {
return new Promise(async (resolve) => {
try {
const url = `https://n.cg.163.com/api/v2/users/@me`;
let res = await axios.get(url, headers);
console.log("cookie未失效,即将开始签到...");
ckstatus = 1;
} catch (err) {
console.log(err)
console.log("cookie已失效");
ckstatus = 0;
}
resolve();
});
}
function sign() {
return new Promise(async (resolve) => {
try {
const url = `https://n.cg.163.com/api/v2/sign-today`;
let res = await axios.post(url, "", headers);
console.log("签到成功");
msg = "签到成功!! ";
} catch (err) {
// console.log(err)
msg = "签到失败,已签到过或其它未知原因!! ";
console.log(msg);
}
resolve("【网易云游戏】:"+msg);
});
}
async function cg163() {
ckstatus = 0;
await check();
if (ckstatus == 1) {
return await sign();
} else {
console.log("cookie失效,请重新抓取cookies...");
return "【网易云游戏】: cookie失效,请重新抓取cookies...";
}
}
//cg163()
module.exports = cg163;

View File

@@ -0,0 +1,47 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/du163.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/du163.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/du163.js
// # UploadedAt: 2021-10-10T06:20:09Z
// # SHA256: 278253336ed5ca263518aca6ac174e963458e381dad2dc7bbfc04753cea43e2b
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
//网易蜗牛读书
const axios = require("axios");
let result = "【网易蜗牛读书】: ";
function du163() {
return new Promise(async (resolve) => {
try {
const du = config.du163;
const headers = {
headers: {
_xsrf: du.xsrf,
"X-Auth-Token": du["X-Auth-Token"],
"User-Agent":
"Mozilla/5.0 (Linux; Android 10; Redmi K30 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36 NeteaseSnailReader/1.9.11 NetType/3G+ (00ef591f8e05c305;coolapk) NEJSBridge/2.0.0",
},
};
let url = `https://du.163.com/activity/201907/activityCenter/sign.jsonannel=0&_versions=1080&merchant=17Kxiaomi&platform=2&manufacturer=`;
let data = { csrfToken: du.xsrf || 6 };
let res = await axios.post(url, data, headers);
if (res.data.code == -1104) {
msg = res.data.msg;
} else if (res.data.code == 0) {
msg = res.data.message + " 连签" + res.data.continuousSignedDays + "天";
} else {
msg = "签到失败 "+res.data.msg;
console.log(res.data);
}
result += msg;
console.log(msg);
} catch (err) {
console.log(err.response.data.msg);
result =result + "签到失败 "+ err.response.data.msg;
}
resolve(result);
});
}
module.exports = du163;

View File

@@ -0,0 +1,57 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/hzw.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/hzw.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/hzw.js
// # UploadedAt: 2023-11-23T08:10:53Z
// # SHA256: d2dc6e35db0770955352fc7fb0df0657b3d87da693dd7f42b538951aabd4d271
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
// formhash获取(在浏览器F12控制台输入)document.querySelector('input[name="formhash"]').getAttribute('value')
const axios = require("axios");
let result = "【海贼王论坛】:"
class HZW {
constructor() {
this.host = 'https://bbs.talkop.com/plugin.php';
this.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": config.hzw.cookie,
};
this.body = `formhash=${config.hzw.formhash}&qdxq=kx&qdmode=2&todaysay=&fastreply=0`;
}
// 签到
async sign() {
const url = this.host + '?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&inajax=1';
try {
const res = await axios.post(url, this.body, {headers: this.headers});
let matchResult = res.data.match(/(.+?)\r\n<\/div>/);
let response = matchResult ? matchResult[1] : '签到失败,原因未知';
console.log(`${response}`);
result += `${response} ||`
} catch (error) {
console.log(`签到失败,原因是:${error}`);
result += `签到失败,原因是:${error} ||`
}
}
async run() {
await this.sign();
console.log();
}
}
async function hzw() {
const hzwlt = new HZW();
await hzwlt.run();
if (result.endsWith('||')) {
result = result.substring(0, result.length - 2);
}
return result;
}
module.exports = hzw;

View File

@@ -0,0 +1,170 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/mtmc.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/mtmc.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/mtmc.js
// # UploadedAt: 2023-02-01T08:53:28Z
// # SHA256: 7c844a5f0b597749d681c654ff47966a18bb9e725624d5125e3559184356fbfa
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require("axios");
const {
MTMC_userId,
MTMC_fingerprint,
MTMC_token,
MTMC_uuid
} = config.MeiTuan
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
function get(task, method = "get", data = null) {
return new Promise(async (resolve) => {
try {
let url = `https://mall.meituan.com/api/c/mallcoin/${task}&app_tag=union&bizId=2&ci=2&page_type=h5&poi=10000380&poiId=66&tenantId=1&t=${MTMC_token}&uci=-1&userid=${MTMC_userId}&utm_medium=android&utm_term=5.38.0&uuid=${MTMC_uuid}&xuuid=`
const headers = {
t: MTMC_token,
"user-agent": "Mozilla/5.0 (Linux; Android 11; MEIZU 18 Pro Build/RKQ1.201105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/104.0.5112.69 Mobile Safari/537.36 TitansX/20.12.6 KNB/1.2.0 android/11 com.meituan.retail.v.android/armv7 App/11g20/5.38.0 com.meituan.retail.v.android/5.38.0",
Host: "mall.meituan.com",
"X-Requested-With": "com.meituan.retail.v.android",
"Content-Type": "application/json; charset=utf-8"
}
//console.log(headers)
if (method == "get") res = await axios.get(url, {
headers
});
if (data) {
xxstr = {
"platform": 4,
"app": 95,
"utm_term": "5.38.0",
"uuid": MTMC_uuid,
"fingerprint": MTMC_fingerprint,
"utm_medium": 95
}
data.riskMap ==
Object.assign(data.riskMap, xxstr)
}
// console.log(data)
if (method == "post") res = await axios.post(url, data, {
headers
});
if (res.data.code == 0) console.log(" 操作成功")
// console.log(headers)
// console.log(res.data)
resolve(res.data)
} catch (err) {
console.log(err);
resolve({
code: 500,
error: {
msg: "签到接口请求出错"
}
})
}
resolve();
});
}
async function getaskList() {
console.log("查询任务列表")
let res = await get("checkIn/queryTaskListInfoV3?&channel=1", "post",    {
"riskMap": {
"partner": 109,
"campaignId": 1002,
"campaignName": "买菜币"
}
})
if (res.code == 0 && res.data) return res.data.checkInTaskInfos.filter(x => x.id == 52 && x.taskFinishCount != x.taskChance || x.status == 100)
return []
}
async function sign() {
signmsg = ""
console.log("去签到:")
let signRes = await get("checkIn/userCheckInNew?", "post",    {
"userId": MTMC_userId,
"riskMap": {}
})
if (signRes.code == 0) {
if (signRes.data.result) signmsg = `签到成功!获得 ${signRes.data.rewardValue} 买菜币`
else signmsg = `签到失败!可能签到过啦`
console.log(" " + signmsg)
} else signmsg = signRes.error.msg
//console.log(signRes)/
//
for (rewardDate of [3, 7]) {
await get("checkIn/getWeekContinuousRewardNew?", "post", {
userId: MTMC_userId,
rewardDate: rewardDate,
"riskMap": {}
})
}
return signmsg
}
//浏览任务
async function view() {
let taskList = await getaskList()
if (taskList.length != 0) {
let task = taskList[0]
//领取
console.log("浏览任务开始:\n 去领取浏览任务:")
console.log(" " + task.buttonDesc)
if (task) {
if (task.buttonDesc == "领任务" || task.status == 10) {
let lqRes = await get("checkIn/takeTask?activityId=33&taskId=52&channel=1")
if (lqRes && lqRes.code == 0) {
console.log(" 领取成功\n等待17s")
await sleep(17 * 1000)
await get("checkIn/taskEventComplete?eventType=6&channel=1")
} else console.log(" " + lqRes.error.msg)
taskList = await getaskList()
task = taskList[0]
}
if (task.buttonDesc == "领奖励") {
await sleep(3 * 1000)
console.log(" 去领取奖励:")
let lqReward = await get(`checkIn/takeTaskReward?activityId=33&taskId=52&rewardId=774&taskType=6&userTaskId=${task.userTaskId}&channel=1`)
if (lqReward && lqReward.code == 0) {
console.log(` 领取成功!获得 ${lqReward.data.rewardType} ${lqReward.data.rewardValue}`)
}
}
} else console.log(" 暂无可领取任务")
}
}
async function getmyb() {
let res = await get("checkIn/getCheckInMainView?")
if (res && res.code == 0) return `\n 我的菜币:${res.data.userInfo.balance}\n 签到天数:${res.data.checkInCount}\n smjb${res.data.noticeDetail}\n`
else return ""
}
async function share() {
console.log("去分享:")
let res = await get("checkIn/getShareReward?shareBusinessType=2&")
if (res.code == 0) {
if (res.data.result) console.log(` 分享成功!获得 ${res.data.rewardValue}菜币`)
else console.log(" 分享过啦")
}
}
async function meituanmc() {
let signMsg = await sign()
await view()
await share()
myInfo = await getmyb()
content = ` 【美团买菜】 签到:${signMsg} ${myInfo}`
console.log(myInfo)
return content
}
module.exports = meituanmc

View File

@@ -0,0 +1,126 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/pfjsq.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/pfjsq.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/pfjsq.js
// # UploadedAt: 2023-11-22T14:22:59Z
// # SHA256: 43885f513eed4b880605b7cba3b31684592740c97935320ff03219bcb825803e
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require("axios");
let result = "【泡芙加速器】:"
class PFJS {
constructor() {
this.host = 'https://api-admin-js.paofujiasu.com/';
this.headers = {
"Host": "api-admin-js.paofujiasu.com",
"User-Agent": "Mozilla/5.0 (Linux; Android 12; M2012K11AC Build/SKQ1.220303.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.141 Mobile Safari/537.36 XWEB/5169 MMWEBSDK/20221011 MMWEBID/6242 MicroMessenger/8.0.30.2260(0x28001E3B) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"tokentype": "applet",
"Content-Type": "application/json",
"token": config.pfjsq.token,
};
this.count = 0;
this.body = '{"res_type":1}';
}
// 检查金币是否满5个
async check_gold(msg) {
if (msg.indexOf('5个金币') !== -1) {
await this.exchange();
}
}
// 兑换6小时时长卡
async exchange() {
const url = this.host + 'client/api/v1/virtual_currency/exchange_by_species';
try {
this.body = '{"rule_id":4}'
const res = await axios.post(url, this.body, {headers: this.headers});
console.log(`兑换${res.data.info}`);
result += `兑换${res.data.info} ||`
} catch (error) {
console.log(`兑换失败,原因是:${error.response.data.info}`);
result += `兑换失败,原因是:${error.response.data.info} ||`
}
}
// 签到
async sign() {
const url = this.host + 'client/api/v1/virtual_currency/sign_in_for_species';
try {
const res = await axios.post(url, this.body, {headers: this.headers});
console.log(`签到${res.data.info}`);
result += `签到${res.data.info} ||`
await this.check_gold(res.data.info)
} catch (error) {
console.log(`签到失败,原因是:${error.response.data.info}`);
result += `签到失败,原因是:${error.response.data.info} ||`
await this.check_gold(error.response.data.info)
}
}
// 查询广告剩余次数
async getAd() {
const url = this.host + 'client/api/v1/virtual_currency/look_ad_count';
try {
const res = await axios.get(url, {headers: this.headers});
console.log(`广告${res.data.data.sign_count}/${res.data.data.limit_count}`);
this.count = res.data.data.limit_count - res.data.data.sign_count;
} catch (error) {
console.log(`查询广告失败,原因是:${error.response.data.info}`);
}
}
// 看广告前置
async lookAdForPower() {
const url = this.host + 'client/api/v1/virtual_currency/look_ad_for_power';
try {
const res = await axios.post(url, this.body, {headers: this.headers});
console.log(`目前倍率:${res.data.data.power}`);
} catch (error) {
console.log(`看广告失败,原因是:${error.response.data.info}`);
}
}
// 看广告
async lookAd() {
const url = this.host + 'client/api/v1/virtual_currency/look_ad_for_species';
try {
const res = await axios.post(url, this.body, {headers: this.headers});
console.log(`看广告${res.data.info}`);
await this.check_gold(res.data.info)
result += `看广告${res.data.info} ||`
} catch (error) {
console.log(`看广告失败,原因是:${error.response.data.info}`);
await this.check_gold(error.response.data.info)
result += `看广告失败,原因是:${error.response.data.info} ||`
}
}
async run() {
await this.sign();
await this.getAd();
console.log();
for (let i = 0; i < this.count; i++) {
console.log(`--------------- 第${i + 1}轮广告 ---------------`);
await this.lookAdForPower();
await this.lookAd();
await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * (60000 - 30000 + 1)) + 30000));
}
console.log();
}
}
async function pfjsq() {
const pfjs = new PFJS();
await pfjs.run();
if (result.endsWith('||')) {
result = result.substring(0, result.length - 2);
}
return result;
}
module.exports = pfjsq;

View File

@@ -0,0 +1,41 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/pingu.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/pingu.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/pingu.js
// # UploadedAt: 2021-10-18T16:32:03Z
// # SHA256: 298375e236180b0ddb22ad22902ddc939dd1742ed2d61fd488164f987eb16a16
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
//经管之家 邀请链接 https://bbs.pinggu.org/?fromuid=11925701
const axios = require("axios");
function task() {
return new Promise(async (resolve) => {
try {
let url = "https://bbs.pinggu.org/index_lth5.php?mod=my_qiandao&uid=";
let res = await axios.get(url, {
headers: {
cookie: config.pinggu.cookie,
"X-Requested-With": "XMLHttpRequest",
"User-Agent":
"Mozilla/5.0 (Linux; Android 10; Redmi K30) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.110 Mobile Safari/537.36",
},
});
if (res.data.data) {
msg = res.data.data.msg
} else {
msg = "cookie已失效,请及时更新";
}
console.log(msg);
} catch (err) {
console.log(err);
msg = "签到接口请求出错";
}
resolve("【经管之家】:\n" + msg);
});
}
//task()
module.exports = task;

View File

@@ -0,0 +1,97 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/quark.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/quark.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/quark.js
// # UploadedAt: 2024-06-06T17:33:52Z
// # SHA256: 1c97a712980803bab7a5cb5bc44ebfd2779ebad7ef92a3efe3d4b6028daf86b5
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require("axios");
cookie = config.quark.cookie;
const headers = {
"Content-Type": "application/json",
Cookie: "",
};
async function quark() {
for (let index = 0; index < cookie.length; index++) {
headers["Cookie"] = cookie[index];
await qd_check();
}
}
/**
*
* @returns 签到情况
*/
async function qd_check() {
return new Promise(async (resolve) => {
try {
const url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/info";
const params = {
pr: "ucpro",
fr: "pc",
uc_param_str: "",
};
let res = await axios.get(url, { headers, params });
if (res.data.data.cap_sign.sign_daily) {
const sign = res.data.data.cap_sign;
const number = sign.sign_daily_reward / 1048576;
const progress = Math.round(
(sign.sign_progress / sign.sign_target) * 100
);
console.log(`今日已签到,获取${number}MB进度${progress}%`);
msg = `今日已签到,获取${number}MB进度${progress}%`;
} else {
await qd();
}
} catch (error) {
console.log(error.data);
msg = "签到接口请求失败";
}
resolve("【夸克网盘】:" + msg || "正常运行了");
});
}
/**
*
* @returns 签到结果
*/
function qd() {
return new Promise(async (resolve) => {
try {
const url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/sign";
const params = {
pr: "ucpro",
fr: "pc",
uc_param_str: "",
};
let res = await axios.post(
url,
{
sign_cyclic: true,
},
{ headers, params }
);
if (res.data.status == 200) {
const sign = res.data.data;
const number = sign.sign_daily_reward / 1048576;
console.log(`签到成功,本次签到领取${number}MB`);
msg = `签到成功,本次签到领取${number}MB`;
} else {
console.log(`签到失败,${res.data.message}!`);
msg = "签到失败";
}
} catch (error) {
console.log(error.data);
msg = "签到接口请求失败";
}
resolve("【夸克网盘】:" + msg || "正常运行了");
});
}
module.exports = quark;

View File

@@ -0,0 +1,235 @@
# Source: https://github.com/back-101/zyqinglong/blob/main/tst.py
# Raw: https://raw.githubusercontent.com/back-101/zyqinglong/main/tst.py
# Repo: back-101/zyqinglong
# Path: tst.py
# UploadedAt: 2025-11-27T10:49:43Z
# SHA256: bb3abb0a9bff29861a10318c1ea94861781faafe5dc21b2d43f5b7f65281cfaf
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
# -*- coding: utf-8 -*-
"""
塔斯汀汉堡签到脚本使用青龙notify模块
原作者https://github.com/linbailo/zyqinglong
二改https://github.com/wanvfx/zyqinglong
最后更新日期2025.6.8
功能说明:
1. 每日自动签到获取积分
2. 支持多账号管理
3. 使用青龙面板自带的notify.py模块发送通知
使用方法:
1. 添加环境变量 tst_tk_env
2. 格式:每行一个账号,格式为 token
示例:
sss113-23129-123123-123123
sss234-23129-123123-234312
"""
import os
import time
import requests
import json
import sys
from datetime import datetime
# 配置区域
DEBUG_MODE = False # 调试模式开关
MAX_RETRIES = 3 # 请求最大重试次数
# 全局通知内容
notification_list = []
# 导入青龙通知模块
try:
sys.path.append('/ql/scripts')
import notify
except ImportError:
notify = None
print("警告:未找到青龙通知模块,通知功能将不可用")
def log_debug(msg):
"""调试日志"""
if DEBUG_MODE:
print(f"[DEBUG] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}")
def log_info(msg):
"""信息日志"""
print(f"[INFO] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}")
def log_error(msg):
"""错误日志"""
print(f"[ERROR] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}")
def safe_request(method, url, **kwargs):
"""带重试机制的请求函数"""
retries = 0
while retries < MAX_RETRIES:
try:
response = requests.request(method, url, **kwargs)
if response.status_code == 200:
return response
log_error(f"请求失败: {url} 状态码: {response.status_code}")
except Exception as e:
log_error(f"请求异常: {url} 错误: {str(e)}")
retries += 1
if retries < MAX_RETRIES:
time.sleep(2 ** retries) # 指数退避
return None
def add_notification(title, content):
"""添加到通知列表"""
notification_list.append(f"{title}\n{content}")
log_info(f"已添加通知: {title}")
def send_notification():
"""使用青龙通知模块发送通知"""
if not notification_list:
log_info("无通知内容,跳过发送")
return
if notify is None:
log_error("通知模块未导入,无法发送通知")
return
content = "\n\n".join(notification_list)
try:
notify.send("塔斯汀签到脚本通知", content)
log_info("通知发送成功")
except Exception as e:
log_error(f"发送通知异常: {str(e)}")
def checkin(tk):
"""签到功能"""
# 获取动态活动ID
activityId = qdsj(tk)
# 如果动态获取失败使用计算的活动ID
if not activityId:
current_date = datetime.now()
activityId = 59 + (current_date.year - 2025) * 12 + (current_date.month - 5)
log_info(f"使用计算的活动ID: {activityId}")
url = "https://sss-web.tastientech.com/api/sign/member/signV2"
payload = {"activityId": activityId, "memberName": "", "memberPhone": ""}
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254032b) XWEB/13655",
'Content-Type': "application/json",
'xweb_xhr': "1",
'user-token': tk,
'channel': "1"
}
response = safe_request('POST', url, data=json.dumps(payload), headers=headers)
if response:
try:
data = response.json()
if data.get("code") == 200:
# 解析签到结果
if data['result']['rewardInfoList'][0].get('rewardName'):
reward = data['result']['rewardInfoList'][0]['rewardName']
else:
reward = f"{data['result']['rewardInfoList'][0]['point']}积分"
# 添加到通知
add_notification(
"签到成功",
f"账号: {tk[:10]}...\n"
f"结果: 获得 {reward}\n"
f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}"
)
return True, f"签到成功,获得: {reward}"
else:
add_notification(
"签到失败",
f"账号: {tk[:10]}...\n"
f"原因: {data.get('msg', '未知错误')}\n"
f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}"
)
return False, data.get("msg", f"签到失败: {response.text}")
except Exception as e:
add_notification(
"签到异常",
f"账号: {tk[:10]}...\n"
f"错误: {str(e)}\n"
f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}"
)
return False, f"解析签到响应异常: {str(e)}"
else:
add_notification(
"签到请求失败",
f"账号: {tk[:10]}...\n"
f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}"
)
return False, "请求失败"
def qdsj(ck):
"""获取签到活动ID"""
headers = {
'user-token': ck,
'channel': '1'
}
data = {"shopId": "", "birthday": "", "gender": 0, "nickName": None, "phone": ""}
response = safe_request('POST', 'https://sss-web.tastientech.com/api/minic/shop/intelligence/banner/c/list',
json=data, headers=headers)
if not response:
return ''
try:
dl = response.json()
activityId = ''
for i in dl['result']:
if '每日签到' in i['bannerName'] or '签到' in i['bannerName']:
qd = i['jumpPara']
activityId = json.loads(qd)['activityId']
log_info(f"获取到本月签到代码:{activityId}")
return activityId
except Exception as e:
log_error(f"解析签到活动ID异常: {str(e)}")
return ''
def filter_lines(input_string):
"""过滤有效账号行"""
lines = input_string.splitlines()
return [
line.strip()
for line in lines
if line.strip()
]
def start():
"""主启动函数"""
global notification_list
# 环境变量处理
env = os.getenv('tst_tk_env', '')
accounts = filter_lines(env)
if not accounts:
log_error("未找到有效账号配置")
add_notification("配置错误", "未找到有效账号配置请检查环境变量tst_tk_env")
return
log_info(f"===== 开始执行签到,共 {len(accounts)} 个账号 =====")
# 处理每个账号
for account in accounts:
try:
tk = account.split('|')[0].strip() # 只取token部分
log_info(f"处理账号: {tk[:10]}...")
# 签到
success, message = checkin(tk)
log_info(f"签到结果: {message}")
except Exception as e:
log_error(f"处理账号异常: {str(e)}")
# 发送所有通知
send_notification()
log_info("===== 签到执行结束 =====")
if __name__ == '__main__':
start()

View File

@@ -0,0 +1,29 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/ugsnx.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/ugsnx.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/ugsnx.js
// # UploadedAt: 2021-09-25T00:15:59Z
// # SHA256: 62534dd85b6f24116fc614bca2846afa150ea0a8351dabb0de54e53be897dbef
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const rules = {
name: "【ug爱好者】 ",
url: "http://www.ugsnx.com/forum.php?mod=guide&view=newthread&mobile=2", //用于获取formhash的链接
cookie: config.ugsnx.cookie,
formhash: 'formhash=(.+?)"', //formhash正则
verify: "有你更精彩!",
op: [{
name: "签到",
charset: "gb2312",
method: "get", //签到请求方式 get/post
url: "http://www.ugsnx.com/plugin.php?id=dsu_amupper&ppersubmit=true&nogoto=1&formhash=@formhash&mobile=2&inajax=1"
}]
};
async function ugsnx() {
const template = require("../Template");
return rules.name + await template(rules)
}
module.exports = ugsnx

View File

@@ -0,0 +1,79 @@
# Source: https://github.com/CN-Grace/QinglongScripts/blob/main/utils.py
# Raw: https://raw.githubusercontent.com/CN-Grace/QinglongScripts/main/utils.py
# Repo: CN-Grace/QinglongScripts
# Path: utils.py
# UploadedAt: 2026-05-23T15:38:06Z
# SHA256: bce11cad3d194cbf6779b4f13ce88d5838904d43fd875c9ada09b880c46d6f39
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#!/usr/bin/env python3
"""QinglongScripts 公共工具模块"""
import time
from datetime import datetime, timedelta, timezone
from typing import Optional
import requests
# 北京时间时区 (UTC+8)
_TZ_BEIJING = timezone(timedelta(hours=8))
# ---------- 时间工具 ----------
def beijing_now() -> datetime:
"""返回当前北京时间 datetime"""
return datetime.now(_TZ_BEIJING)
def beijing_time_str(fmt: str = "%Y-%m-%d %H:%M:%S") -> str:
"""返回当前北京时间字符串"""
return beijing_now().strftime(fmt)
# ---------- 日志函数 ----------
def _log(emoji: str, msg: str):
print(f"[{beijing_time_str()}] {emoji} {msg}")
def log_info(msg: str):
_log("", msg)
def log_success(msg: str):
_log("", msg)
def log_warning(msg: str):
_log("⚠️", msg)
def log_error(msg: str):
_log("", msg)
# ---------- HTTP 工具 ----------
def create_session(
cookie: Optional[str] = None,
user_agent: Optional[str] = None,
extra_headers: Optional[dict] = None,
) -> requests.Session:
"""创建带可选 Cookie 和自定义 Headers 的 requests.Session"""
session = requests.Session()
session.headers.update({
"User-Agent": user_agent or (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"
),
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Connection": "keep-alive",
})
if extra_headers:
session.headers.update(extra_headers)
if cookie:
cookie_dict = {
item.split("=")[0]: item.split("=")[1]
for item in cookie.split("; ") if "=" in item
}
requests.utils.add_dict_to_cookiejar(session.cookies, cookie_dict)
return session

View File

@@ -0,0 +1,72 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/voapi.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/voapi.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/voapi.js
// # UploadedAt: 2025-10-31T06:24:35Z
// # SHA256: d60b3048fdc5bac872cc8f9e41e632cc2fe45ebc884f6f0966218fa1716e8b7f
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require('axios');
async function voapi() {
let result = '【voapi】'; // 初始化结果字符串
try {
// 从 config 中读取 token
const token = config.voapi.token;
if (!token) {
const errorMsg = `${result}-未找到有效的token配置`;
console.log(errorMsg);
// 确保返回字符串
return String(errorMsg);
}
console.log(token);
// 设置请求头
const headers = {
'Authorization': token, // 直接使用配置中的完整 token 值
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36'
};
// 发送 POST 请求
const response = await axios.post('https://demo.voapi.top/api/check_in', {}, { headers });
// 处理响应 - 根据实际返回结构优化
// 成功响应示例: {"code":0,"msg":"签到成功","data":{"checkin_days":1}}
if (response.data && response.data.code === 0) {
const msg = response.data.msg || '签到成功';
// 尝试从 data 中提取更多信息,例如连续签到天数
let extraInfo = '';
if (response.data.data) {
if (response.data.data.checkin_days !== undefined) {
extraInfo += `,连续签到 ${response.data.data.checkin_days}`;
}
// 可以在这里添加对 data 中其他字段的处理
}
result += `${msg}${extraInfo}`;
console.log(result);
} else {
// 失败响应示例: {"code":1,"msg":"今天已经签到过了"}
const msg = response.data.msg || response.data.message || '未知错误';
result += `签到失败: ${msg}`;
console.log(result);
}
} catch (error) {
console.error('【voapi】签到请求失败:', error.message);
result += `签到请求失败: ${error.message}`;
// 异常时,返回的结果字符串会包含 "失败" 或 "出错",这会匹配 checkbox.js 中的单独推送条件
} finally {
// 在 finally 块中确保返回值是字符串类型
// 这可以防止任何意外的非字符串返回值导致主程序出错
const finalResult = String(result);
// console.log('Final result type:', typeof finalResult, 'Value:', finalResult); // 调试用
return finalResult;
}
}
// 确保模块导出的是一个函数
module.exports = voapi;

View File

@@ -0,0 +1,33 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/zbwx.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/zbwx.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/zbwx.js
// # UploadedAt: 2021-09-30T00:56:04Z
// # SHA256: f0d29096de088207cfb49e6ec77162969498bc2d4c07f762a36cc65c46aa6468
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const axios = require("axios");
function task() {
return new Promise(async (resolve) => {
try {
let cookie = config.zbwx.cookie;
let url = "http://api.wenxue.mgtv.com/user/benefits/merge?cpsOpid=zb_xm&_filterData=1&device_id=c3ad60274fc24dea&channel=0&_versions=1260&merchant=zb_xm&Guid=48c5d293-6a72-461a-9cd5-cacc4789b19f&ua=Mozilla%2F5.0%20(Linux%3B%20Android%209%3B%20MI%206%20Build%2FPKQ1-wesley_iui-19.07.13%3B%20wv)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Version%2F4.0%20Chrome%2F74.0.3729.136%20Mobile%20Safari%2F537.36&platform=2&manufacturer=Xiaomi&clientType=1&width=1080&appKey=7283695590&model=MI%206&cpsSource=0&brand=Xiaomi&subapp=0&youthModel=0&height=1920&path=%2Fuser%2Fbenefits%2Fmerge&timestamp=1632355285136&sn=392a955a1842912262f01a84af983dd2";
let res = await axios.get(url, { headers: { cookie: cookie } });
if (res.data.data.signInfo) {
msg = `签到成功✅本月累计签到${res.data.data.signInfo.sign.m_num}`;
} else {
msg = res.data.error;
}
console.log(msg);
} catch (err) {
msg = "签到接口请求出错";
console.log(err);
}
resolve("【瞻彼文学】:" + msg + "\n当月累计签到达到7、14、21、满签时可获得额外奖励\n请自行手动领取");
});
}
//task()
module.exports = task;

View File

@@ -0,0 +1,254 @@
# Source: https://github.com/back-101/zyqinglong/blob/main/tclx.py
# Raw: https://raw.githubusercontent.com/back-101/zyqinglong/main/tclx.py
# Repo: back-101/zyqinglong
# Path: tclx.py
# UploadedAt: 2025-11-29T06:56:58Z
# SHA256: b49c33dc10adf577eb8b1809d98ceeddc3a58a11676c70eb65a040f3d76c9035
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
# -*- coding=UTF-8 -*-
# @Project QL_TimingScript
# @fileName tclx.py
# @author Echo
# @EditTime 2025/3/14
# cron: 0 0 9 * * *
# const $ = new Env('同程旅游');
"""
开启抓包进入app 进入领福利界面点击签到查看https://app.17u.cn/welfarecenter/index/signIndex请求头
提取变量: apptoken、device
变量格式: phone#apptoken#device多个账号用@隔开
"""
import asyncio
import time
from datetime import datetime
import httpx
from fn_print import fn_print
from get_env import get_env
from sendNotify import send_notification_message_collection
tc_cookies = get_env("tc_cookie", "@")
class Tclx:
def __init__(self, cookie):
self.client = httpx.AsyncClient(base_url="https://app.17u.cn/welfarecenter",
verify=False,
timeout=60)
self.phone = cookie.split("#")[0]
self.apptoken = cookie.split("#")[1]
self.device = cookie.split("#")[2]
self.headers = {
'accept': 'application/json, text/plain, */*',
'phone': self.phone,
'channel': '1',
'apptoken': self.apptoken,
'sec-fetch-site': 'same-site',
'accept-language': 'zh-CN,zh-Hans;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'sec-fetch-mode': 'cors',
'origin': 'https://m.17u.cn',
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TcTravel/11.0.0 tctype/wk',
'referer': 'https://m.17u.cn/',
# 'content-length': str(len(payload_str.encode('utf-8'))),
'device': self.device,
'sec-fetch-dest': 'empty'
}
@staticmethod
async def get_today_date():
return datetime.now().strftime('%Y-%m-%d')
async def sign_in(self):
try:
response = await self.client.post(
url="/index/signIndex",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - token失效了请更新")
return None
else:
today_sign = data['data']['todaySign']
mileage = data['data']['mileageBalance']['mileage']
fn_print(f"用户【{self.phone}】 - 今日{'' if today_sign else ''}签到,当前剩余里程{mileage}")
return today_sign
except Exception as e:
fn_print(f"用户【{self.phone}】 - 签到请求异常!{e}")
fn_print(response.text)
return None
async def do_sign_in(self):
today_date = await self.get_today_date()
try:
response = await self.client.post(
url="/index/sign",
headers=self.headers,
json={"type": 1, "day": today_date}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 签到失败了,尝试获取任务列表")
return False
else:
fn_print(f"用户【{self.phone}】 - 签到成功!开始获取任务列表")
return True
except Exception as e:
fn_print(f"用户【{self.phone}】 - 执行签到请求异常!{e}")
fn_print(response.text)
return False
async def get_task_list(self):
try:
response = await self.client.post(
url="/task/taskList?version=11.0.7",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 获取任务列表失败了")
return None
else:
tasks = []
for task in data['data']:
if task['state'] == 1 and task['browserTime'] != 0:
tasks.append(
{
'taskCode': task['taskCode'],
'title': task['title'],
'browserTime': task['browserTime']
}
)
return tasks
except Exception as e:
fn_print(f"用户【{self.phone}】 - 获取任务列表请求异常!{e}")
fn_print(response.text)
return None
async def perform_tasks(self, task_code):
try:
response = await self.client.post(
url="/task/start",
headers=self.headers,
json={"taskCode": task_code}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 执行任务【{task_code}】失败了,跳过当前任务")
return None
else:
task_id = data['data']
return task_id
except Exception as e:
fn_print(f"用户【{self.phone}】 - 执行任务【{task_code}】请求异常!{e}")
fn_print(response.text)
return None
async def finsh_task(self, task_id):
max_retry = 3 # 最大重试次数
retry_delay = 2 # 重试间隔时间(秒)
for attempt in range(max_retry):
try:
response = await self.client.post(
url="/task/finish",
headers=self.headers,
json={"id": task_id}
)
data = response.json()
if data['code'] == 2200:
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】成功!开始领取奖励")
return True
if attempt < max_retry - 1:
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】失败了,尝试重新提交(第{attempt + 1}次重试。。)")
await asyncio.sleep(retry_delay * (attempt + 1))
continue
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】最终失败,跳过当前任务")
return False
except Exception as e:
error_msg = f"用户【{self.phone}】 - 完成任务【{task_id}】请求异常!{e}"
if 'response' in locals():
error_msg += f"\n{response.text}"
fn_print(error_msg)
if attempt == max_retry - 1:
return False
await asyncio.sleep(retry_delay * (attempt + 1))
async def receive_reward(self, task_id):
try:
response = await self.client.post(
url="/task/receive",
headers=self.headers,
json={"id": task_id}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 领取签到奖励失败了, 请尝试手动领取")
else:
fn_print(f"用户【{self.phone}】 - 领取签到奖励成功!开始下一个任务")
except Exception as e:
fn_print(f"用户【{self.phone}】 - 领取签到奖励请求异常!{e}")
fn_print(response.text)
async def get_mileage_info(self):
try:
response = await self.client.post(
url="/index/signIndex",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 获取积分信息失败了")
return None
else:
cycle_sign_num = data['data']['cycleSighNum']
continuous_history = data['data']['continuousHistory']
mileage = data['data']['mileageBalance']['mileage']
today_mileage = data['data']['mileageBalance']['todayMileage']
fn_print(
f"用户【{self.phone}】 - 本月签到{cycle_sign_num}天,连续签到{continuous_history}天,今日共获取{today_mileage}里程,当前剩余里程{mileage}")
except Exception as e:
fn_print(f"用户【{self.phone}】 - 获取积分信息请求异常!{e}")
fn_print(response.text)
return None
async def run(self):
today_sign = await self.sign_in()
if today_sign is None:
return
if today_sign:
fn_print(f"用户【{self.phone}】 - 今日已签到,开始获取任务列表")
else:
if await self.do_sign_in():
fn_print(f"用户【{self.phone}】 - 签到成功,开始获取任务列表")
tasks = await self.get_task_list()
if tasks:
for task in tasks:
task_code = task['taskCode']
title = task['title']
browser_time = task['browserTime']
fn_print(f"用户【{self.phone}】 - 开始做任务【{title}】,需要浏览{browser_time}")
task_id = await self.perform_tasks(task_code)
if task_id:
await asyncio.sleep(browser_time)
if await self.finsh_task(task_id):
await self.receive_reward(task_id)
await self.get_mileage_info()
async def main():
tasks = []
for cookie in tc_cookies:
tclx = Tclx(cookie)
tasks.append(tclx.run())
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())
send_notification_message_collection(f"同程旅行签到通知 - {datetime.now().strftime('%Y/%m/%d')}")

View File

@@ -0,0 +1,42 @@
// # Source: https://github.com/Wenmoux/checkbox/blob/master/scripts/hsy.js
// # Raw: https://raw.githubusercontent.com/Wenmoux/checkbox/master/scripts/hsy.js
// # Repo: Wenmoux/checkbox
// # Path: scripts/hsy.js
// # UploadedAt: 2022-02-22T20:29:28Z
// # SHA256: e824ae285da7e27d573d4a6dae4a328df6fde28e563cbe905df3dd88e126e272
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
const rules = {
name: "【好书友论坛】: ",
url: "http://www.58shuyou.com/plugin.php?id=k_misign:sign", //用于获取formhash的链接
cookie: config.hsy.cookie,
ua: "pc",
formhash: 'formhash=(.+?)\\"', //formhash正则
verify: "你还没登录,确定登录", //验证cookie状态
op: [{
name: "签到",
ua: "pc",
charset: "gb2312",
method: "get", //签到请求方式 get/post
url: "http://www.58shuyou.com/plugin.php?id=k_misign:sign&operation=qiandao&format=text&formhash=@formhash", //签到链接
},
{
name: "在线奖励",
ua: "pc",
charset: "gb2312",
method: "get", //签到请求方式 get/post
url: "http://www.58shuyou.com/plugin.php?id=gonline:index&action=award&formhash=@formhash", //签到链接
reg2: "没", //重复签到判断
reg3: "parent", //签到成功判断
info: "\\(\\'(.+?)\\'", //签到成功返回信息
}
]
};
async function hsy() {
const template = require("../Template");
return rules.name + await template(rules)
}
module.exports = hsy

View File

@@ -0,0 +1,224 @@
# 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()

View File

@@ -0,0 +1,353 @@
# Source: https://github.com/Small-tailqwq/ql_script/blob/master/kuro/ql_kuro.py
# Raw: https://raw.githubusercontent.com/Small-tailqwq/ql_script/master/kuro/ql_kuro.py
# Repo: Small-tailqwq/ql_script
# Path: kuro/ql_kuro.py
# UploadedAt: 2026-05-23T15:50:58Z
# SHA256: 46013225510794598730a4bad8387ebfbcee626a372ce9a1e605ff7acbf18bac
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
# -*- coding: utf-8 -*-
"""
cron: 30 8 * * *
new Env('库街区自动签到');
基于 mxyooR/Kuro-autosignin (GPL-3.0) 精简适配青龙单文件版
上游版本: a334796 (2026-04-21)
最后更新: 2026-05-23 09:00 (UTC+8)
"""
import datetime
import json
import logging
import os
import random
import socket
import time
import uuid
from typing import Dict, List, Optional
import requests
try:
from sendNotify import send
except Exception:
try:
from notify import send
except Exception:
send = None
TIMEOUT = 30
GAME_WUWA_ID = "3"
GAME_PGR_ID = "2"
SERVER_WUWA = "76402e5b20be2c39f095a152090afddc"
SERVER_PGR = "1000"
MAX_RETRIES = 3
class API:
USER_MINE = "https://api.kurobbs.com/user/mineV2"
USER_SIGN_IN = "https://api.kurobbs.com/user/signIn"
USER_ROLE_LIST = "https://api.kurobbs.com/user/role/findRoleList"
FORUM_LIST = "https://api.kurobbs.com/forum/list"
FORUM_POST_DETAIL = "https://api.kurobbs.com/forum/getPostDetail"
FORUM_LIKE = "https://api.kurobbs.com/forum/like"
TASK_PROCESS = "https://api.kurobbs.com/encourage/level/getTaskProcess"
TASK_SHARE = "https://api.kurobbs.com/encourage/level/shareTask"
GAME_SIGN_IN = "https://api.kurobbs.com/encourage/signIn/v2"
GAME_SIGN_RECORD = "https://api.kurobbs.com/encourage/signIn/queryRecordV2"
def get_ip_address() -> str:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(("8.8.8.8", 80))
return s.getsockname()[0]
except socket.error:
return "127.0.0.1"
finally:
s.close()
class KuroSigner:
def __init__(self, token_data: Dict[str, str]):
self.token = token_data['token']
self.note = token_data.get('note', '未命名账号')
self.ip = get_ip_address()
self.devcode = str(uuid.uuid4())
self.distinct_id = str(uuid.uuid4())
self.session = requests.Session()
self.user_id = None
self.wuwa_role_id = None
self.pgr_role_id = None
self.messages = []
self.success = True
def _log(self, msg: str):
logging.info(f"[{self.note}] {msg}")
self.messages.append(msg)
def _req(self, url: str, method: str = 'POST', data: Optional[dict] = None, req_type: str = 'bbs') -> dict:
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh-Hans;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Host": "api.kurobbs.com",
"source": "ios",
}
if req_type == 'bbs':
headers.update({
"lang": "zh-Hans",
"User-Agent": "KuroGameBox/48 CFNetwork/1492.0.1 Darwin/23.3.0",
"channelId": "1",
"channel": "appstore",
"version": "2.2.0",
"model": "iPhone15,2",
"osVersion": "17.3",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"Cookie": f"user_token={self.token}",
"Ip": self.ip,
"distinct_id": self.distinct_id,
"devCode": self.devcode,
"token": self.token,
})
elif req_type == 'game':
headers.update({
"Accept": "application/json, text/plain, */*",
"Sec-Fetch-Site": "same-site",
"source": "ios",
"Sec-Fetch-Mode": "cors",
"Origin": "https://web-static.kurobbs.com",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) KuroGameBox/2.2.0",
"devCode": f"{self.ip}, Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) KuroGameBox/2.2.0",
"token": self.token,
})
elif req_type == 'user_info':
headers.update({
"osversion": "Android",
"countrycode": "CN",
"ip": self.ip,
"model": "2211133C",
"source": "android",
"lang": "zh-Hans",
"version": "1.0.9",
"versioncode": "1090",
"content-type": "application/x-www-form-urlencoded",
"user-agent": "okhttp/3.10.0",
"devcode": self.devcode,
"distinct_id": self.distinct_id,
"token": self.token,
})
try:
if method == 'POST':
resp = self.session.post(url, headers=headers, data=data, timeout=TIMEOUT).json()
else:
resp = self.session.get(url, headers=headers, timeout=TIMEOUT).json()
return resp
except Exception as e:
return {"code": -1, "msg": f"请求异常: {str(e)}"}
def init_user_data(self) -> bool:
res = self._req(API.USER_MINE, req_type='user_info')
if res.get('code') != 200:
self._log(f"获取用户信息失败或Token已过期: {res.get('msg')}")
self.success = False
return False
self.user_id = res['data']['mine']['userId']
res_wuwa = self._req(API.USER_ROLE_LIST, data={"gameId": GAME_WUWA_ID}, req_type='user_info')
if res_wuwa.get('code') == 200 and res_wuwa.get('data'):
self.wuwa_role_id = res_wuwa['data'][0].get('roleId')
res_pgr = self._req(API.USER_ROLE_LIST, data={"gameId": GAME_PGR_ID}, req_type='user_info')
if res_pgr.get('code') == 200 and res_pgr.get('data'):
self.pgr_role_id = res_pgr['data'][0].get('roleId')
return True
def _get_sign_reward(self, game_name: str, game_id: str, server_id: str, role_id: str) -> Optional[str]:
try:
data = {
"gameId": game_id,
"serverId": server_id,
"roleId": role_id,
"userId": self.user_id,
}
res = self._req(API.GAME_SIGN_RECORD, data=data, req_type='game')
if res.get('code') == 200 and res.get('data'):
if isinstance(res['data'], list) and len(res['data']) > 0:
return res['data'][0].get('goodsName')
return None
except Exception:
return None
def game_sign(self):
month = datetime.datetime.now().strftime("%m")
def _do_sign(game_name, game_id, server_id, role_id):
if not role_id:
self._log(f"[{game_name}] 未找到角色ID跳过签到")
return
data = {
"gameId": game_id,
"serverId": server_id,
"roleId": role_id,
"userId": self.user_id,
"reqMonth": month,
}
res = self._req(API.GAME_SIGN_IN, data=data, req_type='game')
code = res.get('code')
if code == 200:
reward = self._get_sign_reward(game_name, game_id, server_id, role_id)
msg = f"[{game_name}] 签到成功"
if reward:
msg += f",奖励: {reward}"
self._log(msg)
elif code == 1511:
reward = self._get_sign_reward(game_name, game_id, server_id, role_id)
msg = f"[{game_name}] 今日已签到"
if reward:
msg += f",奖励: {reward}"
self._log(msg)
elif code == 1513:
self._log(f"[{game_name}] 签到失败:用户信息异常,即将禁用该账号")
self.success = False
elif code == 220:
self._log(f"[{game_name}] 签到失败:登录已过期,请重新登录")
self.success = False
else:
self._log(f"[{game_name}] 签到失败: {res.get('msg', '未知错误')} (code={code})")
raise Exception(f"{game_name} 签到失败: {res.get('msg', '未知错误')}")
_do_sign("鸣潮", GAME_WUWA_ID, SERVER_WUWA, self.wuwa_role_id)
time.sleep(1)
_do_sign("战双", GAME_PGR_ID, SERVER_PGR, self.pgr_role_id)
def forum_tasks(self):
res = self._req(API.USER_SIGN_IN, data={"gameId": "2"}, req_type='bbs')
if res.get('code') == 200:
self._log("论坛签到成功")
time.sleep(1)
res_tasks = self._req(API.TASK_PROCESS, data={"gameId": "0"}, req_type='bbs')
if res_tasks.get('code') != 200:
self._log("获取每日任务列表失败跳过")
return
tasks = res_tasks.get('data', {}).get('dailyTask', [])
tasks_map = {t.get('remark'): t.get('process') for t in tasks}
posts = []
if tasks_map.get("浏览3篇帖子", 1) == 0 or tasks_map.get("点赞5次", 1) == 0:
res_posts = self._req(API.FORUM_LIST, data={"forumId": "9", "gameId": "3", "pageIndex": "1", "pageSize": "20", "searchType": "3", "timeType": "0"}, req_type='bbs')
if res_posts.get('code') == 200:
posts = res_posts.get('data', {}).get('postList', [])
if tasks_map.get("浏览3篇帖子", 1) == 0 and posts:
view_count = 0
for p in posts[:3]:
self._req(API.FORUM_POST_DETAIL, data={"isOnlyPublisher": "0", "postId": p['postId'], "showOrderTyper": "2"}, req_type='bbs')
view_count += 1
time.sleep(random.uniform(1, 2))
self._log(f"完成浏览帖子任务 ({view_count}/3)")
if tasks_map.get("点赞5次", 1) == 0 and posts:
like_count = 0
for p in posts[:5]:
self._req(API.FORUM_LIKE, data={"forumId": 11, "gameId": 3, "likeType": 1, "operateType": 1, "postCommentId": "", "postCommentReplyId": "", "postId": p['postId'], "postType": 1, "toUserId": p['userId']}, req_type='bbs')
like_count += 1
time.sleep(random.uniform(1, 2))
self._log(f"完成点赞帖子任务 ({like_count}/5)")
if tasks_map.get("分享1次帖子", 1) == 0:
self._req(API.TASK_SHARE, data={"gameId": 3}, req_type='bbs')
self._log("完成分享帖子任务 (1/1)")
def run(self):
for attempt in range(MAX_RETRIES):
try:
if attempt > 0:
delay = random.uniform(5, 15)
self._log(f"将在 {delay:.1f} 秒后进行第 {attempt + 1}/{MAX_RETRIES} 次重试...")
time.sleep(delay)
if self.init_user_data():
self.game_sign()
self.forum_tasks()
if not self.success:
raise Exception("签到执行失败")
break
except Exception as e:
self._log(f"执行异常: {str(e)}")
self.success = False
if attempt < MAX_RETRIES - 1:
continue
else:
self._log(f"重试 {MAX_RETRIES} 次后仍然失败,放弃签到")
return "\n".join(self.messages)
def get_tokens() -> List[Dict[str, str]]:
raw = os.environ.get("KURO_TOKEN", "").strip()
if not raw:
return []
raw = raw.replace('&', '\n').replace(',', '\n')
token_list = []
for line in raw.split('\n'):
line = line.strip()
if not line:
continue
parts = line.split('#', 1)
token_val = parts[0].strip()
note = parts[1].strip() if len(parts) > 1 else f"账号{len(token_list) + 1}"
if token_val:
token_list.append({'token': token_val, 'note': note})
return token_list
def main():
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
tokens = get_tokens()
if not tokens:
logging.error("未找到 Token请在环境变量中设置 'KURO_TOKEN'")
return
logging.info(f"✅ 检测到 {len(tokens)} 个账号,开始执行库街区签到...\n" + "-" * 30)
notify_content = []
for token_data in tokens:
signer = KuroSigner(token_data)
result_msg = signer.run()
status_icon = "" if signer.success else ""
header = f"{signer.note}{status_icon}"
notify_content.append(header)
notify_content.append(result_msg)
notify_content.append("-" * 20)
final_content = "\n".join(notify_content)
logging.info(f"\n{final_content}")
if send:
send("库街区签到", final_content)
if __name__ == '__main__':
main()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,694 @@
# Source: https://github.com/back-101/zyqinglong/blob/main/%E6%BB%B4%E6%BB%B4%E5%87%BA%E8%A1%8C.py
# Raw: https://raw.githubusercontent.com/back-101/zyqinglong/main/滴滴出行.py
# Repo: back-101/zyqinglong
# Path: 滴滴出行.py
# UploadedAt: 2025-11-29T06:56:58Z
# SHA256: e0d2a0c873bdcaa9f9bb7f078021468bed339ad22e6e04b4db7003797176362b
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
# -*- coding=UTF-8 -*-
# @Project QL_TimingScript
# @fileName 滴滴出行.py
# @author Echo
# @EditTime 2024/11/27
# const $ = new Env('滴滴出行')
# cron: "0 8,14,17 * * *"
"""
DD_TOKENS 滴滴出行进入福利页面抓token值
自行配经纬度和城市id
"""
import asyncio
import datetime
import httpx
from fn_print import fn_print
from get_env import get_env
from sendNotify import send_notification_message_collection
MONTH_SIGNAL = False # 月月领券
dd_tokens = get_env("DD_TOKENS", "&")
class DiDi:
LAT = "30.707130422009786" # 纬度
LNG = "104.09652654810503" # 经度
CITY_ID = 17 # 城市id
def __init__(self, token, city_id=CITY_ID, lat=LAT, lng=LNG):
self.user_phone = None
self.client = httpx.AsyncClient(verify=False)
self.token = token
self.city_id = city_id
self.lat = lat
self.lng = lng
self.today = datetime.datetime.now().strftime("%Y-%m-%d")
self.tomorrow = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
self.activity_id_today = 0
self.task_id_today = 0
self.status_today = 0
self.activity_id_tomorrow = 0
self.status_tomorrow = 0
self.count_tomorrow = 0
async def get_user_info(self):
"""
获取用户信息
:return:
"""
get_user_info_response = await self.client.get(
url=f"https://common.diditaxi.com.cn/passenger/getprofile?token={self.token}"
)
get_user_info_data = get_user_info_response.json()
self.user_phone = get_user_info_data.get("phone")
async def get_welfare_payments(self):
"""
获取福利金
:return:
"""
get_weibo_payments_response = await self.client.get(
url="https://rewards.xiaojukeji.com/loyalty_credit/bonus/getWelfareUsage4Wallet",
params={
"token": self.token,
"city_id": self.city_id
}
)
if get_weibo_payments_response.status_code == 200:
get_info_data = get_weibo_payments_response.json()
if "token error" in get_info_data.get("errmsg") and get_info_data.get("errno") == 20001:
fn_print("token已过期请重新获取token")
send_notification_message_collection(
"滴滴出行通知 - {}".format(datetime.datetime.now().strftime("%Y/%m/%d")))
exit()
return get_info_data['data']['balance']
else:
fn_print(f"===获取用户福利金请求异常, {get_weibo_payments_response.text}===")
async def sign_in(self):
"""
签到
:return:
"""
sign_in_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/action/dailySign",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": '{}'
}
)
if sign_in_response.status_code == 200:
sign_in_data = sign_in_response.json()
fn_print(sign_in_data)
if sign_in_data["errno"] == 0:
subsidy_amount = sign_in_data["data"]["subsidy_state"]["subsidy_amount"]
fn_print(f"用户【{0}】, ===今日签到成功,获得{subsidy_amount}福利金🪙🪙🪙===")
return
elif sign_in_data["errno"] == 40009:
fn_print(f"用户【{0}】, ===今日福利金已签到,无需重复签到!===")
return
else:
fn_print(f"用户【{0}】, ===签到失败, {sign_in_data}===")
else:
fn_print(f"===签到请求异常, {sign_in_response}===")
async def get_carve_up_action_id(self):
"""
获取瓜分活动的ID
:return:
"""
get_carve_up_action_id_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/home/init/v2",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": '{}'
}
)
if get_carve_up_action_id_response.status_code == 200:
get_carve_up_action_id_data = get_carve_up_action_id_response.json()
if get_carve_up_action_id_data.get("errno") == 0:
divide_data = get_carve_up_action_id_data["data"]["divide_data"]["divide"]
today_data = divide_data.get(self.today)
self.activity_id_today, self.task_id_today, self.status_today = today_data["activity_id"], today_data[
"task_id"], today_data["status"]
tomorrow_data = divide_data.get(self.tomorrow)
self.activity_id_tomorrow, self.status_tomorrow, self.count_tomorrow = tomorrow_data["activity_id"], \
tomorrow_data["status"], tomorrow_data["button"]["count"]
return True
else:
fn_print(f"===获取瓜分活动ID请求异常, {get_carve_up_action_id_response.text}===")
async def apply_carve_up_action(self):
"""
报名明天的瓜分福利金
:return:
"""
apply_carve_up_action_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/action/joinDivide",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": '{}',
"activity_id": self.activity_id_tomorrow,
"count": self.count_tomorrow,
"type": "ut_bonus"
}
)
if apply_carve_up_action_response.status_code == 200:
apply_carve_up_action_data = apply_carve_up_action_response.json()
if apply_carve_up_action_data.get("errno") == 0:
if apply_carve_up_action_data.get("data", {}).get("result"):
fn_print(f"用户【{self.user_phone}】, ===报名明日瓜分福利金成功🎉===")
return
elif apply_carve_up_action_data.get("errno") == 1003:
fn_print(f"用户【{self.user_phone}】, ===今日瓜分福利金已报名,无需重复报名!===")
return
else:
fn_print(f"用户【{self.user_phone}】, ===报名明日瓜分福利金失败, {apply_carve_up_action_data}===")
return
else:
fn_print(f"===报名明日瓜分福利金请求异常, {apply_carve_up_action_response.text}===")
async def complete_carve_up_action(self):
"""
完成今天的瓜分福利金14点前完成
:return:
"""
complete_carve_up_action_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/action/divideReward",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": '{}',
"activity_id": self.activity_id_today,
"task_id": self.task_id_today
}
)
if complete_carve_up_action_response.status_code == 200:
complete_carve_up_action_data = complete_carve_up_action_response.json()
if complete_carve_up_action_data.get("errno") == 0:
if complete_carve_up_action_data.get("data", {}).get("result"):
fn_print(f"用户【{self.user_phone}】, ===完成今日打卡瓜分福利金成功🎉===")
return
elif complete_carve_up_action_data.get("errno") == 1003:
fn_print(f"用户【{self.user_phone}】, ===今日瓜分福利金已完成,无需重复完成!===")
return
else:
fn_print(f"用户【{self.user_phone}】, ===完成今日瓜分福利金失败, {complete_carve_up_action_data}===")
return
else:
fn_print(f"===完成今日瓜分福利金请求异常, {complete_carve_up_action_response.text}===")
async def inquire_benefits_details(self):
"""
查询权益详情
:return:
"""
benefits_details_response = await self.client.get(
url="https://member.xiaojukeji.com/dmember/h5/privilegeLists",
params={
"token": self.token,
"city_id": self.city_id
}
)
if benefits_details_response.status_code == 200:
benefits_details_data = benefits_details_response.json()
if benefits_details_data.get("errno") == 0:
privileges_list = benefits_details_data.get('data', {}).get('privileges', []) # 我的权益列表
return privileges_list
else:
fn_print(f"===查询权益详情请求异常, {benefits_details_response.text}===")
async def receive_level_gift_week(self):
"""
领取周周领券活动的优惠券
:return:
"""
privileges_list = await self.inquire_benefits_details()
for privilege in privileges_list:
if privilege.get('name') not in ['周周领券'] or privilege.get('level_gift') is None:
continue
coupons_list = privilege.get('level_gift', {}).get('coupons', [])
for coupon in coupons_list:
status = coupon.get("status") # 0: 未领取 1: 已使用 2: 未使用
if status != 0:
continue
batch_id = coupon.get("batch_id")
fn_print(f"用户【“{self.user_phone}】, ===开始领取{coupon.get('remark')}{coupon.get('coupon_title')}===")
receive_level_gift_response = await self.client.get(
url=f"https://member.xiaojukeji.com/dmember/h5/receiveLevelGift?xbiz=&prod_key=wyc-vip-level&xpsid=&dchn=&xoid=&xenv=passenger&xspm_from=&xpsid_root=&xpsid_from=&xpsid_share=&token={self.token}&batch_id={batch_id}&env={{}}&gift_type=1&city_id={self.city_id}"
)
if receive_level_gift_response.status_code == 200:
receive_level_gift_data = receive_level_gift_response.json()
if receive_level_gift_data.get("errno") == 0:
fn_print(f"用户【“{self.user_phone}】, ===领取成功🎉===")
continue
else:
fn_print(f"用户【“{self.user_phone}】, ===领取失败, {receive_level_gift_data}===")
else:
fn_print(f"===领取周周领券请求异常, {receive_level_gift_response.text}===")
async def receive_level_gift_month(self):
"""
领取月月领券活动的优惠券
:return:
"""
if not MONTH_SIGNAL:
fn_print(f"用户【“{self.user_phone}】, ===月月领券活动未开启===")
return
privileges_list = await self.inquire_benefits_details()
for privilege in privileges_list:
if privilege.get('name') not in ['月月领券'] or privilege.get('level_gift') is None:
continue
coupons_list = privilege.get('level_gift', {}).get('coupons', [])
for coupon in coupons_list:
status = coupon.get("status") # 0: 未领取 1: 已使用 2: 未使用
if status != 0:
continue
batch_id = coupon.get("batch_id")
fn_print(f"用户【“{self.user_phone}】, ===开始领取{coupon.get('remark')}{coupon.get('coupon_title')}===")
receive_level_gift_response = await self.client.get(
url=f"https://member.xiaojukeji.com/dmember/h5/receiveLevelGift?xbiz=&prod_key=wyc-vip-level&xpsid=&dchn=&xoid=&xenv=passenger&xspm_from=&xpsid_root=&xpsid_from=&xpsid_share=&token={self.token}&batch_id={batch_id}&env={{}}&gift_type=1&city_id={self.city_id}"
)
if receive_level_gift_response.status_code == 200:
receive_level_gift_data = receive_level_gift_response.json()
if receive_level_gift_data.get("errno") == 0:
fn_print(f"用户【“{self.user_phone}】, ===领取成功🎉===")
continue
else:
fn_print(f"用户【“{self.user_phone}】, ===领取失败, {receive_level_gift_data}===")
else:
fn_print(f"===领取月月领券请求异常, {receive_level_gift_response.text}===")
async def swell_coupon(self):
"""
膨胀周周领券活动的优惠券
:return:
"""
privileges_list = await self.inquire_benefits_details()
for privilege in privileges_list:
if privilege.get("name") in ["周周领券", "月月领券"]:
if privilege.get('level_gift') is None:
continue
coupons_list = privilege.get('level_gift', {}).get('coupons', [])
for coupon in coupons_list:
swell_status = coupon.get('swell_status') # 0代表不能膨胀1代表能膨胀,2代表已膨胀、
if swell_status == 1:
fn_print(
f"用户【“{self.user_phone}】, ===开始膨胀{coupon.get('remark')}{coupon.get('coupon_title')}===")
batch_id = coupon.get("batch_id")
coupon_id = coupon.get("coupon_id")
swell_coupon_response = await self.client.post(
url=f"https://member.xiaojukeji.com/dmember/h5/swell_coupon?city_id={self.city_id}",
json={
"token": self.token,
"batch_id": batch_id,
"coupon_id": coupon_id,
"city_id": self.city_id
}
)
if swell_coupon_response.status_code == 200:
swell_coupon_data = swell_coupon_response.json()
if swell_coupon_data.get("errno") == 0:
if swell_coupon_data.get("data", {}).get("is_swell"):
fn_print(f"用户【“{self.user_phone}】, ===膨胀成功🎉===")
continue
else:
fn_print(f"用户【“{self.user_phone}】, ===膨胀失败, {swell_coupon_data}===")
else:
fn_print(f"用户【“{self.user_phone}】, ===膨胀失败, {swell_coupon_data}===")
else:
fn_print(f"===膨胀周周领券请求异常, {swell_coupon_response.text}===")
async def receive_travel_insurance(self):
"""
领取行程意外险
:return:
"""
privileges_list = await self.inquire_benefits_details()
for privilege in privileges_list:
if privilege.get('name') == "行程意外险":
need_received = privilege.get('need_received')
if need_received == 1: # 0为未领取1为已领取
fn_print(f"用户【“{self.user_phone}】, ===已经领取过了行程意外险===")
return
elif need_received == 0:
fn_print(f"用户【“{self.user_phone}】, ===开始领取行程意外险===")
receive_travel_insurance_response = await self.client.post(
url="https://member.xiaojukeji.com/dmember/h5/bindPrivilege",
json={"token": self.token, "type": 3}
)
if receive_travel_insurance_response.status_code == 200:
receive_travel_insurance_data = receive_travel_insurance_response.json()
if receive_travel_insurance_data.get("errno") == 0:
fn_print(f"用户【“{self.user_phone}】, ===领取行程意外险成功🎉===")
else:
fn_print(
f"用户【“{self.user_phone}】, ===领取行程意外险失败, {receive_travel_insurance_data}===")
else:
fn_print(f"===领取行程意外险请求异常, {receive_travel_insurance_response.text}===")
async def receive_memberday_discount_multi(self):
"""
领取周三折上折权益
:return:
"""
privileges_list = await self.inquire_benefits_details()
for privilege in privileges_list:
if privilege.get('name') == "周三折上折":
need_received = privilege.get('need_received')
if need_received == 1: # 0为未领取1为已领取
fn_print(f"用户【“{self.user_phone}】, ===已经领取过了周三折上折===")
return
elif need_received == 0:
fn_print(f"用户【“{self.user_phone}】, ===开始领取周三折上折===")
receive_memberday_discount_multi_response = await self.client.post(
url="https://member.xiaojukeji.com/dmember/h5/receiveMemberDayDiscount",
json={"token": self.token, "privilege_type": 1}
)
if receive_memberday_discount_multi_response.status_code == 200:
receive_memberday_discount_multi_data = receive_memberday_discount_multi_response.json()
if receive_memberday_discount_multi_data.get("errno") == 0:
fn_print(f"用户【“{self.user_phone}】, ===领取周三折上折成功🎉===")
return
else:
fn_print(
f"用户【“{self.user_phone}】, ===领取周三折上折失败, {receive_memberday_discount_multi_data}===")
else:
fn_print(f"===领取周三折上折请求异常, {receive_memberday_discount_multi_response.text}===")
async def receive_wyc_order_finish(self):
"""
领取气泡奖励完单返福利金
:return:
"""
get_bubble_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/home/getBubble",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": "{}"
}
)
get_bubble_data = get_bubble_response.json()
bubble_list = get_bubble_data.get('data', {}).get('bubble_list', [])
for bubble in bubble_list:
if bubble.get('pre_content') == "完单返":
cycle_id = bubble.get('cycle_id')
reward_count = bubble.get('reward_count')
receive_wyc_order_finish_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/welfare/api/action/clickBubble",
json={
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"platform": "na",
"env": "{}",
"cycle_id": cycle_id,
"bubble_type": "wyc_order_finish"
}
)
if receive_wyc_order_finish_response.status_code == 200:
receive_wyc_order_finish_data = receive_wyc_order_finish_response.json()
if receive_wyc_order_finish_data.get("errno") == 0:
fn_print(
f"用户【“{self.user_phone}】, ===领取气泡奖励完单返福利金成功🎉, 获得{reward_count}福利金!===")
return
else:
fn_print(
f"用户【“{self.user_phone}】, ===领取气泡奖励完单返福利金失败, {receive_wyc_order_finish_data}===")
else:
fn_print(f"===领取气泡奖励完单返福利金请求异常, {receive_wyc_order_finish_response.text}===")
async def claim_coupon_check_in(self):
"""
领取天天神券签到
:return:
"""
claim_coupon_check_in_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/janitor/api/action/sign/do",
headers={'Didi-Ticket': self.token}
)
if claim_coupon_check_in_response.status_code == 200:
claim_coupon_check_in_data = claim_coupon_check_in_response.json()
if claim_coupon_check_in_data.get("errno") == 0:
current_progress = claim_coupon_check_in_data.get("data").get("current_progress")
total_progress = claim_coupon_check_in_data.get("data").get("total_progress")
fn_print(
f"用户【“{self.user_phone}】, ===领取天天神券签到成功🎉签到进度:{current_progress}/{total_progress}===")
return
else:
fn_print(f"用户【“{self.user_phone}】, ===领取天天神券签到失败, {claim_coupon_check_in_data}===")
else:
fn_print(f"===领取天天神券签到请求异常, {claim_coupon_check_in_response.text}===")
async def claim_coupon_lottery(self):
"""
天天神券抽奖
:return:
"""
get_draw_times_response = await self.client.post(
url="https://api.didi.cn/webx/chapter/product/init",
headers={'Didi-Ticket': self.token},
json={
"dchn": "dKlklLa",
"args": {
"runtime_args":
{
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"env": {},
"platform": "na",
"Didi-Ticket": self.token,
}
}
}
)
if get_draw_times_response.status_code == 200:
get_draw_times_data = get_draw_times_response.json()
lottery_chance = get_draw_times_data.get('data').get('conf').get('strategy_data').get('data').get(
'lottery_chance')
act_id = get_draw_times_data.get('data').get('conf').get('ext').get('act_conf').get('act_id')
for _ in range(lottery_chance):
lucky_draw_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/janitor/api/action/lottery/doLottery",
headers={'Didi-Ticket': self.token},
json={
"act_id": act_id
}
)
lucky_draw_data = lucky_draw_response.json()
if lucky_draw_data.get("errno") == 0:
fn_print(
f"用户【“{self.user_phone}】, ===抽奖成功🎉, 获得{lucky_draw_data.get('data').get('prize_data')[0].get('name')}===")
await asyncio.sleep(5)
continue
else:
fn_print(f"用户【“{self.user_phone}】, ===天天神券抽奖失败, {lucky_draw_data}===")
return
else:
fn_print(f"===天天神券获取抽奖次数请求异常, {get_draw_times_response.text}===")
async def run_scratch(self):
"""
运行刮刮乐
:return:
"""
if await self.get_carve_up_action_id():
fn_print(f"用户【“{self.user_phone}】, ===开始完成今日瓜分活动===")
if self.status_today == 2:
await self.complete_carve_up_action()
elif self.status_today == 3:
fn_print(f"用户【“{self.user_phone}】, ===今日瓜分活动已完成,无需重复完成!===")
elif self.status_today == 4:
fn_print(f"用户【“{self.user_phone}】, ===今日已领取瓜分活动奖励!===")
else:
fn_print(f"用户【“{self.user_phone}】, ===今日瓜分活动完成失败!肯昨日未报名!===")
fn_print(f"用户【“{self.user_phone}】, ===开始报名明日瓜分活动===")
if self.status_tomorrow == 1:
await self.apply_carve_up_action()
elif self.status_tomorrow == 2:
fn_print(f"用户【“{self.user_phone}】, ===明日瓜分活动已报名,无需重复报名!===")
else:
fn_print(f"用户【“{self.user_phone}】, ===明日瓜分活动报名失败!===")
async def today_pick(self):
"""
每日精选
:return:
"""
get_batch_config_response = await self.client.post(
url="https://api.didi.cn/webx/chapter/page/batch/config",
headers={'Didi-Ticket': self.token},
json={
"dchn": "PxJanq9",
"args": [
{"dchn": "kkXgpzO",
"prod_key": "ut-limited-seckill",
"runtime_args":
{
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"env": {},
"Didi-Ticket": self.token,
}
},
{"dchn": "gL3E8qZ",
"prod_key": "ut-support-coupon",
"runtime_args": {
"token": self.token,
"lat": self.lat,
"lng": self.lng,
"env": {},
"Didi-Ticket": self.token}
}
]
}
)
if get_batch_config_response.status_code == 200:
get_batch_config_data = get_batch_config_response.json()
activity_list = get_batch_config_data.get("data").get("conf")
for activity in activity_list:
if activity.get("dchn") == "gL3E8qZ":
fn_print(f"用户【“{self.user_phone}】, ===开始领取每日精选===")
coupons_list = activity.get("strategy_data").get("data").get("daily_coupon").get("coupons")
coupons_status_name_dict = {
'1': '可领取',
'2': '已经领取',
'4': '已抢光',
'6': '待前置条件完成'
}
for coupon_index, coupon in enumerate(coupons_list):
coupons_name = coupon.get("name")
coupons_status = coupon.get("status") # 1为可领取 2为已经领取 4为抽奖抢券
fn_print(f"==={coupon_index + 1}.券名:{coupons_name} "
f"状态:{coupons_status_name_dict.get(str(coupons_status))}===")
if coupons_status == 1:
fn_print(f"===开始领取券:{coupons_name}===")
activity_id = coupon.get("activity_id")
if coupons_name == "打车5元券":
fn_print(f"用户【{self.user_phone}】, ===【打车5元券】为分享助力才能领券不支持自动领券===")
continue
if activity_id == "10010":
fn_print(
f"用户【{self.user_phone}】, ===该券为明天在目的地栏搜“领券”必得1张快车优惠券不支持自动领取===")
continue
group_id = coupon.get("group_id")
coupon_conf_id = coupon.get("coupon_conf_id")
group_date = coupon.get("group_date")
bind_coupon_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/janitor/api/action/coupon/bind",
headers={'Didi-Ticket': self.token},
json={
'group_date': group_date,
"activity_id": activity_id,
"group_id": group_id,
"coupon_conf_id": coupon_conf_id
}
)
bind_coupon_data = bind_coupon_response.json()
if bind_coupon_data.get("errno") == 0:
fn_print(f"用户【{self.user_phone}】, ===领取成功🎉===")
await asyncio.sleep(0.5)
continue
else:
fn_print(f"用户【{self.user_phone}】, ===领取失败,{bind_coupon_data}===")
return
if activity.get("dchn") == "kkXgpzO":
fn_print(f"用户【“{self.user_phone}】, ===开始领取限时抢===")
seckill_list = activity.get("strategy_data").get("data").get("seckill") # 秒杀列表
seckill_status_name_dict = {
'1': '正在热抢',
'2': '即将开始',
'3': '已经开抢'
}
coupons_status_name_dict = {
'1': '可领取',
'2': '已经领取',
'4': '抽奖抢券',
'5': '未到时间'
}
for seckill in seckill_list:
seckill_name = seckill.get("start_at")
seckill_status = int(seckill.get("status")) # 1为正在热抢 2为即将开始 3为已经开抢
fn_print(f"☆☆场次:{seckill_name} 状态:{seckill_status_name_dict[str(seckill_status)]}")
if seckill_status in [1, 3]:
coupons_list = seckill.get("coupons")
for coupon_index, coupon in enumerate(coupons_list):
coupons_name = coupon.get("name")
coupons_status = coupon.get("status") # 1为可领取 2为已经领取 4为抽奖抢券
fn_print(f"==={coupon_index + 1}.券名:{coupons_name} "
f"状态:{coupons_status_name_dict.get(str(coupons_status))}===")
if coupons_status == 1:
fn_print(f"===开始领取券:{coupons_name}===")
activity_id = coupon.get("activity_id")
group_id = coupon.get("group_id")
coupon_conf_id = coupon.get("coupon_conf_id")
group_date = coupon.get("group_date")
bind_coupon_response = await self.client.post(
url="https://ut.xiaojukeji.com/ut/janitor/api/action/coupon/bind",
headers={'Didi-Ticket': self.token},
json={
"activity_id": activity_id,
"group_id": group_id,
'group_date': group_date,
"coupon_conf_id": coupon_conf_id
}
)
bind_coupon_data = bind_coupon_response.json()
if bind_coupon_data.get("errno") == 0:
fn_print(f"用户【{self.user_phone}】, ===领取成功🎉===")
await asyncio.sleep(0.5)
continue
else:
fn_print(f"用户【{self.user_phone}】, ===领取失败,{bind_coupon_data}===")
return
else:
fn_print(f"===每日精选请求异常, {get_batch_config_response.text}===")
async def run(self):
await self.get_user_info()
fn_print(f"用户【{self.user_phone}】, ===当前福利金数量为:{await self.get_welfare_payments()}===")
task = [
self.today_pick(),
self.sign_in(),
self.run_scratch(),
self.receive_level_gift_week(),
self.receive_level_gift_month(),
self.swell_coupon(),
self.receive_travel_insurance(),
self.receive_memberday_discount_multi(),
self.receive_wyc_order_finish(),
self.claim_coupon_check_in(),
self.claim_coupon_lottery()
]
await asyncio.gather(*task)
fn_print(f"用户【{self.user_phone}】, ===当前福利金数量为:{await self.get_welfare_payments()}===")
async def main():
task = []
for token in dd_tokens:
dd = DiDi(token)
task.append(dd.run())
await asyncio.gather(*task)
if __name__ == '__main__':
asyncio.run(main())
send_notification_message_collection("滴滴出行通知 - {}".format(datetime.datetime.now().strftime("%Y/%m/%d")))

File diff suppressed because one or more lines are too long