Als je dit leest, weet je dat chatbots een van de grootste technische trends van 2016 zijn.
De botrevolutie gaat niet alleen over kunstmatige intelligentie. Een bot kan een hulpmiddel zijn in uw messenger met een eenvoudige chatinterface die kan worden gebruikt om de functionaliteit van sites of services uit te breiden of zelfs een zelfstandige toepassing kan zijn. Bots zijn goedkoper te ontwikkelen en eenvoudiger te installeren, en een andere geweldige functie is dat boodschappers kunnen worden gebruikt op elk type apparaat, zoals laptops, smartphones en tablets. Daarom is iedereen nu gek op bots.
En de grootste boodschapper met een open bot-API is Telegram.
In dit artikel zullen we een eenvoudige stopwatch Telegram-bot maken. Ik zal je laten zien hoe je je bot kunt maken, verbinding kunt maken met analyses, wat code kunt schrijven en uiteindelijk je bot aan een botwinkel kunt toevoegen.
Trouwens, ik heb al een demo voorbereid, zodat je hem kunt testen door @stopwatchbot toe te voegen aan je Telegram-contactenlijst.
De eerste stap bij het maken van een bot is om het account van uw bot in Telegram te registreren. En daar is een bot voor, de BotFather. Voeg het gewoon toe aan uw contactenlijst en u kunt Telegram-bots maken en instellen, gewoon door het te typen / newbot
commando en het volgen van de instructies van BotFather.
Nadat u uw nieuwe bot heeft geregistreerd, ontvangt u een gefeliciteerd met een machtigingstoken. We zullen dit token binnenkort gebruiken om een bot te autoriseren en verzoeken naar de Bot API te verzenden.
Later kunt u BotFather gebruiken om beschrijvingen of foto's aan de profielen van uw bots toe te voegen, tokens te genereren, lijsten met te gebruiken opdrachten in te stellen, accounts te verwijderen, enzovoort. Om een volledige lijst met opdrachten te krijgen, typt u gewoon /helpen
in een chat om een lijst met de commando's van BotFather te krijgen.
Er is geen ingebouwde analyse in de Telegram Bots-API, maar het is belangrijk om te weten hoeveel gebruikers u heeft, hoe ze werken en met welke opdrachten ze meer activeren. Natuurlijk kunnen we deze informatie verzamelen met onze eigen engine, maar als we ons willen concentreren op botfunctionaliteit, niet op statistieken, dan moeten we gewoon een kant-en-klare oplossing gebruiken.
En er is een eenvoudige tool om je bot te verbinden met analytics, genaamd Botan. Het is gebaseerd op Yandex AppMetric en volledig gratis. Met Botan kun je je publiek segmenteren, informatie over gebruikersprofielen krijgen, het meest gebruikte commando krijgen en mooie grafieken rechtstreeks in je messenger krijgen, zoals deze:
Om te beginnen, moet je je bot registreren in Botan en een token krijgen. En nogmaals, je kunt het met een bot doen, BotanioBot:
Klik gewoon op de "Voeg bot toe" -toets op het dialoogvenster van het toetsenbord, typ de nick van je bot en je krijgt je botspoor-token. Nu is Botanio klaar om je botgebeurtenissen bij te houden, en je kunt statistieken van gebruikers, sessies, retentie en gebeurtenissen rechtstreeks in je messenger krijgen.
In Telegram zijn er twee manieren om berichten van uw gebruikers te ontvangen: lange polling en webhooks.
Kortom, met long polling moet u nieuwe berichten aanvragen bij de API en met webhooks stelt u een callback in die de Telegram-API zal bellen als een nieuw bericht van een gebruiker binnenkomt. Ik gebruik liever webhooks omdat het lijkt op real-time communicatie, dus in dit artikel zullen we deze methode ook gebruiken. Nu moeten we een callback-URL kiezen voor onze webhook, die moet worden bereikt onder het HTTPS-protocol, en we moeten het echt veilig instellen, dus verberg je script op een geheim pad, zoals de handleiding zegt:
Als u ervoor wilt zorgen dat de Webhook-aanvraag afkomstig is van Telegram, raden we aan een geheim pad in de URL te gebruiken, bijvoorbeeld.https://www.example.com/
. Omdat niemand anders het token van je bot kent, kun je er vrij zeker van zijn dat wij het zijn.
Als uw SSL-certificaat vertrouwd is, hoeft u alleen deze URL in uw browser te openen:
https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]
Anders moet u een zelfondertekend certificaat genereren. Hier is een voorbeeld van de opdracht op Linux voor:
openssl req -newkey rsa: 2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj "/ C = IT / ST = state / L = lokatie / O = description / CN = yourdomain.com"
En vergeet niet om de SSL-poort te openen:
sudo ufw staat 443 / tcp toe
Als u het certificaat wilt laten controleren en uw webhook-domein wilt instellen als vertrouwd, moet u uw certificaat met openbare sleutel uploaden:
krul \ -F "url = https: //uwdomein.com/pad/naar/script.php" \ -F "certificaat = / pad / naar / certificate.key" \ "https://api.telegram.org/ bot [token] / setwebhook"
Eindelijk krijgt u een JSON-antwoord als volgt:
"ok": waar, "resultaat": waar, "beschrijving": "Webhook is ingesteld"
Er staat dat de webhook was ingesteld en we zijn klaar om de motor van de bot te starten.
Nu moeten we een database bouwen voor onze timers. Wat moeten we erin opslaan? Wanneer een gebruiker de stopwatch opdraagt om te starten, nemen we de ID van de chat en slaan we een rij op met de chat-ID en huidige Unix-tijd, het aantal seconden tussen nu en het begin van Unix Epoch, dat is 1 januari 1970 bij UTC. Daarom slaan we een rij op met de chat-ID en integer timestamp van de huidige Unix-tijd.
Om de huidige stopwatch-tijd weer te geven, krijgen we de opgeslagen tijdstempel en vergelijken deze met de huidige tijdstempel. Het verschil is de huidige tijd in seconden. Als de gebruiker de timer stopt, verwijderen we eenvoudigweg de rij met de huidige chat-ID.
Dus laten we een database en tabel maken om de stopwatchinformatie op te slaan:
CREËER TAFEL INDIEN NIET BESTAAT 'stopwatch' ('chat_id' int (10) unsigned NOT NULL, 'timestamp' int (10) unsigned NOT NULL, PRIMARY KEY ('chat_id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Eindelijk zijn we klaar om te beginnen met coderen. Laten we een klasse maken om met de database te werken in een bestand met de naam stopwatch.php
en begin met een constructor die twee privévariabelen instelt, waarin we de chat-ID en de huidige MySQL-verbinding opslaan:
klasse chronometer / ** @var mysqli * / private $ mysqli; / ** @var int * / private $ stopwatch_id; / ** * Stopwatch-constructor * @param mysqli $ mysqli * @param $ stopwatch_id * / public function __construct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id);
Wanneer de gebruiker de timer start, krijgen we de huidige Unix-tijd en slaan deze op een rij op met de chat-ID, dus hier is de begin()
methode:
public function start () $ timestamp = time (); $ query = "INSERT INTO 'stopwatch' ('chat_id', 'timestamp') VALUES ('$ this-> stopwatch_id', '$ timestamp') OP DUPLICATE KEY UPDATE timestamp = '$ timestamp'"; return $ this-> mysqli-> query ($ query);
Als de timer stopt, moeten we een rij uit de database verwijderen:
/ ** * Rij met stopwatch-ID verwijderen * @return bool | mysqli_result * / openbare functie stop () $ query = "DELETE FROM 'stopwatch' WHERE 'chat_id' = $ this-> stopwatch_id"; return $ this-> mysqli-> query ($ query);
En nu voor het grootste deel van de klas. Wanneer de gebruiker de status van de timer aanvraagt, moeten we de rij met de stopwatch vinden in het huidige gesprek en het verschil in seconden berekenen tussen de opgeslagen Unix-tijd en de huidige tijd. Gelukkig is Unix-tijd een geheel getal, dus we kunnen slechts één waarde van een andere aftrekken. Om de resulterende waarde als een tijd op te maken, gebruiken we de gmdate
functie.
/ ** * Zoek rij met stopwatch-ID en retourneer het verschil in seconden van opgeslagen Unix-tijd en huidige tijd * @return-tekenreeks * / public function status () $ query = "SELECT 'timestamp' FROM 'stopwatch' WHERE 'chat_id' = $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> query ($ query) -> fetch_row (); if (! empty ($ timestamp)) return gmdate ("H: i: s", time () - reset ($ timestamp));
Zoals je kunt zien, als er geen waarde in de database is, de methode Status ()
zal niets retourneren en we zullen een nulwaarde verwerken zoals een timer die gestopt is.
Er zijn veel PHP-bibliotheken die er zijn om met de Telegram-API te werken, maar op het moment dat dit artikel wordt geschreven, is er maar één die zowel de Telegram Bot API-wrapper als Botan-tracking ondersteunt. En het heet PHP Telegram Bot API.
Gebruik Composer om deze bibliotheek te installeren:
componist vereist telegram-bot / api
Als u niet geïnteresseerd bent in het gebruik van analytische gegevens, probeer dan Telegram Bot API PHP SDK met Lavarel-integratie of PHP Telegram Bot.
En nu begint het grootste gedeelte - we zullen een script maken om callbacks van de Telegram Bot API te verwerken. Start een bestand met de naam index.php
en omvat de autoload Composer en een nieuwe chronometer-klasse. Open een MySQL-verbinding, maak een nieuwe Telegram API-client en voer deze uit:
require_once 'vendor / autoload.php'; require_once 'stopwatch.php'; // connect to database $ mysqli = new mysqli ('database_host', 'database_user', 'database_password', 'database_name'); if (! empty ($ mysqli-> connect_errno)) throw new \ Exception ($ mysqli-> connect_error, $ mysqli-> connect_errno); // create a bot $ bot = new \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); // rennen, bot, rennen! $ ONDERKANT> run ();
Nu moeten we een bot instellen om op commando te antwoorden /begin
. Deze opdracht wordt gebruikt om alle Telegram-bots te starten en gebruikers krijgen ons welkomstbericht te zien wanneer de eerste chatsessie begint.
$ bot-> commando ('start', functie ($ bericht) gebruik ($ bot) $ answer = 'Howdy! Welkom bij de stopwatch. Gebruik bot commando's of toetsenbord om je tijd te regelen.'; $ bot-> sendMessage ( $ message-> getChat () -> getId (), $ answer););
Hier, in de commando()
methode, hebben we een afsluiting gedefinieerd voor het ontvangen van een opdracht. Deze afsluiting krijgt de ID van de huidige chat en verzendt een welkomstbericht. Alle geregistreerde opdrachten worden ook automatisch bijgehouden als de opdrachtnaam.
Om de stopwatch te starten, zullen we de /Gaan
commando:
$ bot-> commando ('go', functie ($ bericht) gebruik ($ bot, $ mysqli) $ stopwatch = nieuwe stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ stopwatch- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), 'Stopwatch gestart. Ga!'););
Hiermee wordt een instantie van de chronometer-klasse gemaakt en wordt een timer gestart die de begin()
methode die we al hebben gedefinieerd.
Om de te definiëren / statuut
opdracht, we moeten hetzelfde doen. Bel gewoon de Status ()
methode en retourneer het resultaat. Als de methode null retourneert, vertel de gebruiker dan dat de timer niet is gestart.
$ bot-> commando ('status', functie ($ bericht) gebruik ($ bot, $ mysqli) $ stopwatch = nieuwe stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (empty ($ answer)) $ answer = 'Timer is niet gestart.'; $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer ););
En als de gebruiker de timer stopt, moeten we de status eerst krijgen, de resulterende tijd weergeven en de timer stoppen met behulp van de hou op()
methode.
$ bot-> commando ('stop', functie ($ bericht) gebruik ($ bot, $ mysqli) $ stopwatch = nieuwe stopwatch ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (! empty ($ answer)) $ answer = 'Uw tijd is'. $ answer. PHP_EOL; $ stopwatch-> stop (); $ bott-> sendMessage ($ message- > getChat () -> getId (), $ answer. 'Stopwatch gestopt. Veel plezier!'););
Dat is het! Nu kun je alle bestanden naar de webhook-map uploaden en je bot testen.
Om de gebruiker aan te bevelen welke commando's hij of zij kan uitvoeren, kunnen we een toetsenbord aan een bericht toevoegen. Onze stopwatch kan worden uitgevoerd of gestopt en er zullen er twee zijn voor elke staat. Om een toetsenbord aan de gebruiker te tonen, hoeven we alleen het bericht versturen()
methode:
$ keyboard = new \ TelegramBot \ Api \ Types \ ReplyKeyboardMarkup ([['/ go', '/ status']], null, true); $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer, false, null, null, $ keyboards); );
Nu kun je toetsenborden toevoegen aan elke opdracht van je bot. Ik zal hier geen volledig voorbeeld opnemen, maar je kunt het wel zien op de repository-pagina's.
Oké, dus nu hebben we een werkende bot, en we willen het aan de wereld laten zien. De beste manier is om de bot in een botcatalogus te registreren. Voorlopig heeft Telegram geen officiële catalogus zoals deze, maar er zijn een paar onofficiële, en de grootste is Storebot.me, waar duizenden bots al geregistreerd zijn.
En er is een ... bot om je bot in een botwinkel te registreren! Voeg @storebot toe aan uw lijst met contactpersonen, typ de /toevoegen
commando en volg de instructies. U wordt gevraagd om de gebruikersnaam, naam en beschrijving van de bot in te voeren, een van de standaardcategorieën te kiezen en het bezit van de bot te bevestigen door het token te sturen.
Na een tijdje zal je bot het inzendingsproces passeren en verschijnen in de Storebot-charts. Nu kunnen u en uw gebruikers uw bot stemmen, vinden en beoordelen in de botwinkel om hem naar de top van de grafiek te laten stijgen.
We hebben een lange weg afgelegd, van het maken van een babybot tot het registreren in een winkel om beschikbaar te zijn voor echte gebruikers. Zoals je ziet, zijn er veel tools die je leven gemakkelijker maken met het maken en verspreiden van je bot, en je hebt niet veel code nodig om een eenvoudige bot te starten. Nu bent u klaar om uw eigen te maken!
Als u vragen heeft, aarzel dan niet om vragen te stellen in de opmerkingen bij het artikel.