chore: ignore .pi/agent/skills directory
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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/
|
||||
|
||||
@@ -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/`。
|
||||
@@ -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
|
||||
```
|
||||
@@ -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"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"url": "https://drive-m.quark.cn/1/clouddrive/capacity/growth/reward_record?kps=...&sign=...&vcode=..."
|
||||
}
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user