🔴 致命(5个): - Bug1: onebot11.json 格式错误(旧 {http:{},ws:{}} → network.httpServers/httppClients) - Bug2: 端口映射错位(WebUI 6099, OneBot API 6097 独立端口) - Bug3: 变量名含空格 NAP CAT_HOST → NAPCAT_HOST(14脚本+2SKILL+README) - Bug4: heredoc 单引号阻止变量展开 - Bug5: process.py 缺失 _get_high_risk_words() 方法 🟡 重要(3个): - Bug6: onebot11.json 默认不存在(cat > 而非 edit) - Bug7: API 须登录后才响应(新增扫码引导步骤) - Bug8: qqrebot systemd 依赖 napcat 服务 🟢 中等(3个): - Bug9: Skills 占位符缺 YOUR_NAPCAT_HOST sed 覆盖 - Bug10: venv 不可用需降级方案 - Bug11: 端口 25580 冲突处理 已验证全链路:NapCat + qqrebot + 插件 + OpenClaw Gateway + AI 回复
89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
#!/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_NAPCAT_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()
|