Zalo (Bot API)
Status: eksperymentalny. Tylko wiadomości bezpośrednie; grupy wkrótce zgodnie z dokumentacją Zalo.Wymagana wtyczka
Zalo jest dostarczane jako wtyczka i nie jest dołączone do instalacji rdzenia.- Instalacja przez CLI:
openclaw plugins install @openclaw/zalo - Lub wybierz Zalo podczas onboardingu i potwierdź monit instalacji
- Szczegóły: Plugins
Szybka konfiguracja (dla początkujących)
- Zainstaluj wtyczkę Zalo:
- Z checkoutu źródeł:
openclaw plugins install ./extensions/zalo - Z npm (jeśli opublikowana):
openclaw plugins install @openclaw/zalo - Lub wybierz Zalo w onboardingu i potwierdź monit instalacji
- Z checkoutu źródeł:
- Ustaw token:
- Wpis:
ZALO_BOT_TOKEN=... - Lub konfiguracja:
channels.zalo.botToken: "...".
- Wpis:
- Zrestartuj gateway (lub zakończ onboarding).
- Dostęp do DM-ów domyślnie wymaga parowania; zatwierdź kod parowania przy pierwszym kontakcie.
Czym to jest
Zalo to komunikator skoncentrowany na Wietnamie; jego Bot API pozwala Gateway uruchamiać bota do rozmów 1:1. To dobre rozwiązanie do wsparcia lub powiadomień, gdy potrzebne jest deterministyczne kierowanie odpowiedzi z powrotem do Zalo.- Kanał Zalo Bot API należący do Gateway.
- Deterministyczne trasowanie: odpowiedzi wracają do Zalo; model nigdy nie wybiera kanałów.
- DM-y współdzielą główną sesję agenta.
- Grupy nie są jeszcze obsługiwane (dokumentacja Zalo wskazuje „coming soon”).
Konfiguracja (szybka ścieżka)
1. Utwórz token bota (Zalo Bot Platform)
- Przejdź do https://bot.zaloplatforms.com i zaloguj się.
- Utwórz nowego bota i skonfiguruj jego ustawienia.
- Skopiuj token bota (format:
12345689:abc-xyz).
2) Skonfiguruj token (env lub config)
Przykład:ZALO_BOT_TOKEN=... (działa tylko dla konta domyślnego).
Obsługa wielu kont: użyj channels.zalo.accounts z tokenami per konto oraz opcjonalnie name.
- Zrestartuj gateway. Zalo uruchamia się, gdy token zostanie rozpoznany (env lub config).
- Dostęp do DM-ów domyślnie wymaga parowania. Zatwierdź kod przy pierwszym kontakcie z botem.
Jak to działa (zachowanie)
- Wiadomości przychodzące są normalizowane do wspólnej koperty kanału z placeholderami mediów.
- Odpowiedzi zawsze wracają do tej samej rozmowy Zalo.
- Domyślnie długie odpytywanie (long-polling); tryb webhook dostępny z
channels.zalo.webhookUrl.
Limity
- Tekst wychodzący jest dzielony na fragmenty po 2000 znaków (limit API Zalo).
- Pobieranie/wysyłanie mediów jest ograniczone przez
channels.zalo.mediaMaxMb(domyślnie 5). - Strumieniowanie jest domyślnie zablokowane, ponieważ limit 2000 znaków czyni je mniej użytecznym.
Kontrola dostępu (DM-y)
Dostęp do DM-ów
- Domyślnie:
channels.zalo.dmPolicy = "pairing". Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do czasu zatwierdzenia (kody wygasają po 1 godzinie). - Zatwierdzanie przez:
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>
- Parowanie jest domyślną wymianą tokenów. Szczegóły: Pairing
channels.zalo.allowFromakceptuje numeryczne identyfikatory użytkowników (brak wyszukiwania po nazwie użytkownika).
Long-polling vs webhook
- Domyślnie: long-polling (nie wymaga publicznego URL).
- Tryb webhook: ustaw
channels.zalo.webhookUrlichannels.zalo.webhookSecret.- Sekret webhooka musi mieć 8–256 znaków.
- URL webhooka musi używać HTTPS.
- Zalo wysyła zdarzenia z nagłówkiem
X-Bot-Api-Secret-Tokendo weryfikacji. - HTTP Gateway obsługuje żądania webhooka pod
channels.zalo.webhookPath(domyślnie ścieżka URL webhooka).
Obsługiwane typy wiadomości
- Wiadomości tekstowe: pełna obsługa z dzieleniem na 2000 znaków.
- Wiadomości z obrazami: pobieranie i przetwarzanie obrazów przychodzących; wysyłanie obrazów przez
sendPhoto. - Naklejki: rejestrowane, ale nie w pełni przetwarzane (brak odpowiedzi agenta).
- Typy nieobsługiwane: rejestrowane (np. wiadomości od użytkowników chronionych).
Możliwości
| Funkcja | Status |
|---|---|
| Wiadomości bezpośrednie | ✅ Obsługiwane |
| Grupy | ❌ Wkrótce (wg dokumentacji Zalo) |
| Media (obrazy) | ✅ Obsługiwane |
| Reakcje | ❌ Nieobsługiwane |
| Wątki | ❌ Nieobsługiwane |
| Ankiety | ❌ Nieobsługiwane |
| Polecenia natywne | ❌ Nieobsługiwane |
| Strumieniowanie | ⚠️ Zablokowane (limit 2000 znaków) |
Cele dostarczania (CLI/cron)
- Użyj identyfikatora czatu jako celu.
- Przykład:
openclaw message send --channel zalo --target 123456789 --message "hi".
Rozwiązywanie problemów
Bot nie odpowiada:- Sprawdź, czy token jest prawidłowy:
openclaw channels status --probe - Zweryfikuj, czy nadawca jest zatwierdzony (parowanie lub allowFrom)
- Sprawdź logi gateway:
openclaw logs --follow
- Upewnij się, że URL webhooka używa HTTPS
- Zweryfikuj, że sekret ma 8–256 znaków
- Potwierdź, że punkt końcowy HTTP gateway jest osiągalny na skonfigurowanej ścieżce
- Sprawdź, czy polling getUpdates nie jest uruchomiony (są wzajemnie wykluczające się)
Referencja konfiguracji (Zalo)
Pełna konfiguracja: Configuration Opcje dostawcy:channels.zalo.enabled: włącz/wyłącz uruchamianie kanału.channels.zalo.botToken: token bota z Zalo Bot Platform.channels.zalo.tokenFile: odczyt tokena z pliku.channels.zalo.dmPolicy:pairing | allowlist | open | disabled(domyślnie: parowanie).channels.zalo.allowFrom: lista dozwolonych DM-ów (identyfikatory użytkowników).openwymaga"*". Kreator poprosi o identyfikatory numeryczne.channels.zalo.mediaMaxMb: limit mediów przychodzących/wychodzących (MB, domyślnie 5).channels.zalo.webhookUrl: włącz tryb webhook (wymagany HTTPS).channels.zalo.webhookSecret: sekret webhooka (8–256 znaków).channels.zalo.webhookPath: ścieżka webhooka na serwerze HTTP gateway.channels.zalo.proxy: URL proxy dla żądań API.
channels.zalo.accounts.<id>.botToken: token per konto.channels.zalo.accounts.<id>.tokenFile: plik tokena per konto.channels.zalo.accounts.<id>.name: nazwa wyświetlana.channels.zalo.accounts.<id>.enabled: włącz/wyłącz konto.channels.zalo.accounts.<id>.dmPolicy: polityka DM per konto.channels.zalo.accounts.<id>.allowFrom: lista dozwolonych per konto.channels.zalo.accounts.<id>.webhookUrl: URL webhooka per konto.channels.zalo.accounts.<id>.webhookSecret: sekret webhooka per konto.channels.zalo.accounts.<id>.webhookPath: ścieżka webhooka per konto.channels.zalo.accounts.<id>.proxy: URL proxy per konto.