Regional platforms
ربات QQ
QQ Bot از طریق API رسمی QQ Bot (Gateway مبتنی بر WebSocket) به OpenClaw متصل میشود.
گفتوگوی خصوصی C2C و اشارههای @ در گروه، انواع اصلی گفتوگو هستند و از رسانههای
غنی (تصویر، صدا، ویدئو، فایل) پشتیبانی میکنند. پیامهای کانال انجمن فقط برای
متن و تصاویر دارای URL راه دور پشتیبانی میشوند؛ صدا، ویدئو، بارگذاری فایل و تصاویر
محلی/Base64 در کانالهای انجمن در دسترس نیستند. واکنشها و رشتهها در
هیچجا پشتیبانی نمیشوند.
وضعیت: Plugin رسمی قابل دانلود.
نصب
openclaw plugins install @openclaw/qqbotراهاندازی
- به پلتفرم باز QQ بروید و برای ثبتنام / ورود، کد QR را با QQ تلفن خود اسکن کنید.
- برای ایجاد یک ربات QQ جدید، روی Create Bot کلیک کنید.
- در صفحه تنظیمات ربات، AppID و AppSecret را پیدا و کپی کنید.
- کانال را اضافه کنید:
openclaw channels add --channel qqbot --token "AppID:AppSecret"- Gateway را راهاندازی مجدد کنید.
دوام ورودی
برای رویدادهای نوبت Gateway در QQ، OpenClaw پیش از جلو بردن توالی ذخیرهشده ازسرگیری Gateway، رویداد خام را ماندگار میکند. نوبتهای در انتظار یا قابل تلاش مجدد پس از راهاندازی مجدد Gateway باقی میمانند، برای هر مکالمه بهصورت سریالی اجرا میشوند و تا زمانی که رکورد تکمیل فعال یا نگهداریشده وجود دارد، از شناسه رویداد ارائهدهنده برای جلوگیری از ورودیهای تکراری صف استفاده میکنند.
اگر پذیرش پایدار ناموفق باشد، OpenClaw سوکت فعلی Gateway را بدون جلو بردن توالی خاتمه میدهد. سپس مسیر اتصال مجدد/ازسرگیری میتواند رویداد ثبتنشده را دوباره درخواست کند. تحویل در مرز صف به عامل همچنان حداقل یکبار انجام میشود؛ بنابراین خرابی هنگام واگذاری میتواند یک نوبت را دوباره پخش کند.
راهاندازی تعاملی:
openclaw channels addویزارد همچنین اتصال با کد QR را بهعنوان جایگزینی برای واردکردن دستی AppID/AppSecret ارائه میدهد: برای تکمیل اتصال، کد را با برنامه تلفن مرتبط با QQ Bot مقصد اسکن کنید. OpenClaw اعتبارنامههای بازگرداندهشده را در محدوده پیکربندی حساب ماندگار میکند.
پیکربندی
پیکربندی حداقلی:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: "YOUR_APP_SECRET", }, },}متغیرهای محیطی حساب پیشفرض (فقط حساب سطح بالا):
QQBOT_APP_IDQQBOT_CLIENT_SECRET
AppSecret مبتنی بر فایل:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecretFile: "/path/to/qqbot-secret.txt", }, },}AppSecret از نوع SecretRef محیطی:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: { source: "env", provider: "default", id: "QQBOT_CLIENT_SECRET" }, }, },}نکتهها:
openclaw channels add --channel qqbot --token-file ...فقط AppSecret را تنظیم میکند؛appIdباید از قبل در پیکربندی یاQQBOT_APP_IDتنظیم شده باشد.clientSecretیک رشته متن ساده، مسیر فایل (clientSecretFile) یا شیء ساختیافته SecretRef را میپذیرد.- رشتههای نشانگر قدیمی
secretref:.../secretref-env:...برایclientSecretرد میشوند؛ بهجای آن از یک شیء ساختیافته SecretRef استفاده کنید.
جریاندهی
{ channels: { qqbot: { streaming: { mode: "partial", // جریاندهی بلوکی: "partial" (پیشفرض) یا "off" nativeTransport: true, // استفاده از API رسمی stream_messages در QQ برای پیامهای خصوصی C2C }, }, },}streaming.mode: "off"جریاندهی بلوکی را برای حساب غیرفعال میکند.streaming.nativeTransport: trueپاسخهای C2C (پیام خصوصی) را از طریق API رسمیstream_messagesدر QQ جریاندهی میکند؛ مقصدهای گروه/کانال تحت تأثیر قرار نمیگیرند.- مقادیر اسکالر قدیمی
streaming: true|falseو کلیدstreaming.c2cStreamApiاز طریقopenclaw doctor --fixبه این ساختار مهاجرت میکنند. /bot-streaming on|offهمین پیکربندی را از یک پیام خصوصی تغییر میدهد.
سیاست دسترسی
allowFrom/groupAllowFromتعیین میکنند چه کسی میتواند در زمینههای C2C / گروه با ربات گفتوگو کند.dmPolicy/groupPolicy (open|allowlist|disabled) حالت اعمال را کنترل میکنند. وقتیallowFromیک ورودی مشخص (غیرعام) داشته باشد،dmPolicyبهطور پیشفرضallowlistاست؛ در غیر این صورتopen. وقتیgroupAllowFromیاallowFromیک ورودی مشخص داشته باشد،groupPolicyبهطور پیشفرضallowlistاست؛ در غیر این صورتopen.- فرمانهای اسلش «Auth: allowlist» صرفنظر از
dmPolicy/groupPolicyبه یک ورودی صریح غیرعام درallowFrom(یا برای فراخوانیهای گروهی درgroupAllowFrom) نیاز دارند — به فرمانهای اسلش مراجعه کنید.
راهاندازی چندحسابی
چند ربات QQ را زیر یک نمونه OpenClaw اجرا کنید:
{ channels: { qqbot: { enabled: true, appId: "111111111", clientSecret: "secret-of-bot-1", accounts: { bot2: { enabled: true, appId: "222222222", clientSecret: "secret-of-bot-2", }, }, }, },}هر حساب مالک یک اتصال WebSocket، کلاینت API و حافظه نهان توکن
مجزاست که با appId کلیدگذاری میشود. خطوط گزارش با شناسه حساب مالک برچسبگذاری میشوند تا
هنگام اجرای چند ربات زیر یک Gateway، دادههای تشخیصی از هم تفکیکپذیر بمانند.
افزودن ربات دوم از طریق CLI:
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"گفتوگوهای گروهی
پشتیبانی گروه از OpenIDهای گروه QQ استفاده میکند، نه نامهای نمایشی. ربات را به یک گروه اضافه کنید، سپس به آن اشاره کنید یا گروه را برای اجرا بدون اشاره پیکربندی کنید.
{ channels: { qqbot: { groupPolicy: "allowlist", groupAllowFrom: ["member_openid"], groups: { "*": { requireMention: true, commandLevel: "all", historyLimit: 50, tools: { deny: ["exec", "read", "write"] }, }, GROUP_OPENID: { name: "Release room", requireMention: false, ignoreOtherMentions: true, commandLevel: "safety", historyLimit: 20, prompt: "Keep replies short and operational.", }, }, }, },}groups["*"] مقادیر پیشفرض را برای همه گروهها تنظیم میکند؛ یک ورودی مشخص groups.GROUP_OPENID
این مقادیر پیشفرض را برای یک گروه بازنویسی میکند. تنظیمات گروه:
| فیلد | پیشفرض | توضیحات |
|---|---|---|
requireMention |
true |
پیش از پاسخدادن ربات، یک اشاره @ لازم است. |
commandLevel |
all |
کدام فرمانهای اسلش داخلی میتوانند در گروه اجرا شوند (پایین را ببینید). |
ignoreOtherMentions |
false |
پیامهایی را که به شخص دیگری اشاره میکنند اما به ربات نه، حذف میکند. |
historyLimit |
50 |
پیامهای اخیر بدون اشاره که بهعنوان زمینه برای نوبت اشارهشده بعدی نگه داشته میشوند. 0 تاریخچه را غیرفعال میکند. |
tools |
— | ابزارها را برای کل گروه مجاز/غیرمجاز میکند. |
toolsBySender |
— | بازنویسی ابزار بهازای هر فرستنده؛ به گروهها مراجعه کنید. |
name |
پیشوند openid | برچسب خوانایی که در گزارشها و زمینه گروه استفاده میشود. |
prompt |
پیشفرض داخلی | پرامپت رفتار مختص گروه که به زمینه عامل افزوده میشود. |
commandLevel موارد زیر را میپذیرد:
| سطح | رفتار |
|---|---|
all |
فرمانهای داخلی موجود همچنان در دسترس میمانند. برخی از منوها پنهان میمانند، اما کاربران مجاز همچنان میتوانند آنها را در گروه اجرا کنند. |
safety |
/help، /btw، /stop در گروه قابل مشاهده میمانند؛ فرمانهای حساس (/config، /tools، /bash و غیره) باید در گفتوگوی خصوصی اجرا شوند. |
strict |
فقط کنترلهای نشست گروهی موردنیاز برای عملیات سختگیرانه مجاز هستند. /stop همچنان کار میکند تا فرستنده مجاز بتواند اجرای فعال را متوقف کند. |
ورودیهای قدیمی toolPolicy در QQBot بازنشسته شدهاند. برای مهاجرت آنها به tools، دستور openclaw doctor --fix را اجرا کنید.
حالتهای فعالسازی mention و always هستند. requireMention: true به
mention نگاشت میشود؛ requireMention: false به always نگاشت میشود. بازنویسی فعالسازی
در سطح نشست، در صورت وجود، بر پیکربندی اولویت دارد.
صف ورودی بهازای هر همتاست. همتاهای گروهی سقف صف بزرگتری دارند (50 در برابر 20 برای همتاهای مستقیم)، هنگام پرشدن ابتدا پیامهای نوشتهشده توسط ربات را پیش از پیامهای انسانی بیرون میاندازند و موج پیامهای عادی گروه را در یک نوبت دارای انتساب ادغام میکنند. فرمانهای اسلش یکییکی و مستقل از هر دسته ادغام اجرا میشوند.
صدا (STT / TTS)
STT و TTS از پیکربندی دوسطحی با اولویت بازگشتی پشتیبانی میکنند:
| تنظیم | مختص Plugin | بازگشت چارچوب |
|---|---|---|
| STT | channels.qqbot.stt |
نخستین ورودی tools.media.models[] با قابلیت صوتی |
| TTS | channels.qqbot.tts، channels.qqbot.accounts.<id>.tts |
tts |
{ channels: { qqbot: { stt: { provider: "your-provider", model: "your-stt-model", }, tts: { provider: "your-provider", model: "your-tts-model", voice: "your-voice", }, accounts: { "qq-main": { tts: { providers: { openai: { voice: "shimmer" }, }, }, }, }, }, },}برای غیرفعالکردن، enabled: false را روی هرکدام تنظیم کنید. بازنویسیهای TTS در سطح حساب از
همان ساختار tts استفاده میکنند و بهصورت عمیق روی پیکربندی TTS کانال/سراسری ادغام میشوند.
درخواستهای STT بهطور پیشفرض پس از 60 ثانیه منقضی میشوند. STT مختص Plugin از
بازنویسی انتخابشده models.providers.<id>.timeoutSeconds استفاده میکند. STT صوتی چارچوب
ابتدا از timeoutSeconds ورودی انتخابشده tools.media.models[] دارای قابلیت صوتی و سپس از بازنویسی ارائهدهنده انتخابشده استفاده میکند.
پیوستهای صوتی ورودی QQ بهصورت فراداده رسانه صوتی در اختیار عاملها قرار میگیرند،
درحالیکه فایلهای خام صوتی خارج از MediaPaths عمومی نگه داشته میشوند. [[audio_as_voice]]
در یک پاسخ متن ساده، در صورت پیکربندی TTS، گفتار را ترکیب میکند و یک پیام صوتی بومی QQ میفرستد.
رفتار بارگذاری/تبدیلکد صوت خروجی را نیز میتوان با
channels.qqbot.audioFormatPolicy تنظیم کرد:
sttDirectFormatsuploadDirectFormatstranscodeEnabled
قالبهای مقصد
| قالب | توضیحات |
|---|---|
qqbot:c2c:OPENID |
گفتوگوی خصوصی (C2C) |
qqbot:group:GROUP_OPENID |
گفتوگوی گروهی |
qqbot:channel:CHANNEL_ID |
کانال انجمن |
فرمانهای اسلش
فرمانهای داخلی که پیش از صف هوش مصنوعی رهگیری میشوند:
| فرمان | احراز هویت | دامنه | توضیحات |
|---|---|---|---|
/bot-ping |
— | همه | آزمون تأخیر |
/bot-help |
— | همه | فهرستکردن همه فرمانها |
/bot-me |
— | فقط خصوصی | نمایش شناسه کاربری QQ فرستنده (openid) برای راهاندازی allowFrom / groupAllowFrom |
/bot-version |
— | فقط خصوصی | نمایش نسخه چارچوب OpenClaw و نسخه Plugin |
/bot-upgrade |
— | فقط خصوصی | نمایش پیوند راهنمای ارتقای QQBot |
/bot-approve |
فهرست مجاز | فقط خصوصی | مدیریت پیکربندی تأیید اجرای فرمان (روشن / خاموش / همیشه / بازنشانی / وضعیت) |
/bot-logs |
فهرست مجاز | فقط خصوصی | برونبری گزارشهای اخیر Gateway بهصورت فایل |
/bot-clear-storage |
فهرست مجاز | فقط خصوصی | حذف بارگیریهای ذخیرهشده در حافظه نهان در پوشه رسانه QQBot |
/bot-streaming |
فهرست مجاز | فقط خصوصی | تغییر وضعیت پاسخهای جریانی C2C |
/bot-group-allways |
فهرست مجاز | فقط خصوصی | تغییر حالت پیشفرض فعالسازی گروه (نیازمند اشاره در برابر همیشه فعال) |
برای راهنمای استفاده، ? را به هر فرمانی بیفزایید (برای مثال /bot-upgrade ?).
فرمانهای «احراز هویت: فهرست مجاز» علاوهبراین مستلزم آناند که openid فرستنده در یک
فهرست صریح و بدون نویسه عام allowFrom باشد (groupAllowFrom برای فرمانهای
صادرشده از گروه اولویت دارد و در صورت نبود، از allowFrom استفاده میشود). نویسه عام
allowFrom: ["*"] گپ را مجاز میکند، اما این فرمانها را نه. اجرای یکی از آنها
خارج از گپ خصوصی یا بدون مجوز، بهجای
نادیدهگرفتن بیصدای پیام، راهنمایی برمیگرداند.
/bot-me، /bot-version و /bot-upgrade فقط مخصوص گپ خصوصی هستند، اما
به فهرست مجاز نیاز ندارند — هر فرستنده C2C میتواند آنها را اجرا کند.
وقتی تأییدهای اجرای QQ Bot از حالت بازگشت پیشفرض به همان گپ استفاده میکنند، کلیک روی دکمه
بومی تأیید از همان فهرست مجاز صریح و بدون نویسه عام فرمان پیروی میکند. برای
اعطای دسترسی فقط جهت تأیید، بدون دسترسی گستردهتر به فرمانها،
channels.qqbot.execApprovals.approvers را پیکربندی کنید. تأییدهای بومی اجرا بهطور
پیشفرض فعالاند.
رسانه و ذخیرهسازی
- رسانه ورودی، خروجی و پل Gateway، یک ریشه محموله مشترک در
~/.openclaw/media/qqbotدارند (در صورت تنظیم،OPENCLAW_HOMEرعایت میشود)، بنابراین بارگذاریها، بارگیریها و حافظههای نهان تبدیل کدک همگی در یک پوشه محافظتشده نگهداری میشوند. - تحویل رسانه غنی برای مقصدهای C2C و گروهی از یک مسیر
sendMediaعبور میکند. فایلهای محلی و بافرهای درونحافظهای با اندازه 5 MiB یا بیشتر از نقاط پایانی بارگذاری قطعهای QQ استفاده میکنند؛ محمولههای کوچکتر و منابع URL راهدور/Base64 از API بارگذاری یکمرحلهای استفاده میکنند. - اگر ارتقای گرم پیش از پایان نوشتن
openclaw.json، Gateway را متوقف کند، Plugin در شروع بعدی آخرینappId/clientSecretشناختهشده آن حساب را از یک تصویر لحظهای داخلی بازیابی میکند (بدون آنکه هرگز یک تغییر عمدی پیکربندی را بازنویسی کند)، بنابراین اسکن دوباره کد QR ضروری نیست.
عیبیابی
- Gateway راهاندازی نمیشود / پیام ورودی وجود ندارد: بررسی کنید
appIdوclientSecretدرست باشند و ربات در QQ Open Platform فعال شده باشد. نبود اعتبارنامه با پیام «QQBot پیکربندی نشده است (appId یا clientSecret وجود ندارد)» نمایش داده میشود. - راهاندازی با
--token-fileهمچنان وضعیت پیکربندینشده را نشان میدهد:--token-fileفقط AppSecret را تنظیم میکند.appIdهمچنان باید در پیکربندی یاQQBOT_APP_IDتنظیم شود. - پاسخهای انفجاری گروه با هم تداخل میکنند: وقتی صف یک همتا پر میشود، صف ورودی پیامهای نوشتهشده توسط ربات را پیش از پیامهای انسانی حذف میکند و موج پیامهای عادی (غیرفرمانی) گروه را در یک نوبت منتسبشده ادغام میکند؛ بنابراین هجوم گفتوگوی ربات نباید پیامهای انسانی را از پردازش محروم کند.
- پیامهای پیشدستانه نمیرسند: اگر کاربر اخیراً تعاملی نداشته باشد، QQ ممکن است پیامهای آغازشده توسط ربات را مسدود کند.
- صدا رونویسی نمیشود: اطمینان حاصل کنید STT پیکربندی شده و ارائهدهنده در دسترس است.