diff --git a/.gitignore b/.gitignore index 5b4a5874..88733976 100644 --- a/.gitignore +++ b/.gitignore @@ -59,9 +59,8 @@ progress.md .pi/agent/mcp-npx-cache.json .pi/agent/run-history.jsonl .pi/agent/taskplane/ +.pi/agent/skills/ .pi/agent/skills-disabled/ -.pi/agent/skills/.Recycle_bin/ -.pi/agent/skills/.system/ .pi/agent/extensions/webui/frontend/node_modules/ .pi/agent/extensions/webui/.webui.pid .pi/agent/extensions/webui/data/ diff --git a/.pi/agent/skills/README.md b/.pi/agent/skills/README.md deleted file mode 100644 index b7580672..00000000 --- a/.pi/agent/skills/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Skills - -这里是本机通用 Skills 目录,给大模型统一放可复用的技能包、流程说明和模板。 - -## 目录约定 - -- 每个 Skill 单独一个子目录 -- 入口文件通常使用 `SKILL.md` -- 可按需包含 `references/`、`scripts/`、`assets/` 等辅助目录 -- Skill 内尽量写清楚触发条件、输入输出、约束和操作步骤 - -## 推荐结构 - -```text -/root/skills/ - your-skill/ - SKILL.md - references/ - scripts/ - assets/ -``` - -## 当前状态 - -- 目前这个目录已作为小萌芽本机的日常开发主目录使用 -- 先在这里维护、测试和迭代 Skill,确认稳定后再同步到 `~/.codex/skills/` 和 `~/.claude/skills/` -- 当前已放入的自定义 Skill: - - `command-help-zh-skill` - - `mengya-mail-skill` - - `mengya-search-skill` - - `linux-ssh-operator-skill` -- 前两个 Skill 的实现分别对接: - - `/shumengya/project/python/mengya-mail-api/src/mengya_mail_api/` - - `/shumengya/project/python/mengya-search-api/src/mengya_search_api/` -- `linux-ssh-operator-skill` 的脚本与说明位于: - - `/shumengya/project/skills/linux-ssh-operator-skill/` -- 如果某些 Skill 需要接入特定工具或工作流,建议在 `SKILL.md` 顶部先写清适用范围 - -当前入口请直接走 `skills/...` 和对应的 `python/*-api/`。 diff --git a/.pi/agent/skills/quark-sign-skill/SKILL.md b/.pi/agent/skills/quark-sign-skill/SKILL.md deleted file mode 100644 index 5826eeb6..00000000 --- a/.pi/agent/skills/quark-sign-skill/SKILL.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -name: quark-sign-skill -description: 夸克网盘自动签到。支持通过 URL 参数执行每日签到获取容量奖励,零外部依赖(Python 标准库即可运行)。 ---- - -# 夸克网盘签到 - -自动执行夸克网盘每日签到,获取容量奖励。 - -## 触发场景 - -- 用户提到「夸克签到」「夸克网盘签到」「签到」且上下文明确指向夸克网盘 -- 用户要求配置夸克网盘自动签到 - -## 前置要求 - -- Python 3.7+(已预装) -- 夸克网盘签到 URL(从夸克 App 或网页获取) - -## 获取签到 URL - -1. 打开夸克网盘 App 或网页版 -2. 进入「容量管理」或「签到」页面 -3. 浏览器开发者工具 → Network → 找到类似 `growth/sign` 或 `growth/reward_record` 的请求 -4. 复制完整 URL(包含 `kps`、`sign`、`vcode` 参数) - -URL 格式示例: -``` -https://drive-m.quark.cn/1/clouddrive/capacity/growth/reward_record?kps=xxx&sign=yyy&vcode=zzz -``` - -## 使用方式 - -### 方式一:直接运行(推荐) - -如果 skill 目录下已配置了默认 `config.json`,无需任何参数即可运行: - -```bash -python scripts/quark_sign.py -``` - -### 方式二:直接传 URL - -```bash -python scripts/quark_sign.py --url "你的完整URL" -``` - -### 方式三:配置文件 - -```bash -# 1. 复制示例配置并编辑 -cp config.json.example ~/.config/quark_sign.json -# 填入你的 URL - -# 2. 运行 -python scripts/quark_sign.py --config ~/.config/quark_sign.json -``` - -### 方式四:环境变量 - -```bash -export QUARK_SIGN_URL="你的完整URL" -python scripts/quark_sign.py -``` - -## 常用命令 - -```bash -# 执行签到 -python scripts/quark_sign.py --url "URL" - -# 仅检查今日是否已签到 -python scripts/quark_sign.py --url "URL" --check - -# 查看签到信息 -python scripts/quark_sign.py --url "URL" --info -``` - -## 输出示例 - -``` -🚀 执行签到... -✅ 签到成功!获得 100.00 MB -``` - -``` -🚀 执行签到... -ℹ️ 今日已签到过,无需重复签到 -``` - -## 默认配置 - -skill 目录下已内置 `config.json`,作为默认 URL 来源。URL 查找优先级: - -1. `--url` 参数 -2. `--config` 指定的配置文件 -3. 环境变量 `QUARK_SIGN_URL` -4. skill 内置 `config.json`(默认使用) - -## 注意事项 - -- URL 中的 `kps` 和 `sign` 参数有有效期,如失效需重新获取 -- 签到奖励通常为 100MB~1GB 不等,随机发放 -- 脚本支持 `requests` 库(如已安装)或纯 Python 标准库(零依赖) -- 默认配置适合个人使用,多用户场景建议各自使用 `--config` 或 `--url` - -## 配置 cron 定时任务 - -```bash -# 每天 9 点自动签到 -crontab -e -# 添加: -0 9 * * * python3 /path/to/quark-sign-skill/scripts/quark_sign.py --config /root/.config/quark_sign.json >> /var/log/quark_sign.log 2>&1 -``` diff --git a/.pi/agent/skills/quark-sign-skill/config.json b/.pi/agent/skills/quark-sign-skill/config.json deleted file mode 100644 index a48a76cd..00000000 --- a/.pi/agent/skills/quark-sign-skill/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "url": "https://drive-m.quark.cn/1/clouddrive/capacity/growth/reward_record?kps=Tj6VYdauGenq2rmPE33ohRAtDymhNFX6jKshCB38E3zVZiDAcGttvmkoAgTNU4n%252B8d7JiORQFKb%252F%252BEU524TsTfP1zN4ZWMXH5UMsxTD%252BLuW%252F8w%253D%253D&sign=Tj7N%252BNUA%252ByXE53C%252FPtR0xBpqepeIHSWt9RtzS66kyDIp9MNlfHO2OJ7zvOZQeK5QuAg%253D&vcode=1780291057288&_size=10&uc_param_str=dnfrpfbivessbtbmnilauputogpintnwmtsvcppcprsnnnchmicckp&fr=android&pf=3300&bi=37280&ve=10.2.3.104&ss=411x833&la=zh&ut=Tj5VTPsW0B0jX%2BOb3U5q%2BcX97R%2Bo%2FcYuH5nOtiswJy9O9Q%3D%3D&nt=6&nw=5G&mt=qUMBdVdLPFs5VQKefOxlxCMt4YMRf%2FRe&sv=release&pr=qk_clouddrive&ch=kkcloud%40store_xiaomi&mi=22127RK46C&kp=Tj6VYdauGenq2rmPE33ohRAtDymhNFX6jKshCB38E3zVZiDAcGttvmkoAgTNU4n%2B8d7JiORQFKb%2F%2BEU524TsTfP1zN4ZWMXH5UMsxTD%2BLuW%2F8w%3D%3D" -} diff --git a/.pi/agent/skills/quark-sign-skill/config.json.example b/.pi/agent/skills/quark-sign-skill/config.json.example deleted file mode 100644 index 6b86ceb3..00000000 --- a/.pi/agent/skills/quark-sign-skill/config.json.example +++ /dev/null @@ -1,3 +0,0 @@ -{ - "url": "https://drive-m.quark.cn/1/clouddrive/capacity/growth/reward_record?kps=...&sign=...&vcode=..." -} diff --git a/.pi/agent/skills/quark-sign-skill/scripts/quark_sign.py b/.pi/agent/skills/quark-sign-skill/scripts/quark_sign.py deleted file mode 100644 index a9600bd6..00000000 --- a/.pi/agent/skills/quark-sign-skill/scripts/quark_sign.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python3 -""" -夸克网盘自动签到脚本 - -用法: - python quark_sign.py --url "你的夸克URL" [--check] - python quark_sign.py --config ~/.config/quark_sign.json -""" -import argparse -import json -import os -import sys -from urllib.parse import urlparse, parse_qs, unquote - -# 尝试导入 requests,如果没有则使用 urllib -HAS_REQUESTS = True -try: - import requests -except ImportError: - HAS_REQUESTS = False - import urllib.request - import urllib.parse - import urllib.error - import ssl - - -class QuarkSign: - BASE_URL = "https://drive-m.quark.cn/1/clouddrive/capacity/growth" - - def __init__(self, url: str): - self.params = self._extract_params(url) - if not self.params.get("kps") or not self.params.get("sign"): - raise ValueError("URL 中缺少 kps 或 sign 参数,请检查 URL 是否完整") - - def _extract_params(self, url: str) -> dict: - parsed = urlparse(url) - params = parse_qs(parsed.query) - return {k: unquote(v[0]) for k, v in params.items()} - - def _build_query(self, extra: dict = None) -> dict: - q = { - "pr": "ucpro", - "fr": "android", - "kps": self.params.get("kps"), - "sign": self.params.get("sign"), - "vcode": self.params.get("vcode", "1780291057288"), - } - if extra: - q.update(extra) - return q - - def _post(self, endpoint: str, data: dict = None, params: dict = None) -> dict: - url = f"{self.BASE_URL}/{endpoint}" - query = self._build_query(params) - - if HAS_REQUESTS: - resp = requests.post(url, json=data or {}, params=query, timeout=10) - return resp.json() - else: - # 使用 urllib fallback - full_url = url + "?" + urllib.parse.urlencode(query) - payload = json.dumps(data or {}).encode("utf-8") - req = urllib.request.Request( - full_url, - data=payload, - headers={"Content-Type": "application/json"}, - method="POST", - ) - ctx = ssl.create_default_context() - with urllib.request.urlopen(req, context=ctx, timeout=10) as resp: - return json.loads(resp.read().decode("utf-8")) - - def _get(self, endpoint: str, params: dict = None) -> dict: - url = f"{self.BASE_URL}/{endpoint}" - query = self._build_query(params) - - if HAS_REQUESTS: - resp = requests.get(url, params=query, timeout=10) - return resp.json() - else: - full_url = url + "?" + urllib.parse.urlencode(query) - req = urllib.request.Request(full_url, method="GET") - ctx = ssl.create_default_context() - with urllib.request.urlopen(req, context=ctx, timeout=10) as resp: - return json.loads(resp.read().decode("utf-8")) - - def sign(self) -> dict: - """执行签到""" - return self._post("sign", data={"sign_cyclic": True}) - - def info(self) -> dict: - """获取签到信息""" - return self._get("sign", params={"_size": 1}) - - def reward_info(self) -> dict: - """获取奖励记录""" - return self._get("reward_record", params={"_size": 10}) - - -def format_reward(reward_bytes: int) -> str: - if reward_bytes >= 1024 ** 3: - return f"{reward_bytes / (1024 ** 3):.2f} GB" - return f"{reward_bytes / (1024 ** 2):.2f} MB" - - -def main(): - parser = argparse.ArgumentParser(description="夸克网盘自动签到") - parser.add_argument("--url", help="夸克网盘分享/签到 URL(包含 kps 和 sign 参数)") - parser.add_argument("--config", "-c", help="配置文件路径(JSON 格式)") - parser.add_argument("--check", action="store_true", help="仅检查签到状态,不执行签到") - parser.add_argument("--info", action="store_true", help="显示签到信息") - args = parser.parse_args() - - # 获取 URL - url = args.url - if not url and args.config: - with open(os.path.expanduser(args.config)) as f: - cfg = json.load(f) - url = cfg.get("url") - if not url: - # 尝试环境变量 - url = os.environ.get("QUARK_SIGN_URL") - if not url: - # 尝试读取默认配置(skill 内置) - script_dir = os.path.dirname(os.path.abspath(__file__)) - default_cfg = os.path.join(script_dir, "..", "config.json") - if os.path.exists(default_cfg): - with open(default_cfg) as f: - cfg = json.load(f) - url = cfg.get("url") - if not url: - print("❌ 请提供 URL:--url、--config 或环境变量 QUARK_SIGN_URL") - print(" 提示:可在 skill 目录下创建 config.json 写入默认 URL") - sys.exit(1) - - try: - qs = QuarkSign(url) - except ValueError as e: - print(f"❌ {e}") - sys.exit(1) - - if args.info: - print("📋 获取签到信息...") - info = qs.info() - print(json.dumps(info, indent=2, ensure_ascii=False)) - return - - if args.check: - print("🔍 检查签到状态...") - info = qs.info() - data = info.get("data", {}) - if data.get("sign_daily"): - print("✅ 今日已签到") - else: - print("⏳ 今日未签到") - return - - # 执行签到 - print("🚀 执行签到...") - result = qs.sign() - - status = result.get("status") - code = result.get("code") - msg = result.get("message", "") - data = result.get("data", {}) - - if data and status == 200: - reward = data.get("sign_daily_reward", 0) - print(f"✅ 签到成功!获得 {format_reward(reward)}") - elif "repeat" in msg.lower() or code == 44210: - print("ℹ️ 今日已签到过,无需重复签到") - else: - print(f"❌ 签到失败: {msg} (code={code}, status={status})") - sys.exit(1) - - -if __name__ == "__main__": - main()