突破签到边界:check项目的架构解析与二次开发实战指南
【免费下载链接】check 青龙面板平台签到函数 项目地址: https://gitcode.com/gh_mirrors/check5/check
你是否还在为青龙面板(QingLong Panel)的签到脚本无法满足个性化需求而烦恼?是否在面对多平台签到逻辑差异时感到束手无策?本文将系统拆解check项目的模块化架构,通过10+实战案例带你掌握从脚本扩展到功能重构的全流程开发技巧,最终打造专属于你的自动化签到生态。
读完本文你将获得:
- 理解check项目的核心工作流与配置解析机制
- 掌握3种扩展签到平台的标准化开发模式
- 学会利用utils工具类实现配置动态管理
- 实现多维度的签到结果通知与日志分析
- 构建可复用的二次开发组件库
项目架构深度剖析
系统整体架构
check项目采用分层架构设计,各模块职责清晰:
- 配置层:支持TOML/JSON双格式,通过样本文件
check.sample.toml和check.sample.json提供配置模板 - 核心调度层:基于装饰器模式实现脚本的自动注册与执行,支持多账号批量处理
- 平台实现层:采用"一平台一脚本"的设计原则,每个签到脚本独立实现
__init__和main方法 - 通知层:集成10+通知渠道,支持签到结果的聚合推送
核心模块解析
配置解析模块(config_get类)
class config_get(object):
def __init__(self, custom_path=None):
"""配置解析器初始化,自动检测青龙面板版本"""
if custom_path is None:
self.config_path = self.get_config_path() # 自动识别青龙面板版本
self.config_file = self.get_config_file() # 检测配置文件格式
self.config_format = self.get_config_format() # 确定配置文件类型
# ...
def get_value(self, expression):
"""通过正则表达式获取配置值"""
real_key = self.get_real_key(expression) # 正则匹配配置键
if self.config_format == "toml":
return self.get_value_for_toml(self.config_file, real_key)
else:
return self.get_value_for_json(self.config_file, real_key)
该类实现了四大核心能力:
- 环境自适应:自动识别青龙面板v2.12+和旧版本的配置路径差异
- 双格式支持:统一TOML和JSON配置文件的读取接口
- 智能键匹配:通过正则表达式模糊匹配配置键,提高兼容性
- 故障恢复:配置文件缺失时自动从样本文件复制生成
任务调度模块(check装饰器)
class check(object):
def __call__(self, func):
@wraps(func)
def wrapper():
# 多账号处理逻辑
config = config_get()
value_list = config.get_value(self.run_script_expression)
push_message = ""
num = 1
for value in value_list:
print(f"<----------------账号【{num}】---------------->")
try:
result = func(value=value) + '\n\n'
push_message += result
except Exception as e:
# 异常处理逻辑
num += 1
send(self.run_script_name, push_message)
return wrapper
装饰器模式的巧妙应用实现了:
- 无侵入式增强:不修改业务逻辑即可添加多账号支持
- 统一异常处理:集中捕获IndexError/AttributeError等常见异常
- 结果聚合推送:自动汇总多账号执行结果并调用通知模块
目录结构与模块关系
check/
├── dailycheckin_scripts/ # 核心签到脚本目录
│ ├── ck_bilibili.py # B站签到实现
│ ├── ck_baidu.py # 百度签到实现
│ └── ...(20+平台)
├── other_scripts/ # 辅助功能脚本
├── utils.py # 工具类库
├── checksendNotify.py # 通知模块
├── check.sample.toml # 配置样本文件
└── check.sample.json # 配置样本文件
各签到脚本遵循统一接口规范:
- 必须实现
__init__(self, check_item)构造方法 - 提供
main(self)作为执行入口 - 通过
check装饰器注册任务元信息
二次开发环境搭建
开发环境准备
# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/check5/check
# 进入项目目录
cd check
# 安装依赖
pip3 install requests rsa tomli beautifulsoup4
配置文件初始化
# 复制配置样本文件
cp check.sample.toml check.toml
# 根据需要修改配置
vim check.toml # 或使用其他编辑器
配置文件关键参数说明:
| 参数类别 | 示例配置 | 说明 |
|---|---|---|
| 账号配置 | bilibili_cookie = ["cookie1", "cookie2"] | 支持多账号数组 |
| 开关配置 | enable_baidu = true | 控制脚本是否执行 |
| 通知配置 | bark_token = "your_bark_token" | 通知渠道参数 |
| 高级配置 | timeout = 30 | 网络请求超时设置 |
开发工具链
推荐开发工具组合:
- VS Code + Python插件:提供代码补全与调试支持
- Toml插件:增强TOML配置文件编辑体验
- Git:版本控制与多人协作
- Postman:API调试与签名算法验证
签到脚本开发实战
新平台签到脚本开发三步法
第一步:定义配置结构
在check.toml中添加平台配置:
# 抖音签到配置
[douyin]
# 多账号支持
cookie = [
"sessionid=xxx;uid=123", # 账号1
"sessionid=yyy;uid=456" # 账号2
]
enable = true # 启用开关
第二步:实现核心逻辑(以抖音为例)
创建dailycheckin_scripts/ck_douyin.py:
import requests
from utils import check
class DouYinCheck:
def __init__(self, check_item):
self.check_item = check_item
self.session = requests.Session()
self.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
}
def sign(self):
"""执行签到逻辑"""
url = "https://api.douyin.com/aweme/v1/aweme/post/"
cookies = {i.split("=")[0]: i.split("=")[1] for i in self.check_item.split(";")}
response = self.session.post(
url,
cookies=cookies,
headers=self.headers,
data={"type": "sign"}
)
result = response.json()
if result.get("status_code") == 0:
return f"签到成功,获得{result['data']['points']}积分"
else:
return f"签到失败:{result.get('message', '未知错误')}"
def main(self):
"""主执行方法"""
return self.sign()
# 注册为签到任务
@check(run_script_name="抖音签到", run_script_expression=r"douyin\.cookie")
def run(value):
return DouYinCheck(value).main()
if __name__ == "__main__":
run()
第三步:添加异常处理与日志
增强错误处理能力:
def sign(self):
"""执行签到逻辑"""
try:
url = "https://api.douyin.com/aweme/v1/aweme/post/"
cookies = {i.split("=")[0]: i.split("=")[1] for i in self.check_item.split(";")}
# 添加超时控制
response = self.session.post(
url,
cookies=cookies,
headers=self.headers,
data={"type": "sign"},
timeout=10 # 10秒超时
)
response.raise_for_status() # 触发HTTP错误状态码异常
result = response.json()
if result.get("status_code") == 0:
return f"签到成功,获得{result['data']['points']}积分"
else:
return f"签到失败:{result.get('message', '未知错误')}"
except requests.exceptions.Timeout:
return "签到超时,请检查网络连接"
except requests.exceptions.RequestException as e:
return f"网络请求异常:{str(e)}"
except KeyError as e:
return f"返回数据解析错误:缺少{e}字段"
高级功能扩展技术
动态配置管理
利用config_get类的高级特性实现灵活配置:
# 动态获取配置示例
from utils import config_get
def dynamic_config_demo():
# 初始化配置管理器
config = config_get()
# 方法1:精确匹配
bilibili_cookies = config.get_value("bilibili.cookie")
# 方法2:正则模糊匹配
# 适用于键名可能变化的场景
video_platform_cookies = config.get_value(r".*video.*cookie")
# 方法3:获取开关配置
enable_advanced_mode = config.get_value("advanced_mode.enable")
print(f"获取到{bilibili_cookies}")
get_real_key方法实现原理:
def get_real_key(self, expression):
"""通过正则表达式查找配置键"""
pattern = re.compile(expression, re.I) # 忽略大小写
if self.config_format == "toml":
for key in self.get_key_for_toml(self.config_file):
if pattern.match(key):
return key
else:
# JSON格式处理逻辑
多渠道通知扩展
checksendNotify模块支持10+通知渠道,可轻松扩展新渠道:
# 添加企业微信应用通知示例
def wecom_app(title: str, content: str) -> None:
"""企业微信应用通知"""
if not WECOM_APP_AGENT_ID or not WECOM_APP_CORPID or not WECOM_APP_SECRET:
print("企业微信应用通知参数未配置")
return
# 获取access_token
token_url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={WECOM_APP_CORPID}&corpsecret={WECOM_APP_SECRET}"
token = requests.get(token_url).json().get("access_token")
# 发送消息
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}"
data = {
"touser": "@all",
"agentid": WECOM_APP_AGENT_ID,
"msgtype": "text",
"text": {"content": f"{title}\n\n{content}"}
}
requests.post(url, json=data)
通知优先级控制:
def send(title: str, content: str) -> None:
"""按优先级发送通知"""
# 1. 首先尝试Bark通知
if BARK_URL:
bark(title, content)
# 2. 其次尝试企业微信通知
elif WECOM_APP_AGENT_ID:
wecom_app(title, content)
# 3. 最后使用控制台输出
else:
console(title, content)
定时任务动态调整
利用change_cron_new和change_cron_old函数实现定时任务管理:
from utils import change_cron_new
def adjust_schedule_demo():
# 修改青龙面板新版定时任务
# 默认路径:/ql/data/db/database.sqlite
change_cron_new(
cron_file_path="/ql/data/db/database.sqlite",
repositories="yuxian158_check"
)
# 函数内部实现原理:
# 1. 备份数据库
# 2. 连接SQLite数据库
# 3. 随机调整分钟和小时字段
# 4. 提交修改
随机时间生成逻辑:
def change_time(time_str: str):
"""随机调整定时任务时间"""
words = re.sub("\\s+", " ", time_str).split()
# 随机生成0-59分钟
words[0] = str(random.randrange(60))
# 随机生成0-21点
words[1] = str(random.randrange(22))
return " ".join(words)
性能优化与问题诊断
签到脚本性能优化
针对多账号场景的优化技巧:
- 连接池复用
# 为requests创建连接池
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_session_with_pool():
session = requests.Session()
# 设置重试策略
retry_strategy = Retry(
total=3,
backoff_factor=0.5,
status_forcelist=[429, 500, 502, 503, 504]
)
# 配置连接池
adapter = HTTPAdapter(
max_retries=retry_strategy,
pool_connections=10, # 连接池数量
pool_maxsize=100 # 每个连接的最大请求数
)
session.mount("https://", adapter)
session.mount("http://", adapter)
return session
- 异步并发执行
# 多平台异步执行示例
import asyncio
import aiohttp
async def async_checkin(platforms):
"""异步执行多平台签到"""
async with aiohttp.ClientSession() as session:
tasks = [platform.checkin(session) for platform in platforms]
results = await asyncio.gather(*tasks)
return results
# 使用方法
platforms = [BilibiliChecker(), BaiduChecker(), WeiboChecker()]
results = asyncio.run(async_checkin(platforms))
常见问题诊断指南
| 问题类型 | 可能原因 | 诊断方法 | 解决方案 |
|---|---|---|---|
| 配置文件不生效 | 路径错误/格式错误 | 检查日志中的"启用了xx配置文件"提示 | 执行python utils.py验证配置 |
| 签到返回空结果 | Cookie失效 | 查看青龙面板日志的具体错误 | 重新获取并更新Cookie |
| 部分平台执行失败 | API接口变更 | 对比官方APP请求参数 | 更新签到脚本的API调用部分 |
| 通知发送失败 | 渠道参数错误 | 检查checksendNotify.py日志 | 验证通知渠道配置参数 |
配置文件诊断命令:
# 验证配置文件格式
python -m tomli check.toml # TOML格式验证
python -m json.tool check.json # JSON格式验证
二次开发最佳实践
代码规范与风格指南
遵循项目现有代码风格:
-
命名规范
- 文件名:
ck_<平台名>.py(全小写+下划线) - 类名:PascalCase(如
BilibiliChecker) - 方法名:snake_case(如
user_info)
- 文件名:
-
文档要求
def sign(self, cookies): """ 执行签到操作 Args: cookies (str): 包含用户凭证的Cookie字符串 Returns: str: 签到结果描述 Raises: ValueError: 当cookies格式不正确时 """ -
错误处理原则
- 捕获具体异常而非通用Exception
- 提供明确的错误消息
- 保留原始异常堆栈便于调试
可复用组件开发
开发通用签到基类:
class BaseChecker:
"""签到脚本基类"""
def __init__(self, check_item):
self.check_item = check_item
self.session = self._create_session()
self.headers = self._default_headers()
def _create_session(self):
"""创建配置好的会话"""
session = requests.Session()
# 添加重试和连接池配置
return session
def _default_headers(self):
"""默认请求头"""
return {
"User-Agent": "Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36",
"Accept": "*/*",
"Connection": "keep-alive"
}
def pre_check(self):
"""前置检查,子类可重写"""
if not self.check_item:
raise ValueError("缺少必要的配置信息")
def post_process(self, result):
"""结果后处理,子类可重写"""
return result
def main(self):
"""主执行流程"""
try:
self.pre_check()
result = self.sign()
return self.post_process(result)
except Exception as e:
return f"执行失败:{str(e)}"
def sign(self):
"""签到逻辑,子类必须实现"""
raise NotImplementedError("子类必须实现sign方法")
使用示例:
class BilibiliChecker(BaseChecker):
"""B站签到实现"""
def sign(self):
# 实现B站特有签到逻辑
url = "https://api.bilibili.com/x/web-interface/sign/in"
response = self.session.post(url, cookies=self._parse_cookies())
return self._parse_result(response.json())
def _parse_cookies(self):
"""解析B站Cookie"""
return {i.split("=")[0]: i.split("=")[1] for i in self.check_item.split(";")}
版本控制与协作开发
# 创建功能分支
git checkout -b feature/weibo-super-checkin
# 提交变更
git add dailycheckin_scripts/ck_weibo.py
git commit -m "Add super checkin for weibo: support task completion"
# 保持同步
git fetch origin
git rebase origin/main
# 推送分支
git push -u origin feature/weibo-super-checkin
提交信息规范:
<类型>(<范围>): <描述>
[可选的详细描述]
[可选的关闭issue引用]
类型说明:
- feat: 新功能
- fix: 错误修复
- docs: 文档更新
- refactor: 代码重构
- perf: 性能优化
实战案例:构建多平台签到聚合系统
需求分析与系统设计
目标:开发一个聚合签到控制台,支持:
- 统一管理10+平台签到状态
- 实现自定义签到顺序与依赖关系
- 提供可视化的签到结果统计
系统设计:
核心实现代码
- 签到管理器
class CheckinManager:
def __init__(self):
self.checkers = {} # 平台->检查器映射
self.dependencies = {} # 平台->依赖平台列表
self.results = [] # 执行结果
def register_checker(self, platform_name, checker):
"""注册签到检查器"""
self.checkers[platform_name] = checker
def set_dependency(self, platform, depends_on):
"""设置平台依赖关系"""
if platform not in self.checkers:
raise ValueError(f"平台{platform}未注册")
self.dependencies[platform] = depends_on
def run_all(self):
"""按依赖顺序执行所有签到"""
# 拓扑排序处理依赖
execution_order = self._topological_sort()
for platform in execution_order:
print(f"开始执行{platform}签到...")
checker = self.checkers[platform]
try:
result = checker.main()
self.results.append({
"platform": platform,
"status": "success",
"message": result,
"timestamp": time.time()
})
except Exception as e:
self.results.append({
"platform": platform,
"status": "failed",
"message": str(e),
"timestamp": time.time()
})
def _topological_sort(self):
"""拓扑排序确定执行顺序"""
# 简化实现,实际项目需处理循环依赖
visited = set()
order = []
def dfs(node):
visited.add(node)
if node in self.dependencies:
for dep in self.dependencies[node]:
if dep not in visited:
dfs(dep)
order.append(node)
for platform in self.checkers:
if platform not in visited:
dfs(platform)
return order
- 实现代码
from dailycheckin_scripts.ck_bilibili import BilibiliChecker
from dailycheckin_scripts.ck_weibo import WeiboChecker
# 导入其他平台检查器
class CheckinConsole:
def __init__(self):
self.manager = CheckinManager()
self._init_checkers()
self._setup_dependencies()
def _init_checkers(self):
"""初始化所有签到检查器"""
config = config_get()
# 初始化B站签到
bilibili_cookies = config.get_value("bilibili.cookie")
for cookie in bilibili_cookies:
self.manager.register_checker(
"bilibili", BilibiliChecker(cookie)
)
# 初始化微博签到
weibo_cookies = config.get_value("weibo.cookie")
for cookie in weibo_cookies:
self.manager.register_checker(
"weibo", WeiboChecker(cookie)
)
# 添加其他平台...
def _setup_dependencies(self):
"""设置依赖关系"""
# 例如:B站直播签到依赖B站主站签到
self.manager.set_dependency("bilibili_live", ["bilibili"])
def run(self):
"""运行控制台"""
print("===== 多平台签到聚合系统 =====")
self.manager.run_all()
# 生成报告
report = self.manager.generate_report()
print("\n===== 签到结果报告 =====")
print(report.to_markdown())
# 发送汇总通知
send("多平台签到汇总", report.to_text())
if __name__ == "__main__":
console = CheckinConsole()
console.run()
- 结果报告生成
class CheckinReport:
def __init__(self):
self.results = []
def add_result(self, platform, status, message, timestamp):
self.results.append({
"platform": platform,
"status": status,
"message": message,
"timestamp": timestamp
})
def to_markdown(self):
"""生成Markdown格式报告"""
md = "## 签到结果汇总\n\n"
md += "| 平台 | 状态 | 时间 | 详情 |\n"
md += "|------|------|------|------|\n"
for result in self.results:
status_emoji = "✅" if result["status"] == "success" else "❌"
time_str = time.strftime(
"%Y-%m-%d %H:%M:%S",
time.localtime(result["timestamp"])
)
md += f"| {result['platform']} | {status_emoji} | {time_str} | {result['message'][:30]}... |\n"
# 添加统计信息
total = len(self.results)
success = sum(1 for r in self.results if r["status"] == "success")
success_rate = (success / total) * 100 if total > 0 else 0
md += f"\n### 统计信息\n"
md += f"- 总平台数: {total}\n"
md += f"- 成功数: {success}\n"
md += f"- 失败数: {total - success}\n"
md += f"- 成功率: {success_rate:.2f}%\n"
return md
- 运行与调度
# 添加定时执行功能
from apscheduler.schedulers.blocking import BlockingScheduler
def start_scheduler():
scheduler = BlockingScheduler()
# 每天7:30执行签到
scheduler.add_job(
CheckinConsole().run,
'cron',
hour=7,
minute=30
)
# 每天12:00执行补充签到
scheduler.add_job(
CheckinConsole().run_missed,
'cron',
hour=12,
minute=0
)
print("调度器已启动,按Ctrl+C停止")
scheduler.start()
if __name__ == "__main__":
# 命令行参数处理
import argparse
parser = argparse.ArgumentParser(description='多平台签到聚合系统')
parser.add_argument('--mode', choices=['once', 'schedule'], default='once')
args = parser.parse_args()
if args.mode == 'once':
CheckinConsole().run()
else:
start_scheduler()
未来扩展方向与社区贡献
潜在功能扩展
-
Web管理界面
- 基于FastAPI构建后端API
- 使用Vue.js开发前端控制台
- 实现配置在线编辑与版本控制
-
AI辅助开发
- 自动分析API请求生成签到代码
- 基于历史数据预测签到成功率
- 智能修复常见的Cookie失效问题
-
区块链积分管理
- 统一兑换各平台积分
- 积分资产可视化
- 自动比价兑换最优礼品
社区贡献指南
贡献代码的流程:
-
发现问题
- 通过Issue跟踪系统报告bug
- 在Discussion中提出新功能建议
-
准备贡献
- Fork项目仓库
- 创建分支:
feature/your-feature或fix/bug-description
-
开发与测试
- 遵循代码规范编写代码
- 添加单元测试(覆盖主要逻辑)
- 确保所有测试通过
-
提交PR
- 填写PR模板
- 关联相关Issue
- 响应代码审查意见
-
代码审查
- 保持PR聚焦于单一功能/修复
- 及时回应反馈
- 保持沟通友好
学习资源与技术栈升级
推荐学习路径:
-
核心技术栈
- Python高级特性(装饰器/上下文管理器)
- 异步编程(asyncio/aiohttp)
- 数据格式处理(TOML/JSON/YAML)
-
扩展技术
- 容器化部署(Docker/Kubernetes)
- 自动化测试(pytest/coverage)
- CI/CD流程(GitHub Actions/GitLab CI)
-
推荐资源
- 《Fluent Python》
- 《Python Testing with pytest》
- 《Designing Data-Intensive Applications》
总结与展望
check项目作为青龙面板生态中的重要组件,通过其灵活的架构设计和模块化实现,为开发者提供了强大的签到脚本开发框架。本文从项目架构、开发实战、高级扩展等多个维度深入剖析了check项目的二次开发技术,通过具体案例展示了如何基于现有框架构建更复杂的签到聚合系统。
随着各平台API的不断演进和反爬机制的增强,签到脚本的维护面临诸多挑战。未来发展方向将聚焦于:
- 更智能的配置管理系统
- 自动化的API变更适应机制
- 增强的分布式执行能力
- 更丰富的数据分析与可视化
无论是个人用户自定义签到流程,还是企业级的自动化运营需求,check项目都提供了坚实的技术基础。通过本文介绍的二次开发方法,开发者可以快速构建满足特定需求的签到解决方案,进一步拓展项目的应用边界。
最后,开源项目的持续发展离不开社区贡献。欢迎开发者提交PR、报告Issue、参与讨论,共同推动check项目的不断完善与进化。
【免费下载链接】check 青龙面板平台签到函数 项目地址: https://gitcode.com/gh_mirrors/check5/check
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



