WhatsApp Group Monitoring — jak to działa

Architektura przepływu wiadomości

WhatsApp → WAHA (port 13000, NOWEB engine)
              ↓ webhook (globalny, ALL groups)
         n8n webhook /wa-router
              ↓ każda wiadomość z każdej grupy
         Supabase: whatsapp_messages (status = 'new')
              ↓ co 5 min (n8n: wa-ai-to-inbox)
         Claude AI → p24_l_emails_inbox

Co jest w pełni automatyczne (zero akcji)

Zbieranie wiadomości

Gdy numer zostanie dodany do nowej grupy WhatsApp — wiadomości z tej grupy automatycznie trafiają do Supabase bez żadnej konfiguracji.

Dlaczego: webhook WAHA (WHATSAPP_HOOK_URL) jest globalny — dotyczy CAŁEJ sesji, nie pojedynczych grup. Każda wiadomość z każdej grupy wywołuje ten webhook i ląduje w tabeli whatsapp_messages.

Konfiguracja webhooka (docker-compose.yml, kontener waha):

WHATSAPP_HOOK_URL=https://n8n.vps-h1.infra.zintegrowana.online/webhook/wa-router
WHATSAPP_HOOK_EVENTS=message,message.any,session.status

Co zawiera każdy rekord w whatsapp_messages

KolumnaPrzykładŹródło
idtrue_120363411900921854@g.us_...WA message ID
chat_id120363411900921854@g.usJID grupy
sender4915785573196@c.usJID nadawcy
sender_nameRadekNazwa z książki kontaktowej WAHA
bodyMam usterkę monitoraTreść
has_mediatrueCzy jest zdjęcie/film
statusnewDo przetworzenia przez AI

Co wymaga ręcznej akcji — rejestr grup

Tabela whatsapp_groups to rejestr do zarządzania (aliasy, flaga monitored). Sama w sobie nie wpływa na zbieranie wiadomości — ale AI processing (n8n flow wa-ai-to-inbox) przetwarza tylko grupy z monitored = true.

Jeśli grup nie ma w rejestrze → wiadomości są zbierane, ale nie trafiają do p24_l_emails_inbox dopóki nie dodasz grupy.

Jak dodać nową grupę (1-2 min)

Krok 1 — znajdź JID grupy

Opcja A — przez WAHA API (polecana, zwraca wszystkie znane grupy naraz):

# Z VPS (SSH):
curl -s 'http://127.0.0.1:13000/api/default/groups' \
  -H "X-Api-Key: $WAHA_API_KEY" | python3 -m json.tool

Odpowiedź: słownik {JID → {subject, ...}}. Szukaj po nazwie grupy.

Opcja B — z Supabase: wyślij wiadomość testową w grupie, a chat_id pojawi się automatycznie w whatsapp_messages.

Krok 2 — dodaj do rejestru

INSERT INTO whatsapp_groups (id, name, alias, monitored, description)
VALUES (
  '120363XXXXXXXXXX@g.us',   -- JID z WAHA
  'Nazwa grupy WA',           -- dokładna nazwa z WhatsApp
  'moj-alias',                -- krótki alias używany w platformie (unikalny)
  true,
  'Opis — opcjonalny'
);

Przez Supabase Dashboard → Table Editor → whatsapp_groups → Insert row.

Krok 3 — nic więcej

Wiadomości z tej grupy ze statusem new będą przetwarzane przez AI przy następnym uruchomieniu cron (co 5 min).


Dla 30 grup — auto-sync skrypt

Zamiast dodawać każdą grupę ręcznie możesz uruchomić skrypt który zsynchronizuje wszystkie grupy z WAHA do Supabase. Grupy już w rejestrze są pomijane (ON CONFLICT DO NOTHING).

Skrypt sync (uruchom raz z dowolnej maszyny z dostępem SSH do VPS)

import paramiko, json, requests
 
# SSH do VPS → WAHA API
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('72.60.32.61', port=22, username='root',
               key_filename=r'C:\Users\konar\.ssh\id_ed25519')
 
_, stdout, _ = client.exec_command(
    'curl -s http://127.0.0.1:13000/api/default/groups '
    '-H "X-Api-Key: FT0rwjdMvXzBtOyRYcAgN1sqlhZW7f32IDUa5QGn"'
)
groups = json.loads(stdout.read())
client.close()
 
# Supabase REST API
SUPABASE_URL = "https://mwkqmgadqnkkihjdeqsi.supabase.co"
SUPABASE_KEY = "<SUPABASE_SERVICE_ROLE_KEY>"  # z .env.local
 
headers = {
    "apikey": SUPABASE_KEY,
    "Authorization": f"Bearer {SUPABASE_KEY}",
    "Content-Type": "application/json",
    "Prefer": "resolution=ignore-duplicates"  # pomija istniejące
}
 
rows = []
for jid, g in groups.items():
    subject = g.get('subject', '')
    # Auto-alias: lowercase, spacje → myślniki
    alias = subject.lower().replace(' ', '-').replace('ä','ae').replace('ö','oe').replace('ü','ue')[:40]
    rows.append({
        "id": jid,
        "name": subject,
        "alias": alias,
        "monitored": True,
        "description": f"Auto-sync {jid}"
    })
 
resp = requests.post(
    f"{SUPABASE_URL}/rest/v1/whatsapp_groups",
    headers=headers,
    json=rows
)
print(f"Sync result: {resp.status_code}")
for r in rows:
    print(f"  {r['id']} | {r['name']} → alias: {r['alias']}")

Po imporcie możesz przejrzeć aliasy w Supabase i zmienić je na bardziej przyjazne.


Scenariusze

Numer dodany do nowej grupy

AkcjaAutomatyczne?
Wiadomości zbierane w whatsapp_messagesTAK — od razu
Wiadomości przetwarzane przez AINIE — dopóki nie dodasz do whatsapp_groups
Dodanie do whatsapp_groupsręcznie lub auto-sync skryptem

Numer usunięty z grupy

Wiadomości z tej grupy przestają przychodzić. Możesz ustawić monitored = false w rejestrze żeby oznaczyć jako nieaktywną — wiadomości w bazie pozostają.

Chcesz chwilowo wyłączyć przetwarzanie jednej grupy (bez usuwania danych)

UPDATE whatsapp_groups SET monitored = false WHERE alias = 'awarie-dhl';

Aktualny stan rejestru (2026-05-09)

AliasNazwa WAJID
zgloszeniaet-operational-platform-zgloszenia120363411900921854@g.us
awarie-dhlAwarie dhl poczta4915224462971-1584089694@g.us
awarieAwarie4915253015583-1548075046@g.us
dp-eutingen-awarieDeutsche Post Eutingen Awarie120363401944773725@g.us

Jak sprawdzić które grupy są wykryte przez WAHA (bez SSH)

Przez n8n — w każdej chwili możesz uruchomić HTTP Request node:

GET https://waha2.vps-h1.infra.zintegrowana.online/api/default/groups
Header: X-Api-Key: <WAHA_API_KEY>

Podsumowanie dla 30 grup

  1. Dodaj numer do wszystkich 30 grup w WhatsApp — wiadomości zaczną spływać automatycznie
  2. Uruchom raz skrypt auto-sync (powyżej) — wszystkie 30 grup pojawią się w whatsapp_groups
  3. Przejrzyj aliasy w Supabase i popraw jeśli trzeba
  4. Gotowe — AI processing uruchomi się automatycznie dla wszystkich

Nie musisz nic restartować ani rekonfigurować WAHA/n8n.