突破签到边界:check项目的架构解析与二次开发实战指南

突破签到边界:check项目的架构解析与二次开发实战指南

【免费下载链接】check 青龙面板平台签到函数 【免费下载链接】check 项目地址: https://gitcode.com/gh_mirrors/check5/check

你是否还在为青龙面板(QingLong Panel)的签到脚本无法满足个性化需求而烦恼?是否在面对多平台签到逻辑差异时感到束手无策?本文将系统拆解check项目的模块化架构,通过10+实战案例带你掌握从脚本扩展到功能重构的全流程开发技巧,最终打造专属于你的自动化签到生态。

读完本文你将获得:

  • 理解check项目的核心工作流与配置解析机制
  • 掌握3种扩展签到平台的标准化开发模式
  • 学会利用utils工具类实现配置动态管理
  • 实现多维度的签到结果通知与日志分析
  • 构建可复用的二次开发组件库

项目架构深度剖析

系统整体架构

mermaid

check项目采用分层架构设计,各模块职责清晰:

  • 配置层:支持TOML/JSON双格式,通过样本文件check.sample.tomlcheck.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)

该类实现了四大核心能力:

  1. 环境自适应:自动识别青龙面板v2.12+和旧版本的配置路径差异
  2. 双格式支持:统一TOML和JSON配置文件的读取接口
  3. 智能键匹配:通过正则表达式模糊匹配配置键,提高兼容性
  4. 故障恢复:配置文件缺失时自动从样本文件复制生成
任务调度模块(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_newchange_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)

性能优化与问题诊断

签到脚本性能优化

针对多账号场景的优化技巧:

  1. 连接池复用
# 为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
  1. 异步并发执行
# 多平台异步执行示例
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格式验证

二次开发最佳实践

代码规范与风格指南

遵循项目现有代码风格:

  1. 命名规范

    • 文件名:ck_<平台名>.py(全小写+下划线)
    • 类名:PascalCase(如BilibiliChecker
    • 方法名:snake_case(如user_info
  2. 文档要求

    def sign(self, cookies):
        """
        执行签到操作
    
        Args:
            cookies (str): 包含用户凭证的Cookie字符串
    
        Returns:
            str: 签到结果描述
    
        Raises:
            ValueError: 当cookies格式不正确时
        """
    
  3. 错误处理原则

    • 捕获具体异常而非通用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+平台签到状态
  • 实现自定义签到顺序与依赖关系
  • 提供可视化的签到结果统计

系统设计mermaid

核心实现代码

  1. 签到管理器
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
  1. 实现代码
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()
  1. 结果报告生成
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
  1. 运行与调度
# 添加定时执行功能
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()

未来扩展方向与社区贡献

潜在功能扩展

  1. Web管理界面

    • 基于FastAPI构建后端API
    • 使用Vue.js开发前端控制台
    • 实现配置在线编辑与版本控制
  2. AI辅助开发

    • 自动分析API请求生成签到代码
    • 基于历史数据预测签到成功率
    • 智能修复常见的Cookie失效问题
  3. 区块链积分管理

    • 统一兑换各平台积分
    • 积分资产可视化
    • 自动比价兑换最优礼品

社区贡献指南

贡献代码的流程:

  1. 发现问题

    • 通过Issue跟踪系统报告bug
    • 在Discussion中提出新功能建议
  2. 准备贡献

    • Fork项目仓库
    • 创建分支:feature/your-featurefix/bug-description
  3. 开发与测试

    • 遵循代码规范编写代码
    • 添加单元测试(覆盖主要逻辑)
    • 确保所有测试通过
  4. 提交PR

    • 填写PR模板
    • 关联相关Issue
    • 响应代码审查意见
  5. 代码审查

    • 保持PR聚焦于单一功能/修复
    • 及时回应反馈
    • 保持沟通友好

学习资源与技术栈升级

推荐学习路径:

  1. 核心技术栈

    • Python高级特性(装饰器/上下文管理器)
    • 异步编程(asyncio/aiohttp)
    • 数据格式处理(TOML/JSON/YAML)
  2. 扩展技术

    • 容器化部署(Docker/Kubernetes)
    • 自动化测试(pytest/coverage)
    • CI/CD流程(GitHub Actions/GitLab CI)
  3. 推荐资源

    • 《Fluent Python》
    • 《Python Testing with pytest》
    • 《Designing Data-Intensive Applications》

总结与展望

check项目作为青龙面板生态中的重要组件,通过其灵活的架构设计和模块化实现,为开发者提供了强大的签到脚本开发框架。本文从项目架构、开发实战、高级扩展等多个维度深入剖析了check项目的二次开发技术,通过具体案例展示了如何基于现有框架构建更复杂的签到聚合系统。

随着各平台API的不断演进和反爬机制的增强,签到脚本的维护面临诸多挑战。未来发展方向将聚焦于:

  • 更智能的配置管理系统
  • 自动化的API变更适应机制
  • 增强的分布式执行能力
  • 更丰富的数据分析与可视化

无论是个人用户自定义签到流程,还是企业级的自动化运营需求,check项目都提供了坚实的技术基础。通过本文介绍的二次开发方法,开发者可以快速构建满足特定需求的签到解决方案,进一步拓展项目的应用边界。

最后,开源项目的持续发展离不开社区贡献。欢迎开发者提交PR、报告Issue、参与讨论,共同推动check项目的不断完善与进化。

【免费下载链接】check 青龙面板平台签到函数 【免费下载链接】check 项目地址: https://gitcode.com/gh_mirrors/check5/check

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值