Hvordan starte en telegram bot med PHP

Hvis du leser dette, vet du at chatbots er en av de største teknologitrendene i 2016.

Botrevolusjonen handler ikke bare om kunstig intelligens. En bot kan være et verktøy i din messenger med et enkelt chatgrensesnitt som kan brukes til å utvide funksjonaliteten til nettsteder eller tjenester, eller kan til og med være et frittstående program. Bots er billigere å utvikle og enklere å installere, og en annen flott funksjon er at budbringere kan brukes på alle typer bærbare datamaskiner, smarttelefoner og nettbrett. Det er derfor alle er galne på bots nå.

Og den største messenger med en åpen bot API er Telegram.

Hva skal vi gjøre

I denne artikkelen vil vi lage en enkel stoppeklokke Telegram bot. Jeg vil vise deg hvordan du lager din bot, kobler deg til analytics, skriver noen kode, og til slutt legger boten din til en botbutikk.

Forresten, jeg har allerede utarbeidet en demonstrasjon, så du kan teste den bare ved å legge til @stopwatchbot på din Telegram-kontaktliste.

Lag en bot med BotFather

Det første trinnet for å lage en bot er å registrere kontoen til din bot i Telegram. Og det er en bot for det, som heter BotFather. Bare legg det til din kontaktliste, og du vil kunne lage og sette opp Telegram-bots, bare ved å skrive inn / newbot kommandoen og følg instruksjonene til BotFather.

Etter at du har registrert din nye bot, vil du motta en gratulasjonsmelding med en autorisasjonstegn. Vi vil snart bruke denne token til å godkjenne en bot og sende forespørsler til Bot API.

Senere kan du bruke BotFather til å legge til beskrivelser eller bilder i profilene til robotene dine, regenerere tokens, angi lister over kommandoer som skal brukes, slette kontoer og så videre. For å få en fullstendig liste over kommandoer, skriv bare inn /hjelp i en chat for å få en liste over BotFather kommandoer.

Koble til Botan Analytics

Det er ingen innebygd analyse i Telegram Bots API, men det er viktig å vite hvor mange brukere du har, hvordan de fungerer, og hvilke kommandoer de utløser mer. Selvfølgelig kan vi samle denne informasjonen ved hjelp av vår egen motor, men hvis vi ønsker å fokusere på botfunksjonalitet, ikke metriske, trenger vi bare å bruke en out-of-the-box løsning.

Og det er et enkelt verktøy for å koble din bot til analyse, kalt Botan. Den er basert på Yandex AppMetric og helt gratis. Ved å bruke Botan kan du segmentere publikum, få informasjon om brukerprofiler, få mest brukte kommandoer, og få vakre grafer rett i din messenger, slik:

For å komme i gang må du registrere din bot i Botan og få et token. Og igjen kan du gjøre det med en bot, BotanioBot:

Bare klikk på "Legg til bot" -tasten på dialogboksen tastaturet, skriv inn navnet på din bot, og du vil få din botspor token. Nå er Botanio klar til å spore dine botarrangementer, og du kan få statistikk av brukere, økter, oppbevaring og hendelser rett i din messenger.

Opprett og registrer en SSL Webhook

I telegram er det to måter å få meldinger fra brukerne dine: lang polling og webhooks.

I utgangspunktet, med lang polling, må du be om nye meldinger fra APIen, og med webhooks setter du inn tilbakering som Telegram API vil ringe hvis en ny melding kommer fra en bruker. Jeg foretrekker å bruke webhooks fordi det ser ut som sanntids kommunikasjon, så i denne artikkelen vil vi også bruke denne metoden. Nå må vi velge en tilbakekallingsadresse for vår webhook, som må nås under HTTPS-protokollen, og vi må sette det veldig trygt, så skjul skriptet ditt på en hemmelig måte, som manualen sier:

Hvis du vil sørge for at Webhook-forespørselen kommer fra Telegram, anbefaler vi at du bruker en hemmelig bane i nettadressen, f.eks.. https://www.example.com/. Siden ingen andre kjenner din bots token, kan du være ganske sikker på at det er oss.

Hvis SSL-sertifikatet er klarert, er alt du trenger å gjøre, åpne denne nettadressen i nettleseren din:

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

Ellers må du generere et selvsignert sertifikat. Her er et eksempel på kommandoen på Linux for det:

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

Og ikke glem å åpne SSL-porten:

sudo ufw tillater 443 / tcp

For å få sertifikatet sjekket og sett ditt webhook-domene for å stole på, må du laste opp publisitets-sertifikatet:

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

Til slutt får du et JSON svar slik:

"ok": sant, "resultat": sant, "beskrivelse": "Webhook ble satt"

Det står at webhook var satt og vi er klare til å starte motoren til botten.

Bygg en database

Nå må vi bygge en database for våre timere. Hva trenger vi å lagre i det? Når en bruker kommandoer stoppeklokken til å starte, tar vi IDen til chatten og lagrer en rad med chat-ID og gjeldende Unix-tid, som er antall sekunder mellom nå og starten på Unix epok, som er 1. januar 1970 på UTC. Derfor lagrer vi en rad med chat-ID og heltids tidsstempel for gjeldende Unix-tid.

For å vise gjeldende stoppeklokke tid, vil vi få den lagrede tidsstempel og sammenligne den med dagens tidsstempel. Forskjellen blir nåværende tid i sekunder. Hvis brukeren stopper timeren, vil vi bare slette raden med gjeldende chat-ID.

Så la oss lage en database og et bord for å lagre stoppeklokkeinformasjonen:

CREATE TABLE IF NOT EXISTS "stopwatch" ('chat_id' int (10) unsigned IKKE NULL, 'timestamp' int (10) usignert IKKE NULL, PRIMARY KEY ('chat_id')) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Lag en Stoppeklokke klasse

Til slutt er vi klare til å starte kodingen. La oss lage en klasse for å jobbe med databasen i en fil som heter stopwatch.php og start med en konstruktør som vil angi to private variabler, hvor vi lagrer chat-ID og gjeldende MySQL-tilkobling:

klasse Stopwatch / ** @var mysqli * / private $ mysqli; / ** @var int * / private $ stopwatch_id; / ** * Stopwatch constructor * @param mysqli $ mysqli * @param $ stopwatch_id * / offentlig funksjon __construct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id); 

Når brukeren starter timeren, får vi gjeldende Unix-tid og lagrer den på rad med chat-IDen, så her er det start() metode:

offentlig funksjonstart () $ timestamp = tid (); $ query = "INSERT INTO" stoppeklokke "(" chat_id "," timestamp ") VÆRDIER ('$ this-> stopwatch_id', '$ timestamp') PÅ DUPLICATE KEY UPDATE timestamp = '$ tidsstempel'"; returner $ this-> mysqli-> query ($ query); 

Hvis timeren stopper, må vi slette en rad fra databasen:

/ ** * Slett rad med stoppeklokke id * @return bool | mysqli_result * / offentlig funksjonstopp () $ query = "SLETT FRA 'stoppeklokke' WHERE 'chat_id' = $ this-> stopwatch_id"; returner $ this-> mysqli-> query ($ query); 

Og nå for hoveddelen av klassen. Når brukeren ber om status for timeren, må vi finne raden med stoppeklokken fra den aktuelle samtalen og beregne forskjellen i sekunder mellom den lagrede Unix-tiden og gjeldende tid. Heldigvis er Unix-tid et heltall, så vi kan bare trekke en verdi fra en annen. For å formatere den resulterende verdien som en tid, vil vi bruke gmdate funksjon.

/ ** * Finn rad med stoppeklokke id og returforskjell i sekunder fra lagret Unix tid og nåværende tid * @return streng * / offentlig funksjon status () $ query = "SELECT" tidsstempel 'FROM' stopur 'WHERE' chat_id '= $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> spørring ($ query) -> fetch_row (); hvis (! tomt ($ tidsstempel)) return gmdate ("H: i: s", tid () - nullstilt ($ tidsstempel)); 

Som du kan se, hvis det ikke er noen verdi i databasen, må metoden status() vil ikke returnere noe, og vi vil behandle en nullverdi som en stoppet timer.

Velge et PHP-bibliotek

Det er mange PHP-biblioteker som eksisterer for å jobbe med Telegram API, men i det minste i øyeblikket for å skrive denne artikkelen, er det bare en som støtter både Telegram Bot API wrapper og Botan sporing. Og det kalles PHP Telegram Bot API.

Bruk Komponist til å installere dette biblioteket:

komponist krever telegram-bot / api

Hvis du ikke er interessert i å bruke analyser, kan du prøve Telegram Bot API PHP SDK med Lavarel-integrasjon eller PHP Telegram Bot.

Start Webhook Script

Og nå begynner hoveddelen - vi vil lage et skript for å behandle tilbakeringinger fra Telegram Bot API. Start en fil som heter index.php og inkluderer Composer autoload og en ny Stopwatch-klasse. Åpne en MySQL-tilkobling, opprett en ny Telegram API-klient, og kjør den:

require_once 'leverandør / autoload.php'; require_once 'stopwatch.php'; // koble til database $ mysqli = new mysqli ('database_host', 'database_user', 'database_password', 'database_name'); hvis (! tomt ($ mysqli-> connect_errno)) kast nytt \ Unntak ($ ​​mysqli-> connect_error, $ mysqli-> connect_errno);  // lage en bot $ bot = ny \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); // løp, bot, løp! $ Nederste glatt> run ();

Opprett kommandoer

Nå må vi sette opp en bot for å svare på kommando /start. Denne kommandoen brukes til å starte alle Telegram-bots, og brukere vil bli vist vår velkomstmelding når den første chatten begynner.

$ bot-> kommando ('start', funksjon ($ melding) bruk ($ bot) $ answer = 'Howdy! Velkommen til stoppeklokken. Bruk botkommandoer eller tastatur for å kontrollere tiden din.'; $ bot-> sendMessage $ message-> getChat () -> getId (), $ answer););

Her, i kommando() metode, definerte vi et lukket for å motta en kommando. Denne lukkingen får ID for den nåværende chatten og sender en velkomstmelding. Også alle registrerte kommandoer spores automatisk som kommandoenavnet.

For å starte stoppeklokken, definerer vi /gå kommando:

$ bot-> kommando ('go', funksjon ($ melding) bruk ($ bot, $ mysqli) $ stopwatch = nytt Stoppeklokke ($ mysqli, $ message-> getChat () -> getId ()); $ stopwatch- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), 'Stopwatch startet .Gå!'););

Dette vil opprette en forekomst av Stopwatch-klassen og starte en tidtaker som ringer til start() metode som vi allerede har definert.

For å definere /status kommando, vi må gjøre det samme. Bare ring status() metode og returnere resultatet. Hvis metoden returneres null, fortell brukeren at timeren ikke er startet.

$ bot-> kommando ('status', funksjon ($ melding) bruk ($ bot, $ mysqli) $ stopwatch = nytt Stoppeklokke ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (), hvis (tomt ($ svar)) $ answer = 'Timer er ikke startet.'; $ bot-> sendMessage ($ message-> getChat () -> getId ););

Og hvis brukeren stopper timeren, må vi først få statusen, vise den resulterende tiden, og stoppe timeren med Stoppe() metode.

$ bot-> kommando ('stopp', funksjon ($ melding) bruk ($ bot, $ mysqli) $ stopwatch = nytt Stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); hvis (! tomt ($ svar)) $ answer = 'Tiden er'. $ svar. PHP_EOL; $ stopwatch-> stop (); $ bot-> sendMessage ($ message- > getChat () -> getId (), $ svar. 'Stopwatch stoppet. Nyt din tid!'););

Det er det! Nå kan du laste opp alle filene til webhook-katalogen og teste boten din.

Legge til et tastatur

For å foreslå til brukeren hvilke kommandoer han eller hun kan kjøre, kan vi legge til et tastatur i en melding. Våre stoppeklokke kan kjøres eller stoppes, og det vil være to for hver stat. For å vise et tastatur til brukeren, trenger vi bare å forlenge sende melding() metode:

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

Nå kan du legge tastaturer til hver kommando av din bot. Jeg vil ikke inkludere et fullstendig eksempel her, men du kan se det på arkivets sider.

Legge til din bot i en butikk

Ok, så nå har vi jobben bot, og vi vil vise det til verden. Den beste måten er å registrere boten i en botkatalog. For nå har Telegram ikke en offisiell katalog som dette, men det er noen uoffisielle, og den største er Storebot.me, hvor tusenvis av bots allerede er registrert.

Og det er en ... bot å registrere din bot i en bot butikk! Legg til @storebot i kontaktlisten din, skriv inn /Legg til kommandoen, og følg instruksjonene. Du vil bli bedt om å skrive inn botens brukernavn, navn og beskrivelse, velge en av standardkategorier og bekrefte botens eierskap ved å sende sin token.

Etter en stund vil din bot passere innleveringsprosessen og vises i Storebot-diagrammene. Nå kan du og dine brukere stemme, finne og bedømme din bot i bot-butikken for å hjelpe den å stige til toppen av diagrammet.

Konklusjon

Vi har kommet langt, fra å lage en baby bot for å registrere den i en butikk for å være tilgjengelig for ekte brukere. Som du kan se, er det mange verktøy som eksisterer for å gjøre livet ditt lettere med å skape og spre din bot, og du trenger ikke mye kode for å starte en enkel bot. Nå er du klar til å lage din egen!

Hvis du har noen spørsmål, ikke nøl med å stille spørsmål i kommentarene til artikkelen. 

Videre lesing og beslektede lenker

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