Regional platforms
Bot QQ
QQ Bot łączy się z OpenClaw za pośrednictwem oficjalnego API QQ Bot (Gateway WebSocket).
Prywatne czaty C2C i @-wzmianki w grupach są podstawowymi typami czatów, z obsługą multimediów
(obrazów, głosu, wideo i plików). Wiadomości w kanałach gildii obsługują tylko
tekst i obrazy ze zdalnych adresów URL; głos, wideo, przesyłanie plików oraz obrazy
lokalne/Base64 nie są dostępne w kanałach gildii. Reakcje i wątki nie są
nigdzie obsługiwane.
Status: oficjalny Plugin do pobrania.
Instalacja
openclaw plugins install @openclaw/qqbotKonfiguracja początkowa
- Przejdź do QQ Open Platform i zeskanuj kod QR za pomocą aplikacji QQ na telefonie, aby się zarejestrować / zalogować.
- Kliknij Create Bot, aby utworzyć nowego bota QQ.
- Znajdź AppID i AppSecret na stronie ustawień bota i skopiuj je.
- Dodaj kanał:
openclaw channels add --channel qqbot --token "AppID:AppSecret"- Uruchom ponownie Gateway.
Konfiguracja interaktywna:
openclaw channels addKreator umożliwia również powiązanie za pomocą kodu QR zamiast ręcznego wprowadzania AppID/AppSecret: zeskanuj kod aplikacją na telefonie powiązaną z docelowym QQ Bot, aby zakończyć powiązanie. OpenClaw zapisuje zwrócone dane uwierzytelniające w zakresie konfiguracji konta.
Konfiguracja
Konfiguracja minimalna:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: "YOUR_APP_SECRET", }, },}Zmienne środowiskowe konta domyślnego (tylko konto najwyższego poziomu):
QQBOT_APP_IDQQBOT_CLIENT_SECRET
AppSecret przechowywany w pliku:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecretFile: "/path/to/qqbot-secret.txt", }, },}AppSecret jako SecretRef ze zmiennej środowiskowej:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: { source: "env", provider: "default", id: "QQBOT_CLIENT_SECRET" }, }, },}Uwagi:
openclaw channels add --channel qqbot --token-file ...ustawia tylko AppSecret;appIdmusi już być ustawione w konfiguracji lubQQBOT_APP_ID.clientSecretprzyjmuje ciąg zwykłego tekstu, ścieżkę pliku (clientSecretFile) albo ustrukturyzowany obiekt SecretRef.- Starsze ciągi znaczników
secretref:.../secretref-env:...są odrzucane dlaclientSecret; zamiast nich należy użyć ustrukturyzowanego obiektu SecretRef.
Strumieniowanie
{ channels: { qqbot: { streaming: { mode: "partial", // strumieniowanie bloków: "partial" (domyślnie) lub "off" nativeTransport: true, // użyj oficjalnego API stream_messages QQ dla wiadomości prywatnych C2C }, }, },}streaming.mode: "off"wyłącza strumieniowanie bloków dla konta.streaming.nativeTransport: trueprzesyła odpowiedzi C2C (wiadomości prywatne) strumieniowo przez oficjalne APIstream_messagesQQ; nie wpływa to na cele grupowe/kanałowe.- Starsze wartości skalarne
streaming: true|falsei kluczstreaming.c2cStreamApisą migrowane do tej struktury za pomocąopenclaw doctor --fix. /bot-streaming on|offprzełącza tę samą konfigurację z poziomu wiadomości prywatnej.
Zasady dostępu
allowFrom/groupAllowFromokreślają, kto może rozmawiać z botem w kontekście C2C / grupy.dmPolicy/groupPolicy(open|allowlist|disabled) sterują trybem egzekwowania.dmPolicyma domyślnie wartośćallowlist, gdyallowFromzawiera konkretny wpis (bez symbolu wieloznacznego), a w przeciwnym razieopen.groupPolicyma domyślnie wartośćallowlist, gdygroupAllowFromluballowFromzawiera konkretny wpis, a w przeciwnym razieopen.- Polecenia ukośnikowe „Auth: allowlist” wymagają jawnego wpisu bez symbolu wieloznacznego w
allowFrom(lubgroupAllowFromw przypadku wywołań grupowych), niezależnie oddmPolicy/groupPolicy— zobacz Polecenia ukośnikowe.
Konfiguracja wielu kont
Uruchamianie wielu botów QQ w jednej instancji OpenClaw:
{ channels: { qqbot: { enabled: true, appId: "111111111", clientSecret: "secret-of-bot-1", accounts: { bot2: { enabled: true, appId: "222222222", clientSecret: "secret-of-bot-2", }, }, }, },}Każde konto ma osobne połączenie WebSocket, klienta API i pamięć podręczną
tokenów, identyfikowane przez appId. Wiersze dziennika są oznaczane identyfikatorem konta właściciela,
dzięki czemu diagnostyka pozostaje rozdzielona podczas uruchamiania kilku botów w jednym Gateway.
Dodawanie drugiego bota za pomocą CLI:
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"Czaty grupowe
Obsługa grup używa identyfikatorów OpenID grup QQ, a nie nazw wyświetlanych. Dodaj bota do grupy, a następnie wspomnij o nim lub skonfiguruj grupę tak, aby działała bez wzmianki.
{ 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["*"] ustawia wartości domyślne dla każdej grupy; konkretny wpis groups.GROUP_OPENID
zastępuje te wartości domyślne dla jednej grupy. Ustawienia grupy:
| Pole | Wartość domyślna | Opis |
|---|---|---|
requireMention |
true |
Wymagaj @-wzmianki, zanim bot odpowie. |
commandLevel |
all |
Określa, które wbudowane polecenia ukośnikowe mogą działać w grupie (patrz niżej). |
ignoreOtherMentions |
false |
Odrzucaj wiadomości, które wspominają kogoś innego, ale nie bota. |
historyLimit |
50 |
Ostatnie wiadomości bez wzmianki zachowywane jako kontekst dla kolejnej tury ze wzmianką. 0 wyłącza historię. |
tools |
— | Zezwalaj na narzędzia lub odmawiaj dostępu do nich dla całej grupy. |
toolsBySender |
— | Nadpisania narzędzi dla poszczególnych nadawców; zobacz Grupy. |
name |
prefiks openid | Przyjazna etykieta używana w dziennikach i kontekście grupy. |
prompt |
wbudowana wartość domyślna | Monit zachowania dla danej grupy dołączany do kontekstu agenta. |
commandLevel przyjmuje:
| Poziom | Zachowanie |
|---|---|
all |
Istniejące wbudowane polecenia pozostają dostępne. Niektóre pozostają ukryte w menu, ale upoważnieni użytkownicy nadal mogą je uruchamiać w grupie. |
safety |
/help, /btw, /stop pozostają widoczne w grupie; poufne polecenia (/config, /tools, /bash itd.) muszą być uruchamiane na czacie prywatnym. |
strict |
Dozwolone są tylko mechanizmy sterowania sesją grupową niezbędne do ścisłego działania. /stop nadal działa, dzięki czemu upoważniony nadawca może przerwać aktywne uruchomienie. |
Stare wpisy QQBot toolPolicy zostały wycofane. Uruchom openclaw doctor --fix, aby zmigrować je do tools.
Tryby aktywacji to mention i always. requireMention: true odpowiada
mention; requireMention: false odpowiada always. Nadpisanie aktywacji
na poziomie sesji, jeśli istnieje, ma pierwszeństwo przed konfiguracją.
Kolejka przychodząca jest oddzielna dla każdego uczestnika. Uczestnicy grupowi mają większy limit kolejki (50 zamiast 20 dla uczestników bezpośrednich); po zapełnieniu kolejki wiadomości utworzone przez bota są usuwane przed wiadomościami ludzi, a serie zwykłych wiadomości grupowych są scalane w jedną turę z przypisanym autorstwem. Polecenia ukośnikowe są wykonywane pojedynczo, niezależnie od partii scalania.
Głos (STT / TTS)
STT i TTS obsługują dwupoziomową konfigurację z rezerwowym wyborem według priorytetu:
| Ustawienie | Specyficzne dla Pluginu | Rezerwowa konfiguracja frameworka |
|---|---|---|
| STT | channels.qqbot.stt |
tools.media.audio.models[0] |
| TTS | channels.qqbot.tts, channels.qqbot.accounts.<id>.tts |
messages.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" }, }, }, }, }, }, },}Ustaw enabled: false dla dowolnego z nich, aby go wyłączyć. Nadpisania TTS na poziomie konta używają
tej samej struktury co messages.tts i są głęboko scalane z konfiguracją TTS kanału/globalną.
Domyślny limit czasu żądań STT wynosi 60 sekund. STT specyficzne dla Pluginu używa
wybranego nadpisania models.providers.<id>.timeoutSeconds. STT dźwięku frameworka
używa kolejno tools.media.audio.models[0].timeoutSeconds,
tools.media.audio.timeoutSeconds, a następnie nadpisania wybranego dostawcy.
Przychodzące załączniki głosowe QQ są udostępniane agentom jako metadane multimediów audio,
a surowe pliki głosowe pozostają poza ogólnym MediaPaths. [[audio_as_voice]]
w odpowiedzi w postaci zwykłego tekstu syntetyzuje TTS i wysyła natywną wiadomość głosową QQ, gdy
TTS jest skonfigurowane.
Zachowanie przesyłania/transkodowania wychodzącego dźwięku można również dostosować za pomocą
channels.qqbot.audioFormatPolicy:
sttDirectFormatsuploadDirectFormatstranscodeEnabled
Formaty celów
| Format | Opis |
|---|---|
qqbot:c2c:OPENID |
Czat prywatny (C2C) |
qqbot:group:GROUP_OPENID |
Czat grupowy |
qqbot:channel:CHANNEL_ID |
Kanał gildii |
Polecenia ukośnikowe
Wbudowane polecenia przechwytywane przed kolejką AI:
| Polecenie | Autoryzacja | Zakres | Opis |
|---|---|---|---|
/bot-ping |
— | dowolny | Test opóźnienia |
/bot-help |
— | dowolny | Wyświetla wszystkie polecenia |
/bot-me |
— | tylko prywatny | Wyświetla identyfikator użytkownika QQ nadawcy (openid) na potrzeby konfiguracji allowFrom / groupAllowFrom |
/bot-version |
— | tylko prywatny | Wyświetla wersję frameworka OpenClaw i wersję pluginu |
/bot-upgrade |
— | tylko prywatny | Wyświetla link do przewodnika aktualizacji QQBot |
/bot-approve |
lista dozwolonych | tylko prywatny | Zarządza konfiguracją zatwierdzania wykonywania poleceń (włączone / wyłączone / zawsze / reset / status) |
/bot-logs |
lista dozwolonych | tylko prywatny | Eksportuje ostatnie logi Gateway jako plik |
/bot-clear-storage |
lista dozwolonych | tylko prywatny | Usuwa pobrane pliki z pamięci podręcznej w katalogu multimediów QQBot |
/bot-streaming |
lista dozwolonych | tylko prywatny | Przełącza strumieniowe odpowiedzi C2C |
/bot-group-allways |
lista dozwolonych | tylko prywatny | Przełącza domyślny tryb aktywacji grupowej (wymagana wzmianka lub zawsze aktywny) |
Do dowolnego polecenia można dodać ?, aby uzyskać pomoc dotyczącą jego użycia (na przykład /bot-upgrade ?).
Polecenia z „Autoryzacja: lista dozwolonych” wymagają ponadto, aby openid nadawcy znajdował się na
jawnej liście allowFrom bez symbolu wieloznacznego (groupAllowFrom ma pierwszeństwo dla
poleceń wydawanych w grupie, a w razie braku używane jest allowFrom). Symbol wieloznaczny
allowFrom: ["*"] zezwala na czat, ale nie na te polecenia. Uruchomienie jednego z nich
poza czatem prywatnym lub bez autoryzacji zwraca wskazówkę zamiast
po cichu odrzucać wiadomość.
/bot-me, /bot-version i /bot-upgrade są dostępne wyłącznie w czacie prywatnym, ale nie
wymagają listy dozwolonych — może je uruchomić dowolny nadawca C2C.
Gdy zatwierdzenia wykonywania poleceń QQ Bot korzystają z domyślnego mechanizmu rezerwowego w tym samym czacie, kliknięcia natywnych
przycisków zatwierdzania podlegają tej samej jawnej liście dozwolonych poleceń bez symbolu wieloznacznego. Aby
przyznać dostęp wyłącznie do zatwierdzania bez szerszego dostępu do poleceń, należy skonfigurować
channels.qqbot.execApprovals.approvers. Natywne zatwierdzanie wykonywania poleceń jest domyślnie
włączone.
Multimedia i pamięć masowa
- Przychodzące, wychodzące i przekazywane przez Gateway multimedia współdzielą jeden katalog główny ładunków w
~/.openclaw/media/qqbot(z uwzględnieniemOPENCLAW_HOME, jeśli jest ustawione), dzięki czemu wysyłane pliki, pobierane pliki i pamięci podręczne transkodowania pozostają w jednym chronionym katalogu. - Dostarczanie multimediów wzbogaconych do odbiorców C2C i grupowych odbywa się przez jedną ścieżkę
sendMedia. Pliki lokalne i bufory w pamięci o rozmiarze co najmniej 5 MiB korzystają z punktów końcowych QQ do przesyłania fragmentami; mniejsze ładunki oraz źródła w postaci zdalnych adresów URL/Base64 korzystają z jednorazowego interfejsu API przesyłania. - Jeśli aktualizacja na gorąco przerwie działanie Gateway przed zakończeniem zapisu
openclaw.json, przy następnym uruchomieniu plugin przywróci ostatnie znaneappId/clientSecretdla tego konta z wewnętrznej migawki (nigdy nie zastępując celowej zmiany konfiguracji), dzięki czemu ponowne skanowanie kodu QR nie jest wymagane.
Rozwiązywanie problemów
- Gateway nie uruchamia się / brak wiadomości przychodzących: należy sprawdzić, czy
appIdiclientSecretsą prawidłowe oraz czy bot jest włączony na platformie QQ Open Platform. Brak danych uwierzytelniających jest zgłaszany jako „QQBot nie jest skonfigurowany (brak appId lub clientSecret)”. - Konfiguracja za pomocą
--token-filenadal jest wyświetlana jako nieskonfigurowana:--token-fileustawia tylko AppSecret.appIdnadal musi być ustawione w konfiguracji lubQQBOT_APP_ID. - Serie odpowiedzi grupowych kolidują ze sobą: gdy kolejka uczestnika się zapełnia, kolejka przychodząca usuwa wiadomości utworzone przez bota przed wiadomościami utworzonymi przez ludzi i scala serie zwykłych (niebędących poleceniami) wiadomości grupowych w jedną turę z przypisanym autorstwem, dzięki czemu zalew komunikatów botów nie powinien blokować wiadomości od ludzi.
- Wiadomości proaktywne nie docierają: QQ może blokować wiadomości inicjowane przez bota, jeśli użytkownik nie nawiązał ostatnio interakcji.
- Głos nie jest transkrybowany: należy upewnić się, że STT jest skonfigurowane, a dostawca jest osiągalny.