openclaw/extensions/qq/test-send.ts
taki 9d036cae3a feat: add QQ channel plugin via NapCatQQ/OneBot v11
- Complete ChannelPlugin implementation for QQ messaging
- WebSocket client with auto-reconnect and heartbeat
- Support private chat and group messages
- OneBot v11 API wrapper (send, receive, group management)
- Onboarding wizard for CLI configuration
- Multi-account support
- 156 unit tests (accounts, client, api, send, monitor, normalize, connection)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 16:38:24 +08:00

99 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* QQ Send Message Test
*
* Tests sending a message via OneBot API.
* Usage: npx tsx extensions/qq/test-send.ts <target> <message>
*
* Examples:
* npx tsx extensions/qq/test-send.ts 123456789 "Hello!"
* npx tsx extensions/qq/test-send.ts group:740112783 "Hello group!"
*/
import WebSocket from "ws";
const WS_URL = "ws://127.0.0.1:3001";
// Parse arguments
const args = process.argv.slice(2);
if (args.length < 2) {
console.log("Usage: npx tsx extensions/qq/test-send.ts <target> <message>");
console.log("");
console.log("Examples:");
console.log(' npx tsx extensions/qq/test-send.ts 123456789 "Hello!"');
console.log(' npx tsx extensions/qq/test-send.ts group:740112783 "Hello group!"');
process.exit(1);
}
const [target, ...messageParts] = args;
const message = messageParts.join(" ");
// Parse target
const isGroup = target.startsWith("group:");
const targetId = isGroup ? Number(target.slice(6)) : Number(target);
if (Number.isNaN(targetId)) {
console.error("❌ Invalid target ID:", target);
process.exit(1);
}
console.log(`\n🔌 Connecting to NapCat at ${WS_URL}...`);
const ws = new WebSocket(WS_URL);
ws.on("open", () => {
console.log("✅ Connected!\n");
const action = isGroup ? "send_group_msg" : "send_private_msg";
const params = isGroup
? { group_id: targetId, message: [{ type: "text", data: { text: message } }] }
: { user_id: targetId, message: [{ type: "text", data: { text: message } }] };
const request = {
action,
params,
echo: "test_send"
};
console.log(`📤 Sending ${isGroup ? "group" : "private"} message to ${targetId}...`);
console.log(` Content: "${message}"`);
ws.send(JSON.stringify(request));
});
ws.on("message", (data) => {
try {
const response = JSON.parse(data.toString());
if (response.echo === "test_send") {
if (response.status === "ok") {
console.log(`\n✅ Message sent successfully!`);
console.log(` Message ID: ${response.data?.message_id}`);
} else {
console.log(`\n❌ Failed to send message:`);
console.log(` Error: ${response.message || response.wording || "Unknown error"}`);
console.log(` Retcode: ${response.retcode}`);
}
setTimeout(() => {
ws.close();
}, 500);
}
} catch {
// Ignore parse errors
}
});
ws.on("error", (error) => {
console.error("\n❌ Connection error:", error.message);
process.exit(1);
});
ws.on("close", () => {
console.log("\n👋 Done!");
process.exit(0);
});
setTimeout(() => {
console.log("\n⏱ Timeout");
ws.close();
}, 10000);