
🤖 Skapa en Viber-bot i PHP i 6 steg: komplett guide
En användare skriver i Viber, och ingen svarar. Ett välbekant scenario för småföretag: en manager, tre meddelandeappar, och kunderna går till dem som svarade först. En chatbot löser problemet radikalt: den jobbar dygnet runt, blir inte trött och reagerar direkt.
Tidigare, före februari 2024, kunde man sätta upp en enkel Viber-bot gratis på en halvtimme. Nu är reglerna annorlunda. Viber har helt flyttat bottar till en kommersiell grund, du får ingen token utan en officiell ansökan och en partner. Men om du redan har ett publikt konto (eller håller på att sätta upp det just nu), är den tekniska delen, samma sex steg i PHP, oförändrad. Vi har gått hela vägen från token till anpassat tangentbord och visar varje steg.
💡 Snabb översikt:
- Du skapar ett publikt Viber-konto och får en autentiseringstoken: nu skickas den i HTTP-headern, inte i JSON-brödtexten
- Du sätter upp en webhook med ett HTTPS-certifikat och skriver en PHP-hanterare för inkommande callback-förfrågningar
- Du implementerar mottagning av meddelanden och sändning av svar via send message-API:et: text, bilder, filer
- Du lägger till ett anpassat tangentbord med snabbsvars- och länkknappar, det främsta navigationsverktyget inuti botten
- Du skriver kod för den aktuella versionen 7.3 av Viber REST API, inte för föråldrade guider från 2017
Steg 1. Skapa ett publikt Viber-konto
Första steget är att skaffa ett publikt konto (public account, PA). Sedan 5 februari 2024 skapas bottar endast på kommersiell grund via officiella Rakuten Viber-partners. Processen ser ut så här:
- Du skickar in en ansökan på Viber-sidan för publika konton: företagstyp, användningsscenarier för botten.
- Efter godkännande kommer en inbjudan. Du startar om enheten, går till huvudskärmen för publika konton och trycker på "Skapa publikt konto".
- Du fyller i detaljerna: namn, beskrivning, avatar. Ditt huvudsakliga Viber-konto tilldelas som administratör.
Resultatet blir ett publikt konto och tillgång till inställningar. Det är här autentiseringstoken dyker upp.
Bottar stöds på iOS och Android från Viber version 6.5 och högre, och på desktop från version 6.5.3. Om du har en gammal version av appen, uppdatera den innan du börjar utveckla, annars fungerar inte tangentbord och vissa API-metoder.
Steg 2. Hämta autentiseringstoken
Token (applikationsnyckeln) är en unik hemlig identifierare för din bot. Utan den går ingen API-förfrågan igenom.
Efter att du skapat ett publikt konto är token tillgänglig för administratören under "Redigera info" för det publika kontot. Ett alternativt sätt är via Viber Admin Panel. Token ser ut ungefär så här:
455a0f2c05b4fe54-cb4e33d3200fbbae-95f29ebc06af09a8
Detta är en demonyckel, din kommer att ha unika tecken men samma struktur.

Den största förändringen jämfört med gamla guider: från och med API version 7.0 skickas token inte i POST-förfrågans brödtext, utan i HTTP-headern X-Viber-Auth-Token. Om du skickar token på det gamla sättet, som ett auth_token-fält i JSON, kommer API:et att returnera felet missing_auth_token.
Gammalt format (fungerar inte längre):
1 {"auth_token": "your_token", "url": "https://..."}
Modernt tillvägagångssätt, header:
1 X-Viber-Auth-Token: your_token
Håll token hemlig. Alla som har den kan skicka meddelanden till dina prenumeranter i bottens namn.
Steg 3. Sätt upp webhooken och skriv en PHP-hanterare
En webhook är en URL på din server dit Viber skickar callback-förfrågningar: meddelanden från användare, prenumerationsaviseringar och andra händelser.
Krav på webhook-URL:
- HTTPS-protokoll med ett giltigt SSL-certifikat från en betrodd certifikatutfärdare. Viber stöder inte självsignerade certifikat.
- Certifikatet måste finnas med i Sun Javas lista över betrodda certifikat, kontrollera detta före uppsättning.
Att sätta upp webhooken är en POST-förfrågan till https://chatapi.viber.com/pa/set_webhook. I headern X-Viber-Auth-Token, din token. Förfrågans brödtext:
1 { 2 "url": "https://yourdomain.com/viber-webhook.php", 3 "event_types": ["delivered", "seen", "failed", "subscribed", "unsubscribed", "conversation_started"], 4 "send_name": true, 5 "send_photo": true 6 }
Parametrar:
url, din webhook-URL (obligatorisk, HTTPS).event_types, händelser för callback. Obligatoriska och ej filtrerbara: message, subscribed och unsubscribed. Resten är valfria.send_nameochsend_photo, om användarens namn och foto ska efterfrågas. Fungerar bara om användaren har aktiverat "Innehållsanpassning" i Vipers sekretessinställningar.
Vi skickar förfrågan via cURL:
1 <?php 2 3 $url = 'https://chatapi.viber.com/pa/set_webhook'; 4 5 $jsonData = json_encode([ 6 'url' => 'https://yourdomain.com/viber-webhook.php', 7 'event_types' => ['delivered', 'seen', 'failed', 'subscribed', 'unsubscribed', 'conversation_started'], 8 'send_name' => true, 9 'send_photo' => true 10 ]); 11 12 $ch = curl_init($url); 13 curl_setopt($ch, CURLOPT_POST, 1); 14 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); 15 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 16 'Content-Type: application/json', 17 'X-Viber-Auth-Token: your_auth_token' 18 ]); 19 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 20 $result = curl_exec($ch); 21 curl_close($ch); 22 23 echo $result;
Efter att den skickats kommer Viber att skicka en callback till din webhook-URL för att verifiera tillgängligheten. Ett HTTP 200-svar förväntas. Callback-data:
1 { 2 "event": "webhook", 3 "timestamp": 1457764197627, 4 "message_token": 241256543215 5 }
Din PHP-hanterare bör returnera ett svar:
1 { 2 "status": 0, 3 "status_message": "ok", 4 "event_types": ["delivered", "seen", "failed", "subscribed", "unsubscribed", "conversation_started", "message"] 5 }
Fullständig kod för webhook-hanteraren, filen viber-webhook.php på servern:
1 <?php 2 3 $request = file_get_contents("php://input"); 4 $input = json_decode($request, true); 5 6 if ($input['event'] == 'webhook') { 7 $webhook_response['status'] = 0; 8 $webhook_response['status_message'] = "ok"; 9 $webhook_response['event_types'] = 'delivered'; 10 echo json_encode($webhook_response); 11 die; 12 } 13 elseif ($input['event'] == "subscribed") { 14 // User subscribed — can send a welcome message 15 } 16 elseif ($input['event'] == "conversation_started") { 17 // User opened chat — can send a menu 18 } 19 elseif ($input['event'] == "message") { 20 $type = $input['message']['type']; 21 $text = $input['message']['text']; 22 $sender_id = $input['sender']['id']; 23 $sender_name = $input['sender']['name']; 24 25 // Form response 26 $data = [ 27 'receiver' => $sender_id, 28 'type' => 'text', 29 'text' => "Hello, $sender_name! You wrote: $text", 30 'sender' => [ 31 'name' => 'My Viber Bot' 32 ] 33 ]; 34 35 $ch = curl_init("https://chatapi.viber.com/pa/send_message"); 36 curl_setopt($ch, CURLOPT_POST, 1); 37 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 38 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 39 'Content-Type: application/json', 40 'X-Viber-Auth-Token: your_auth_token' 41 ]); 42 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 43 $result = curl_exec($ch); 44 curl_close($ch); 45 }
Efter lyckad webhook-konfiguration visas en chattknapp för 1-till-1-dialog i botten, och användare kan starta en konversation. För att inaktivera detta alternativ, skicka set_webhook med en tom url.
Steg 4. Ta emot meddelanden från användare
När en användare skriver till botten skickar Viber en callback till din webhook i detta format:
1 { 2 "event": "message", 3 "timestamp": 1457764197627, 4 "message_token": 4912661846655238145, 5 "sender": { 6 "id": "01234567890A=", 7 "name": "yarden", 8 "avatar": "http://avatar_url" 9 }, 10 "message": { 11 "type": "text", 12 "text": "a message to the service", 13 "media": "http://download_url", 14 "location": { 15 "lat": 50.76891, 16 "lon": 6.11499 17 }, 18 "tracking_data": "tracking data" 19 } 20 }
Nyckelfält att tolka:
Fält | Plats | Beskrivning |
|---|---|---|
| Roten | Värdet |
|
| Unikt Viber-ID, spara det, du behöver det för att skicka ett svar |
|
| Användarens namn (om personalisering är tillåten) |
|
| Meddelandetyp: text, picture, video, file, location, contact, sticker eller url |
|
| Meddelandetext (för typen |
| Roten | Unikt meddelande-ID, för att spåra leveransstatus |
Vad som är viktigt att göra i hanteraren:
- Spara
sender.id → name/context-länken i databasen. Viber API har ingen metod för att "hämta alla prenumeranter", du ackumulerar ID:n själv allteftersom förfrågningar kommer in. - Om användaren skickade en bild (
type: "picture") finns fil-URL:en imessage.media. - Ignorera inte
tracking_data: den kopplar användarens svar till ditt utgående meddelande, ovärderligt för dialoganalys.
Steg 5. Skicka meddelanden till användare
API:et send_message stöder text, bilder, videor, filer, platser, kontakter, stickers, karuseller och URL-förhandsvisningar. Låt oss täcka de viktigaste typerna.
Textmeddelande. POST-förfrågan till https://chatapi.viber.com/pa/send_message med headern X-Viber-Auth-Token:
1 { 2 "receiver": "01234567890A=", 3 "type": "text", 4 "text": "Hello! How can I help you?", 5 "sender": { 6 "name": "Support Bot" 7 }, 8 "tracking_data": "welcome_message_001" 9 }
Parameter | Beskrivning |
|---|---|
| Unikt Viber-ID för mottagaren (samma |
| Meddelandetyp: text, picture, video, file, location, contact, sticker, carousel eller url |
| Meddelandetext, upp till 7000 tecken |
| Visat avsändarnamn, upp till 28 tecken |
| Godtycklig sträng upp till 4096 tecken, returneras i callback när användaren svarar |
Skicka en bild:
1 { 2 "receiver": "01234567890A=", 3 "type": "picture", 4 "text": "March 2026 promotion", 5 "media": "https://yourdomain.com/img/promo.jpg", 6 "thumbnail": "https://yourdomain.com/img/promo_thumb.jpg", 7 "sender": { 8 "name": "Shop Bot" 9 } 10 }
media, bild-URL (endast JPEG).thumbnail, miniatyrbilds-URL (också JPEG).text, beskrivning, kan varanull.
PHP-funktion för att skicka meddelanden, ett universellt omslag vi använder i praktiken:
1 <?php 2 3 function sendViberMessage($receiverId, $type, $data, $trackingData = '') { 4 $token = 'your_auth_token'; 5 $apiUrl = 'https://chatapi.viber.com/pa/send_message'; 6 7 $payload = array_merge(['receiver' => $receiverId, 'type' => $type], $data); 8 9 if ($trackingData) { 10 $payload['tracking_data'] = $trackingData; 11 } 12 13 $ch = curl_init($apiUrl); 14 curl_setopt($ch, CURLOPT_POST, 1); 15 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); 16 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 17 'Content-Type: application/json', 18 "X-Viber-Auth-Token: $token" 19 ]); 20 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 21 $result = curl_exec($ch); 22 curl_close($ch); 23 24 return json_decode($result, true); 25 }
Begränsning: maximal JSON-begäransstorlek är 30 KB. Tänk på detta när du skickar karuseller med många element.
Steg 6. Lägg till ett anpassat tangentbord med knappar
Tangentbordet ersätter enhetens standardtangentbord med en uppsättning knappar: snabbsvar, länkar till webbplatsen, övergångar till avsnitt. Detta är det huvudsakliga navigeringsverktyget inuti botten.
Tangentbordet kopplas till valfri meddelandetyp via fältet keyboard i förfrågan send_message:
1 { 2 "receiver": "01234567890A=", 3 "type": "text", 4 "text": "What are you interested in?", 5 "sender": { 6 "name": "Help Bot" 7 }, 8 "keyboard": { 9 "Type": "keyboard", 10 "BgColor": "#FFFFFF", 11 "Buttons": [ 12 { 13 "Columns": 6, 14 "Rows": 1, 15 "BgColor": "#2db9b9", 16 "ActionType": "reply", 17 "ActionBody": "Services", 18 "Text": "📋 Services", 19 "TextVAlign": "middle", 20 "TextHAlign": "center", 21 "TextSize": "regular" 22 }, 23 { 24 "Columns": 6, 25 "Rows": 1, 26 "BgColor": "#2db9b9", 27 "ActionType": "open-url", 28 "ActionBody": "https://yoursite.com/prices", 29 "Text": "💰 Prices", 30 "TextVAlign": "middle", 31 "TextHAlign": "center", 32 "TextSize": "regular" 33 } 34 ] 35 } 36 }

Tangentbordsparametrar:
Parameter | Beskrivning |
|---|---|
| Visningstyp. Endast |
| HEX-bakgrundsfärg för tangentbordet |
|
|
Parametrar för varje knapp:
Parameter | Möjliga värden |
|---|---|
| 1-6, bredd i kolumner |
| 1 eller 2, höjd i rader |
|
|
| Svarstext eller länk-URL |
| Knappetikett. Stöder HTML-taggar: b, i, u, br och span style |
| HEX-knappfärg |
|
|
| URL till bakgrundsbild eller GIF |
| URL till bild ovanpå bakgrunden |
| top, middle eller bottom |
| left, center eller right |
| small, regular eller large |
Några viktiga nyanser från praktiken:
- En knapp med
ActionType: "open-url"öppnar länken i en extern webbläsare, inte inuti Viber. - Överbelasta inte tangentbordet: 4-6 knappar är optimalt för en skärm.
- Bakgrunds-GIF:ar i knappar (
BgMedia) stöder loopning viaBgLoop: true.
Från och med denna punkt är botten redo att arbeta: den tar emot meddelanden, svarar med text och bilder, visar ett meny-tangentbord.
I den här videon visas en livedemonstration av hela cykeln: från att skapa ett publikt konto till att skicka det första meddelandet med ett tangentbord. Användbar att titta på innan du kör koden på din egen server.
⁉️🤔 Vanliga frågor
Är det möjligt att skapa en Viber-bot gratis 2026?
Nej. Sedan den 5 februari 2024 har Viber övergått till att skapa bottar enbart på kommersiella villkor. För att få en token behöver du kontakta Rakuten Viber direkt eller en av de officiella partnerna. Gratis testkonton utfärdas inte längre. Bottar som skapats före detta datum fortsätter att fungera.
Är det obligatoriskt att använda PHP för en Viber-bot?
Nej, språket spelar ingen roll. Viber API fungerar via HTTP POST/GET-förfrågningar, vilken backend som helst fungerar: Node.js, Python, Go, Ruby. Vi visar PHP eftersom det är det vanligaste språket på WordPress-hosting och delade servrar, tillgängligt för de flesta webbplatsägare utan extra miljöinstallation.
Hur kontrollerar jag att webhooken fungerar?
Efter anrop av
set_webhookskickar Viber omedelbart en callback med"event": "webhook"till din URL. Servern returnerar HTTP 200, webhooken är aktiv. Du kan kontrollera aktuell status med ett upprepatset_webhook-anrop med samma parametrar, API-svaret visar registreradeevent_types. För felsökning, använd loggning avfile_get_contents("php://input")till en fil på servern.
Vad är skillnaden mellan den gamla autentiseringsmetoden och den nya?
Före API version 7.0 skickades token i JSON-brödtexten för varje förfrågan som fältet
auth_token. Det moderna API:et (7.0+) kräver att token skickas i HTTP-headernX-Viber-Auth-Token. Det gamla formatet stöds inte, förfrågningar medauth_tokeni brödtexten returnerar ettmissing_auth_token-fel. Om du migrerar kod från guider från 2017-2023, ersätt token-överföringen med en header.
Vad gör man om användaren inte ser tangentbordet?
Tre troliga orsaker: (1) JSON-förfrågan överskred gränsen på 30 KB, minska antalet knappar eller ta bort bakgrundsmedia; (2) fältet
Typeinnehåller något annat än"keyboard", detta är det enda värde som stöds; (3) användaren har en gammal version av Viber, tangentbord stöds från version 6.5.
Kan jag ta bort webhooken och inaktivera 1-till-1-chatt?
Ja, skicka
set_webhookmed en tom sträng iurl:
1 {"url": ""}
Chattknappen försvinner, men token och publikt konto bevaras. Användbart när du flyttar en bot till en annan server.
Vad ska man välja 2026: din egen PHP-bot eller en no-code-plattform
Om du har läst så här långt har du två vägar framför dig. Den första är att skriva en bot i PHP enligt stegen ovan. Du får full kontroll över logik, data och hosting. Lämpligt när botten är en del av ett större projekt: webbutik, supporttjänst, internt teamverktyg.
Den andra vägen är no-code-plattformar som SendPulse, Infobip eller Kommunicate. De hanterar webhook-infrastrukturen och tillhandahåller en visuell redigerare för scenarier. Priset är en månadsprenumeration och begränsningar i gratisversionen. För typiska uppgifter som automatiska FAQ-svar, kampanjutskick, är detta mer än tillräckligt.
I praktiken kombinerar vi oftast: botkärnan i PHP för anpassad logik, och vi bygger tangentbord och välkomstkedjor i plattformens visuella redigerare, snabbare och mer visuellt. Välj det som ligger närmast dina kunskaper och din uppgift. Börja med det första steget idag, ett publikt konto sätts upp på en halvtimme, och sedan tar varje nästa steg exakt så lång tid som det tar att kopiera och anpassa koden från den här guiden.



