Skip to content

QQ Bot

QQ Bot connects to OpenClaw via the official QQ Bot API (WebSocket gateway). The plugin supports C2C private chat, group @messages, and guild channel messages with rich media (images, voice, video, files).

Status: bundled channel plugin. Direct messages, group chats, guild channels, and media are supported. Reactions and threads are not supported.

Current OpenClaw installs bundle QQ Bot. You do not need a separate openclaw plugins install step for normal setup.

  1. Go to the QQ Open Platform and scan the QR code with your phone QQ to register / log in.
  2. Click Create Bot to create a new QQ bot.
  3. Find AppID and AppSecret on the bot’s settings page and copy them.

AppSecret is not stored in plaintext — if you leave the page without saving it, you’ll have to regenerate a new one.

  1. Add the channel:
Terminal window
openclaw channels add --channel qqbot --token "AppID:AppSecret"
  1. Restart the Gateway.

Interactive setup paths:

Terminal window
openclaw channels add
openclaw configure --section channels

Minimal config:

{
channels: {
qqbot: {
enabled: true,
appId: "YOUR_APP_ID",
clientSecret: "YOUR_APP_SECRET",
},
},
}

Default-account env vars:

  • QQBOT_APP_ID
  • QQBOT_CLIENT_SECRET

File-backed AppSecret:

{
channels: {
qqbot: {
enabled: true,
appId: "YOUR_APP_ID",
clientSecretFile: "/path/to/qqbot-secret.txt",
},
},
}

Notes:

  • Env fallback applies to the default QQ Bot account only.
  • openclaw channels add --channel qqbot --token-file ... provides the AppSecret only; the AppID must already be set in config or QQBOT_APP_ID.
  • clientSecret also accepts SecretRef input, not just a plaintext string.

Run multiple QQ bots under a single OpenClaw instance:

{
channels: {
qqbot: {
enabled: true,
appId: "111111111",
clientSecret: "secret-of-bot-1",
accounts: {
bot2: {
enabled: true,
appId: "222222222",
clientSecret: "secret-of-bot-2",
},
},
},
},
}

Each account launches its own WebSocket connection and maintains an independent token cache (isolated by appId).

Add a second bot via CLI:

Terminal window
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"

STT and TTS support two-level configuration with priority fallback:

SettingPlugin-specificFramework fallback
STTchannels.qqbot.stttools.media.audio.models[0]
TTSchannels.qqbot.ttsmessages.tts
{
channels: {
qqbot: {
stt: {
provider: "your-provider",
model: "your-stt-model",
},
tts: {
provider: "your-provider",
model: "your-tts-model",
voice: "your-voice",
},
},
},
}

Set enabled: false on either to disable.

Outbound audio upload/transcode behavior can also be tuned with channels.qqbot.audioFormatPolicy:

  • sttDirectFormats
  • uploadDirectFormats
  • transcodeEnabled
FormatDescription
qqbot:c2c:OPENIDPrivate chat (C2C)
qqbot:group:GROUP_OPENIDGroup chat
qqbot:channel:CHANNEL_IDGuild channel

Each bot has its own set of user OpenIDs. An OpenID received by Bot A cannot be used to send messages via Bot B.

Built-in commands intercepted before the AI queue:

CommandDescription
/bot-pingLatency test
/bot-versionShow the OpenClaw framework version
/bot-helpList all commands
/bot-upgradeShow the QQBot upgrade guide link
/bot-logsExport recent gateway logs as a file

Append ? to any command for usage help (for example /bot-upgrade ?).

  • Bot replies “gone to Mars”: credentials not configured or Gateway not started.
  • No inbound messages: verify appId and clientSecret are correct, and the bot is enabled on the QQ Open Platform.
  • Setup with --token-file still shows unconfigured: --token-file only sets the AppSecret. You still need appId in config or QQBOT_APP_ID.
  • Proactive messages not arriving: QQ may intercept bot-initiated messages if the user hasn’t interacted recently.
  • Voice not transcribed: ensure STT is configured and the provider is reachable.