feat(plugin): 集成 OpenClaw Bridge + QQ 操作技能套件

新增 openclaw_bridge 插件,实现 QQ ↔ OpenClaw Gateway 桥接:

src/process.py:
  - QQ 消息自动转发 OpenClaw Gateway
  - 内置安全检测(高危词、管理员白名单、MC指令过滤)
  - 高危词库外部化到 config.toml [security] section
  - 群昵称自动解析
  - Session 隔离(按群×用户)

config/openclawbridge/config.toml:
  - 插件配置模板(已脱敏:占位符替代个人信息)

scripts/qq_*.py (×15):
  - 消息发送/文件传输/群管理/好友管理
  - 信息查询/历史回溯/OCR/点赞
  - 全部脱敏(QQ号→YOUR_ADMIN_QQ, IP→YOUR_NAPCAT_HOST等)

skills/*/SKILL.md (×8):
  - AgentSkills 使用指导
  - qq-messenger / qq-management / qq-resolver / qq-napcat-extras
  - browser / file-process / mc-query / nix-helper

SKILL.md:
  - AgentSkill 入口,完整架构说明和部署步骤
This commit is contained in:
Claw
2026-05-04 16:28:12 +08:00
parent 02a9d73817
commit 4068869217
27 changed files with 4250 additions and 0 deletions

88
scripts/qq_get_friends.py Normal file
View File

@ -0,0 +1,88 @@
#!/usr/bin/env python3
"""
获取好友列表 - 通过 NapCat (OneBot) HTTP API
用法:
python3 qq_get_friends.py # 输出格式化好友列表
python3 qq_get_friends.py --json # 输出 JSON(供 agent 使用)
python3 qq_get_friends.py --keyword 张三 # 搜索昵称/备注包含"张三"的好友
"""
import json
import sys
import argparse
import requests
CQHTTP_URL = "http://YOUR_NAP CAT_HOST:25570"
def get_friend_list():
"""获取好友列表,返回好友字典列表"""
url = f"{CQHTTP_URL}/get_friend_list"
resp = requests.post(url, json={}, timeout=10)
data = resp.json()
if data.get("status") == "ok":
return data.get("data", [])
raise Exception(f"API 返回异常: {json.dumps(data, ensure_ascii=False)}")
def format_friends(friends, keyword=None):
"""格式化为可读文本"""
if keyword:
keyword = keyword.lower()
filtered = []
for f in friends:
uid = str(f.get("user_id", ""))
nickname = f.get("nickname", "")
remark = f.get("remark", "")
if (keyword in uid or keyword in nickname.lower()
or keyword in remark.lower()):
filtered.append(f)
friends = filtered
if not friends:
return "暂无好友数据"
lines = [f"共 {len(friends)} 个好友\n"]
for f in friends:
uid = f.get("user_id", "?")
nickname = f.get("nickname", "?")
remark = f.get("remark", "")
remark_str = f"(备注:{remark})" if remark else ""
lines.append(f"• {nickname} ({uid}){remark_str}")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="获取 QQ 好友列表")
parser.add_argument("--json", action="store_true", help="输出 JSON 格式")
parser.add_argument("--keyword", type=str, help="按昵称/备注关键词筛选")
args = parser.parse_args()
try:
friends = get_friend_list()
if args.keyword:
kw = args.keyword.lower()
friends = [
f for f in friends
if kw in str(f.get("user_id", ""))
or kw in f.get("nickname", "").lower()
or kw in f.get("remark", "").lower()
]
if args.json:
print(json.dumps(friends, ensure_ascii=False, indent=2))
else:
print(format_friends(friends, args.keyword))
except requests.exceptions.ConnectionError:
print(f"❌ 连接失败: 无法连接到 NapCat ({CQHTTP_URL})")
sys.exit(1)
except Exception as e:
print(f"❌ 获取好友列表失败: {e}")
sys.exit(1)
if __name__ == "__main__":
main()