Skip to content

Allt om WordPress, webbutveckling — och mer därtill

🤖 Skapa en Viber-bot i PHP i 6 steg: komplett guide

🤖 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.

Redigeringssida för Viber-företagskonto med token

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:

1X-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_name och send_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);
13curl_setopt($ch, CURLOPT_POST, 1);
14curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
15curl_setopt($ch, CURLOPT_HTTPHEADER, [
16 'Content-Type: application/json',
17 'X-Viber-Auth-Token: your_auth_token'
18]);
19curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
20$result = curl_exec($ch);
21curl_close($ch);
22
23echo $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
6if ($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}
13elseif ($input['event'] == "subscribed") {
14 // User subscribed — can send a welcome message
15}
16elseif ($input['event'] == "conversation_started") {
17 // User opened chat — can send a menu
18}
19elseif ($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

event

Roten

Värdet "message" betyder att detta är ett meddelande från en användare

sender.id

sender

Unikt Viber-ID, spara det, du behöver det för att skicka ett svar

sender.name

sender

Användarens namn (om personalisering är tillåten)

message.type

message

Meddelandetyp: text, picture, video, file, location, contact, sticker eller url

message.text

message

Meddelandetext (för typen text)

message_token

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 i message.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

receiver

Unikt Viber-ID för mottagaren (samma sender.id från callbacken)

type

Meddelandetyp: text, picture, video, file, location, contact, sticker, carousel eller url

text

Meddelandetext, upp till 7000 tecken

sender.name

Visat avsändarnamn, upp till 28 tecken

tracking_data

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 vara null.

PHP-funktion för att skicka meddelanden, ett universellt omslag vi använder i praktiken:

1<?php
2
3function 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}
Exempel på anpassat Viber-chatbottangentbord med navigeringsknappar

Tangentbordsparametrar:

Parameter

Beskrivning

Type

Visningstyp. Endast "keyboard" är tillgängligt för närvarande

BgColor

HEX-bakgrundsfärg för tangentbordet

DefaultHeight

true eller false, använd standardhöjd

Parametrar för varje knapp:

Parameter

Möjliga värden

Columns

1-6, bredd i kolumner

Rows

1 eller 2, höjd i rader

ActionType

"reply" skickar text; "open-url" öppnar länk

ActionBody

Svarstext eller länk-URL

Text

Knappetikett. Stöder HTML-taggar: b, i, u, br och span style

BgColor

HEX-knappfärg

BgMediaType

"picture" eller "gif", bakgrundsmedietyp

BgMedia

URL till bakgrundsbild eller GIF

Image

URL till bild ovanpå bakgrunden

TextVAlign

top, middle eller bottom

TextHAlign

left, center eller right

TextSize

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 via BgLoop: 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_webhook skickar Viber omedelbart en callback med "event": "webhook" till din URL. Servern returnerar HTTP 200, webhooken är aktiv. Du kan kontrollera aktuell status med ett upprepat set_webhook-anrop med samma parametrar, API-svaret visar registrerade event_types. För felsökning, använd loggning av file_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-headern X-Viber-Auth-Token. Det gamla formatet stöds inte, förfrågningar med auth_token i brödtexten returnerar ett missing_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 Type innehå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_webhook med en tom sträng i url:

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.