Så här startar du ett telegram bot med PHP

Om du läser detta vet du att chattrobotar är en av de största tekniken i 2016.

Botrevolutionen handlar inte bara om artificiell intelligens. En bot kan vara ett verktyg i din budbärare med ett enkelt chattgränssnitt som kan användas för att utöka funktionaliteten hos webbplatser eller tjänster eller kan till och med vara en fristående applikation. Bots är billigare att utveckla och lättare att installera, och en annan bra funktion är att budbärare kan användas på alla typer av bärbara datorer, smartphones och tabletter. Därför är alla galen på bots nu.

Och den största budbäraren med en öppen bot API är Telegram.

Vad vi ska göra

I den här artikeln kommer vi att skapa en enkel stoppur Telegram bot. Jag ska visa dig hur du skapar din bot, koppla ihop med analytics, skriv några koden och till sist lägga till din bot till en botaffär.

Förresten, jag har redan förberett en demonstration, så du kan testa det bara genom att lägga till @stopwatchbot till din telegramkontaktlista.

Skapa en bot med BotFather

Det första steget att skapa en bot är att registrera kontot för din bot i telegram. Och det finns en bot för det, som heter BotFather. Lägg bara till den i din kontaktlista och du kommer att kunna skapa och konfigurera telegrambots, bara genom att skriva / nybot kommandot och följ BotFathers instruktioner.

Efter att du registrerat din nya bot får du ett gratulationsmeddelande med en behörighets token. Vi kommer snart använda denna token för att godkänna en bot och skicka förfrågningar till Bot API.

Senare kan du använda BotFather att lägga till beskrivningar eller foton i profilerna på dina robotar, regenerera tokens, ange listor med kommandon som ska användas, radera konton och så vidare. För att få en fullständig lista med kommandon, skriv bara /hjälp i en chatt för att få en lista över BotFather kommandon.

Anslut till Botan Analytics

Det finns inga inbyggda analyser i Telegram Bots API, men det är viktigt att veta hur många användare du har, hur de fungerar och vilka kommandon som de utlöser mer. Självklart kan vi samla in denna information med vår egen motor, men om vi vill fokusera på botfunktionalitet, inte mätvärden, behöver vi bara använda en out-of-the-box-lösning.

Och det finns ett enkelt verktyg för att koppla din bot till analytik, som heter Botan. Den är baserad på Yandex AppMetric och helt gratis. Med Botan kan du segmentera publiken, få information om användarprofiler, få det mest använda kommandot och få vackra grafer direkt i din budbärare, så här:

För att komma igång måste du registrera din bot i Botan och få en token. Och igen kan du göra det med en bot, BotanioBot:

Klicka bara på "Lägg till bot" -knappen på dialogrutans tangentbord, skriv in nicket på din bot och du kommer att få ditt bottspår. Nu är Botanio redo att följa dina bothändelser, och du kan få statistik av användare, sessioner, retention och händelser direkt i din budbärare.

Skapa och registrera en SSL Webhook

I telegram finns det två sätt att få meddelanden från dina användare: lång polling och webhooks.

I grund och botten, med lång polling, måste du begära nya meddelanden från API: n och med webbhakar ställer du in en återuppringning som Telegram API kommer att ringa om ett nytt meddelande kommer från en användare. Jag föredrar att använda webbhakar eftersom det ser ut som kommunikation i realtid, så i den här artikeln kommer vi också att använda den här metoden. Nu måste vi välja en återuppringningsadress för vår webbhook, som måste nås under HTTPS-protokollet, och vi måste ställa in det verkligen säkert, så göm ditt skript på en hemlig sökväg, som manualen säger:

Om du vill se till att Webhook-förfrågan kommer från Telegram rekommenderar vi att du använder en hemlig sökväg i webbadressen, t.ex.. https://www.example.com/. Eftersom ingen annan känner din bots token, kan du vara ganska säker på att det är oss.

Om ditt SSL-certifikat är betrodat är det bara du behöver göra att öppna den här webbadressen i din webbläsare:

https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]

Annars måste du skapa ett självtecknat certifikat. Här är ett exempel på kommandot på Linux för det:

openssl req -newkey rsa: 2048 -sha256 -nodes -keyout / path /to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj "/ C = IT / ST = stat / L = plats / O = Beskrivning / CN = yourdomain.com"

Och glöm inte att öppna SSL-porten:

sudo ufw tillåter 443 / tcp

För att få certifikatet kontrollerat och ställa in din webhook-domän för att vara betrodd måste du ladda upp ditt public key-certifikat:

curl \ -F "url = https: //yourdomain.com/path/to/script.php" \ -F "certifikat = / path / to / certificate.key" \ "https://api.telegram.org/ bot [token] / setwebhook"

Slutligen får du ett JSON-svar så här:

"ok": true, "result": true, "description": "Webhook satt"

Det står att webhaket var inställt och vi är redo att starta botens motor.

Bygg en databas

Nu behöver vi bygga en databas för våra timers. Vad behöver vi lagra i det? När en användare kommandot stoppuret börjar, tar vi chattens ID och räddar en rad med chatt-ID och nuvarande Unix-tid, vilket är antalet sekunder mellan nu och början av Unix epok, som är 1 januari 1970 vid UTC. Följaktligen sparar vi en rad med chatt-ID och heltalstidsstämpel för den aktuella Unix-tiden.

För att visa aktuell stoppurstid kommer vi att få den sparade tidstämpeln och jämföra den med den aktuella tidstämpeln. Skillnaden är den aktuella tiden i sekunder. Om användaren stannar timern raderar vi helt enkelt raden med det aktuella chatt-id.

Så låt oss skapa en databas och ett bord för att lagra stoppurinformationen:

SKAP TABELL OM INTE EXISTERAR "stopwatch" ("chat_id" int (10) unsigned INTE NULL, "timestamp" int (10) unsigned INTE NULL, PRIMARY KEY ('chat_id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Skapa en Stopwatch-klass

Slutligen är vi redo att börja kodning. Låt oss skapa en klass för att arbeta med databasen i en fil som heter stopwatch.php och börja med en konstruktör som ställer in två privata variabler, där vi lagrar chatt-id och nuvarande MySQL-anslutning:

klass Stoppur / ** @var mysqli * / privat $ mysqli; / ** @var int * / privat $ stopwatch_id; / ** * Stoppurskonstruktör * @param mysqli $ mysqli * @param $ stopwatch_id * / offentlig funktion __construct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id); 

När användaren startar timern kommer vi att få den aktuella Unix-tiden och spara den i rad med chatt-id, så här är Start() metod:

public function start () $ timestamp = tid (); $ query = "INSERT INTO" stopwatch "(" chat_id "," timestamp ") VÄRDEN ('$ this-> stopwatch_id', '$ timestamp') PÅ DUPLICATE KEY UPDATE timestamp = '$ timestamp'"; returnera $ this-> mysqli-> query ($ query); 

Om timern slutar måste vi ta bort en rad från databasen:

/ ** * Radera rad med stopwatch-id * @return bool | mysqli_result * / public function stop () $ query = "Ta bort från" stopwatch "WHERE 'chat_id' = $ this-> stopwatch_id"; returnera $ this-> mysqli-> query ($ query); 

Och nu för huvuddelen av klassen. När användaren begär status för timern måste vi hitta raden med stopuret från den aktuella konversationen och beräkna skillnaden i sekunder mellan den sparade Unix-tiden och den aktuella tiden. Lyckligtvis är Unix-tiden ett heltal, så vi kan bara subtrahera ett värde från en annan. För att formatera det resulterande värdet som en tid kommer vi att använda gmdate fungera.

/ ** * Hitta rad med stopwatch-id och returskillnad i sekunder från sparade Unix-tid och aktuell tid * @returnsträng * / allmän funktionsstatus () $ query = "SELECT" tidsstämpel "FRÅN" stopwatch "WHERE 'chat_id' = $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> fråga ($ query) -> fetch_row (); om (! tomt ($ timestamp)) returnera gmdate ("H: i: s", tid () - återställ ($ timestamp)); 

Som du kan se, om det inte finns något värde i databasen, metoden status() kommer inte att returnera någonting, och vi kommer att behandla ett nullvärde som en stoppad timer.

Välja ett PHP-bibliotek

Det finns många PHP-bibliotek som existerar för att fungera med Telegram API, men åtminstone vid skrivandet av denna artikel finns det bara en som stöder både Telegram Bot API-wrapper och Botan-spårning. Och det heter PHP Telegram Bot API.

Använd Kompositör för att installera detta bibliotek:

kompositör kräver telegram-bot / api

Om du inte är intresserad av att använda analyser, försök Telegram Bot API PHP SDK med Lavarel integration eller PHP Telegram Bot.

Starta Webhook Script

Och nu börjar huvuddelen - vi kommer att skapa ett manus för att behandla callbacks från Telegram Bot API. Starta en fil som heter index.php och inkluderar Composer autoload och en ny Stopwatch-klass. Öppna en MySQL-anslutning, skapa en ny telegram API-klient och kör den:

require_once "säljare / autoload.php"; require_once "stopwatch.php"; // ansluta till databasen $ mysqli = new mysqli ('database_host', 'database_user', 'database_password', 'database_name'); om (! tomt ($ mysqli-> connect_errno)) släng ny \ Undantag ($ mysqli-> connect_error, $ mysqli-> connect_errno);  // skapa en bot $ bot = ny \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); // spring, bot, spring! $ LÄGSTA LÄGE> run ();

Skapa kommandon

Nu måste vi ställa in en bot för att svara på kommando /Start. Detta kommando används för att starta alla telegrambots, och användarna kommer att visas vårt välkomstmeddelande när den första chatten börjar.

$ bot-> kommando ('start', funktion ($ message) använd ($ bot) $ answer = 'Hurdy! Välkommen till stopuret. Använd botkommandon eller tangentbord för att styra din tid.'; $ bot-> sendMessage $ message-> getChat () -> getId (), $ answer););

Här, i kommando() metod definierade vi en stängning för att ta emot ett kommando. Denna stängning får ID för den aktuella chatten och skickar ett välkomstmeddelande. Dessutom spåras alla registrerade kommandon automatiskt som kommandonamn.

För att starta stoppuret definierar vi /gå kommando:

$ bot-> kommando ('go', funktion ($ message) använd ($ bot, $ mysqli) $ stopwatch = nytt Stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ stopwatch- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), 'Stopwatch startade. Go!'););

Detta skapar en instans av Stopwatch-klassen och startar en timer som ringer till Start() metod som vi redan har definierat.

För att definiera /status kommando, vi måste göra samma sak. Ring bara till status() metod och returnera resultatet. Om metoden returneras null, berätta för användaren att timern inte startats.

$ bot-> kommandot ("status", funktion ($ meddelande) användning ($ bot, $ mysqli) $ stopwatch = nytt Stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); om (tomt ($ svar)) $ answer = 'Timern är inte startad.'; $ bot-> sendMessage ($ message-> getChat () -> getId ););

Och om användaren stannar timern måste vi först få statusen, visa den resulterande tiden och stoppa timern med hjälp av sluta() metod.

$ bot-> kommandot ("stopp", funktion ($ meddelande) användning ($ bot, $ mysqli) $ stopwatch = nytt Stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (! tomt ($ svar)) $ answer = 'Din tid är'. $ svar. PHP_EOL; $ stopwatch-> stop (); $ bot-> sendMessage ($ message- > getChat () -> getId (), $ svar. 'Stoppuret slutat. Njut av din tid!'););

Det är allt! Nu kan du ladda upp alla filer till webhook katalogen och testa din bot.

Lägga till ett tangentbord

För att föreslå användaren vilka kommandon han eller hon kan köra kan vi lägga till ett tangentbord i ett meddelande. Vår stoppur kan springa eller stoppas, och det kommer att finnas två för varje stat. För att visa ett tangentbord till användaren behöver vi bara förlänga skicka meddelande() metod:

$ keyboard = new \ TelegramBot \ Api \ Types \ SvarKeyboardMarkup ([['/ go', '/ status']], null, true); $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer, false, null, null, $ keyboards); );

Nu kan du lägga till tangentbord till varje kommando på din bot. Jag kommer inte att inkludera ett fullständigt exempel här, men du kan se det på arkivets arkiv.

Lägga till din bot i en butik

Okej, så nu har vi bot, och vi vill visa den för världen. Det bästa sättet är att registrera boten i en botkatalog. För tillfället har Telegram inte en officiell katalog som denna, men det finns några ofrivilliga, och den största är Storebot.me, där tusentals bots redan är registrerade.

Och det finns en ... bot för att registrera din bot i en botaffär! Lägg till @storebot i din kontaktlista, skriv in /Lägg till kommandot och följ instruktionerna. Du kommer att bli ombedd att ange botens användarnamn, namn och beskrivning, välj en av standardkategorierna och bekräfta botets ägande genom att skicka dess token.

Efter en stund kommer din bot att skicka inlämningsprocessen och visas i Storebot-diagrammen. Nu kan du och dina användare rösta, hitta och betygsätta din bot i botaffären så att den stiger till toppen av diagrammet.

Slutsats

Vi har kommit långt, från att skapa en baby bot för att registrera den i en butik som är tillgänglig för riktiga användare. Som du kan se finns det många verktyg som finns för att göra ditt liv enklare med att skapa och sprida din bot, och du behöver inte mycket kod för att starta en enkel bot. Nu är du redo att göra din egen!

Om du har några frågor, tveka inte att ställa frågor i kommentarerna till artikeln. 

Ytterligare läsning och relaterade länkar

  • Telegram Bots
  • BotFather
  • Botan
  • PHP Telegram Bot API
  • Telegram Bot Store