Files
chatrebot_aireply_plug/scripts/qq_upload_group_file.py
root 9dff73e7bc fix: 通过本地完整测试发现的 11 个 bug
🔴 致命(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 回复
2026-05-04 19:47:26 +08:00

90 lines
2.8 KiB
Python

#!/usr/bin/env python3
"""
群文件上传 — 通过 NapCat 消息 API 上传文件到群
用法:
python3 qq_upload_group_file.py --gid YOUR_GROUP_ID --file /path/to/file.txt
python3 qq_upload_group_file.py --gid YOUR_GROUP_ID --file ./doc.md --name 文档.md
python3 qq_upload_group_file.py --gid YOUR_GROUP_ID --file ./image.png --json
"""
import json
import sys
import os
import base64
import argparse
import requests
CQHTTP_URL = "http://YOUR_NAPCAT_HOST:25570"
DEFAULT_GID = YOUR_GROUP_ID # Liquid Studio 群
def upload_file(group_id: int, file_path: str, file_name: str = None) -> dict:
"""上传文件到群,通过 base64:// 方式发送文件消息"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"文件不存在: {file_path}")
file_size = os.path.getsize(file_path)
file_name = file_name or os.path.basename(file_path)
# 读取并 base64 编码
with open(file_path, "rb") as f:
b64_content = base64.b64encode(f.read()).decode()
resp = requests.post(f"{CQHTTP_URL}/send_group_msg", json={
"group_id": group_id,
"message": [
{
"type": "file",
"data": {
"file": f"base64://{b64_content}",
"name": file_name
}
}
]
}, timeout=60)
data = resp.json()
if data.get("status") != "ok":
raise Exception(data.get("message", data.get("wording", "上传失败")))
return {
"message_id": data["data"]["message_id"],
"file_name": file_name,
"file_size": file_size,
"group_id": group_id
}
def main():
parser = argparse.ArgumentParser(description="群文件上传")
parser.add_argument("--gid", type=int, default=DEFAULT_GID, help=f"群号 (默认: {DEFAULT_GID})")
parser.add_argument("--file", type=str, required=True, help="要上传的文件路径")
parser.add_argument("--name", type=str, help="文件名(默认使用原文件名)")
parser.add_argument("--json", action="store_true", help="JSON 格式输出")
args = parser.parse_args()
try:
result = upload_file(args.gid, args.file, args.name)
if args.json:
print(json.dumps(result, ensure_ascii=False))
else:
size_str = f"{result['file_size'] / 1024:.1f} KB" if result['file_size'] >= 1024 else f"{result['file_size']} B"
print(f"✅ 已上传: {result['file_name']} ({size_str})")
print(f" message_id: {result['message_id']}")
except FileNotFoundError as e:
print(f"{e}")
sys.exit(1)
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()