Cum să porniți o telegramă Bot cu PHP

Dacă citiți acest lucru, știți că boții de chat sunt una dintre cele mai mari tendințe tehnologice din 2016.

Revoluția bot nu este doar despre inteligența artificială. Un bot poate fi un instrument în mesagerul dvs. cu o interfață simplă de chat care poate fi utilizată pentru a extinde funcționalitatea site-urilor sau serviciilor sau poate fi chiar o aplicație independentă. Bots sunt mai ieftin de dezvoltat și mai ușor de instalat, iar o altă trăsătură extraordinară este că mesagerii pot fi utilizați pe toate tipurile de dispozitive - laptopuri, smartphone-uri și tablete. De aceea toată lumea e nebună în legătură cu roboții acum.

Cel mai mare mesager cu un API deschis pentru bot este telegrama.

Ce vom face

În acest articol vom crea un simplu cronometru Telegram bot. Vă voi arăta cum să vă creați botul, să vă conectați cu analizele, să scrieți un cod și, în sfârșit, să adăugați botul la un magazin de bot.

Apropo, am pregătit deja o demonstrație, astfel încât să puteți testa doar adăugând @stopwatchbot în lista de contacte a telegramei.

Creați un Bot cu BotFather

Primul pas pentru crearea unui bot este de a înregistra contul botului dvs. în Telegramă. Și există un bot pentru asta, numit BotFather. Doar adăugați-o în lista dvs. de contacte și veți putea să creați și să configurați roboții de telegrame, doar tastând / newbot comanda și urmând instrucțiunile de la BotFather.

După înregistrarea noului bot, veți primi un mesaj de felicitare cu un jeton de autorizare. Vom folosi acest jeton în curând pentru a autoriza un bot și pentru a trimite cereri către API Bot.

Mai târziu, puteți utiliza BotFather pentru a adăuga descrieri sau fotografii la profilurile robotilor, pentru a regenera token-urile, a seta liste de comenzi pentru a le utiliza, a șterge conturi și așa mai departe. Pentru a obține o listă completă de comenzi, doar tastați /Ajutor într-un chat pentru a obține o listă cu comenzile lui BotFather.

Conectați-vă la Google Botan Analytics

Nu există o analiză integrată în API-ul Telegram Bots, dar este important să știți cât de mulți utilizatori aveți, cum acționează și ce comenzi declanșează mai mult. Desigur, putem colecta aceste informații folosind propriul nostru motor, dar dacă vrem să ne concentrăm pe funcționalitatea bot, nu pe metrici, trebuie doar să folosim o soluție out-of-the-box.

Și există un instrument simplu de conectare a botului la analiză, numit Botan. Este bazat pe Yandex AppMetric și complet gratuit. Folosind Botan, puteți să vă segmentați publicul, să obțineți informații despre profilurile utilizatorilor, să obțineți cea mai utilizată comandă și să obțineți grafice frumoase chiar în mesagerul dvs., cum ar fi:

Pentru a începe, trebuie să vă înregistrați botul în Botan și să obțineți un semn. Și din nou, o puteți face cu un bot, BotanioBot:

Doar faceți clic pe tasta "Adăugați bot" de pe tastatura de dialog, tastați porecla botului dvs. și veți primi jetonul de pe bot. Acum, Botanio este gata să vă urmărească evenimentele de tip bot și puteți obține statistici de către utilizatori, sesiuni, reținere și evenimente chiar în mesagerul dvs..

Creați și înregistrați un Webhook SSL

În telegramă există două moduri de a primi mesaje de la utilizatorii dvs.: sondaje lungi și pagini web.

Practic, cu o interogare lungă, trebuie să solicitați mesaje noi de la API, iar cu webhooks setați un apel invers pe care API-ul Telegram va apela dacă un mesaj nou sosește de la un utilizator. Prefer sa folosesc webhooks deoarece seamana cu o comunicare in timp real, asa ca in acest articol vom folosi si aceasta metoda. Acum trebuie să alegeți o adresă de inversare a URL-ului pentru webhook-ul nostru, care trebuie să fie atins sub protocolul HTTPS și trebuie să-l setăm cu adevărat sigur, astfel încât ascundeți scenariul într-o cale secretă, după cum spune manualul:

Dacă doriți să vă asigurați că cererea Webhook vine de la telegramă, vă recomandăm să utilizați o cale secretă în adresa URL, de ex. https://www.example.com/. Din moment ce nimeni altcineva nu știe tokenul botului tău, poți fi destul de sigur că suntem noi.

Dacă certificatul dvs. SSL este de încredere, tot ce trebuie să faceți este să deschideți această adresă URL în browserul dvs.:

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

În caz contrar, trebuie să generați un certificat auto-semnat. Iată un exemplu de comandă pe Linux pentru aceasta:

openssl req -newkey rsa: 2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 - zile 365 -out /path/to/certificate.crt -subj "/ C = IT / ST = stare / L = locație / O = descrierea / CN = yourdomain.com“

Și nu uitați să deschideți portul SSL:

sudo ufw permite 443 / tcp

Pentru a obține verificarea certificatului și pentru a configura domeniul dvs. de webhook la încredere, trebuie să încărcați certificatul pentru cheia publică:

curl \ -F "url = https: //yourdomain.com/path/to/script.php" \ -F "certificate = / cale / către / certificate.key" \ "https://api.telegram.org/ bot [jeton] / setwebhook“

În cele din urmă, veți primi un răspuns JSON astfel:

"ok": true, "result": true, "description": "Webhook a fost setat"

Se spune că a fost setat hubul web și suntem gata să pornim motorul botului.

Construiți o bază de date

Acum trebuie să construim o bază de date pentru cronometrele noastre. Ce avem nevoie pentru a stoca în ea? Când un utilizator comandă cronometrul pentru a începe, vom lua ID-ul chat-ului și vom salva un rând cu ID-ul de chat și ora curentă Unix, adică numărul de secunde dintre momentul actual și începutul epocii Unix, care este 1 ianuarie 1970 la UTC. În consecință, vom salva un rând cu ID-ul de chat și marcajul de timp intreg al timpului curent Unix.

Pentru a afișa ora curentă a cronometrului, vom obține marcajul de timp salvat și îl vom compara cu marcajul temporal curent. Diferența va fi ora curentă în secunde. Dacă utilizatorul oprește temporizatorul, vom șterge pur și simplu rândul cu ID-ul de chat curent.

Deci, să creăm o bază de date și un tabel pentru a stoca informațiile cronometrului:

CREATE TABLE Dacă nu există "cronometru" ("chat_id" int (10) nesemnate NOT NULL, "timestamp" int (10) nesemnificat NOT NULL, KEY PRIMARY ('chat_id') ENGINE = InnoDB DEFAULT CHARSET = utf8;

Creați o Clasă cronometru

În cele din urmă, suntem gata să începem codarea. Să creăm o clasă pentru a lucra cu baza de date într-un fișier numit stopwatch.php și începeți cu un constructor care va stabili două variabile private, unde vom stoca ID-ul de chat și conexiunea curentă MySQL:

Clasa Cronometru / ** @var mysqli * / privat $ mysqli; / ** @var int * / privat $ stopwatch_id; / ** * Constructor cronometru * @param mysqli $ mysqli * @param $ stopwatch_id * / funcția publică __construct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id); 

Când utilizatorul pornește temporizatorul, vom obține timpul curent de Unix și îl vom salva într-un rând cu ID-ul de chat, deci aici este start() metodă:

funcția publică start () $ timestamp = time (); $ query = "INSERT INTO 'cronometru' ('chat_id', 'timestamp') VALUES ('$ this-> stopwatch_id', 'timestamp') pe DUPLICATE KEY UPDATE timestamp = '$ timestamp'; returnați $ this-> mysqli-> query ($ query); 

Dacă temporizatorul se oprește, trebuie să ștergem un rând din baza de date:

/ ** * Șterge rândul cu id de cronometru * @return bool | mysqli_result * / funcția publică stop () $ query = "DELETE FROM 'cronometru' WHERE 'chat_id' = $ this-> stopwatch_id"; returnați $ this-> mysqli-> query ($ query); 

Și acum pentru partea principală a clasei. Atunci când utilizatorul solicită starea temporizatorului, trebuie să găsim rândul cu cronometrul din conversația curentă și să calculăm diferența în secunde dintre timpul salvat Unix și ora curentă. Din fericire, timpul Unix este un întreg, deci putem scădea doar o valoare de la alta. Pentru a formata valoarea rezultată ca un timp, vom folosi gmdate funcţie.

/ ** * Găsiți rândul cu id de cronometru și diferența de întoarcere în secunde din timpul salvat Unix și ora curentă * @return string * / status public function () $ query = "SELECT 'timestamp' FROM 'stopwatch' WHERE 'chat_id' = $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> interogare ($ interogare) -> fetch_row (); dacă ! empty (timestamp)) returnați gmdate ("H: i: s", timpul () - resetați (timestamp)); 

După cum puteți vedea, dacă nu există valoare în baza de date, metoda stare() nu vom returna nimic și vom procesa o valoare nulă ca un cronometru oprit.

Alegerea unei Biblioteci PHP

Există multe biblioteci PHP care există pentru a lucra cu telegrama API, dar, cel puțin la momentul redactării acestui articol, există doar unul care suportă ambele telegrame Bot API wrapper și Botan tracking. Și se numește PHP Telegram Bot API.

Utilizați Composer pentru a instala această bibliotecă:

compozitorul necesită telegramă-bot / api

Dacă nu sunteți interesat să utilizați analizele, încercați să folosiți telegrama Bot API PHP SDK cu integrarea Lavarel sau PHP Telegram Bot.

Porniți scriptul Webhook

Iar acum începe partea principală - vom crea un script pentru procesarea apelurilor de la telegrama Bot API. Porniți un fișier numit index.php și include un compozitor autoload și o nouă clasă de cronometru. Deschideți o conexiune MySQL, creați un nou client Telegram API și rulați-l:

requ_once 'vendor / autoload.php'; require_once 'stopwatch.php'; // conectați la baza de date $ mysqli = mysqli noi ('database_host', 'database_user', 'database_password', 'database_name'); dacă (! go ($ mysqli-> connect_errno)) aruncați o nouă \ Excepție ($ mysqli-> connect_error, $ mysqli-> connect_errno);  // a crea un bot $ bot = nou \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); / / alerga, bot, alerga! $ Ate> run ();

Creați comenzi

Acum trebuie să punem un bot să răspundă la comandă /start. Această comandă este utilizată pentru a porni toți robotii de telegrame, iar utilizatorilor li se va afișa mesajul de întâmpinare atunci când începe primul chat.

$ bot-> comanda ('start', functie ($ message) folositi ($ bot) $ answer = 'Bine ati venit la cronometru. $ message-> getChat () -> getId (), $ răspuns););

Aici, în comanda() , am definit o închidere pentru primirea unei comenzi. Această închidere primește ID-ul chat-ului curent și trimite un mesaj de întâmpinare. De asemenea, toate comenzile înregistrate sunt urmărite automat ca nume de comandă.

Pentru a porni cronometrul, vom defini /merge comanda:

($ mysqli, $ message-> getChat () -> getId ()); $ Stop- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), "Cronometrul a început! Go!"););

Aceasta va crea o instanță a clasei Stopwatch și va porni un cronometru care va apela start() metodă pe care am definit-o deja.

Pentru a defini /stare comanda, trebuie să facem același lucru. Numai apelarea stare() și returnați rezultatul. Dacă metoda a revenit la nul, spuneți că nu este pornit cronometrul.

($ mysqli, $ message-> getChat () -> getId ()); $ answer = = comanda $ bot-> ($ answer-> getChat () -> getId (), $ answer = '$ answer-> ($ answer) ););

Dacă utilizatorul oprește temporizatorul, trebuie să luăm mai întâi statutul, să arătăm timpul rezultat și să oprim temporizatorul folosind Stop() metodă.

($ mysqli, $ message-> getChat () -> getId ()); $ answer = = comanda $ bot-> (stop, $ stop-> Stop (); $ ($ empty) ($ answer-); $ $ answer = 'Timpul dvs. este' > getChat () -> getId (), $ answer. "Cronometrul sa oprit, vă bucurați de timpul!");));

Asta e! Acum puteți încărca toate fișierele în directorul webhook și puteți testa botul.

Adăugarea unei tastaturi

Pentru a sugera utilizatorului care comanda el sau ea poate rula, putem adăuga o tastatură la un mesaj. Cronometrul nostru poate fi difuzat sau oprit și vor exista două pentru fiecare stat. Pentru a afișa o tastatură pentru utilizator, trebuie doar să extindeți Trimite mesaj() metodă:

$ keyboard = new \ TelegramBot \ Api \ Types \ ReplyKeyboardMarkup ([['/ go', '/ status']]; $ bot-> sendMessage ($ mesaj-> getChat () -> getId (), $ răspuns, fals, null, null, $ keyboards); );

Acum puteți adăuga tastaturi la fiecare comandă a botului dvs. Nu voi include un exemplu complet aici, dar îl puteți vedea în paginile repozitorului.

Adăugarea botului dvs. într-un magazin

Bine, acum avem bot de lucru și vrem să-i arătăm lumii. Cea mai bună modalitate este să înregistrați botul într-un catalog bot. Deocamdată, Telegramul nu are un catalog oficial ca acesta, dar sunt câteva dintre cele neoficiale, iar cea mai mare este Storebot.me, unde mii de bots sunt deja înregistrați.

Și există un ... bot pentru a vă înregistra botul într-un magazin de bot! Adăugați @storebot în lista dvs. de contacte, tastați /adăuga comanda și urmați instrucțiunile. Vi se va cere să introduceți numele de utilizator, numele și descrierea botului, să alegeți una dintre categoriile standard și să confirmați proprietatea botului trimițând simbolul său.

După un timp, botul dvs. va trece procesul de trimitere și va apărea în topurile Storebot. Acum, tu și utilizatorii dvs. puteți vota, găsi și evalua botul dvs. în magazinul bot pentru a vă ajuta să ajungeți la partea de sus a graficului.

Concluzie

Am parcurs un drum lung, de la crearea unui bot pentru a-l înregistra într-un magazin pentru a fi disponibil utilizatorilor reali. După cum puteți vedea, există multe instrumente care există pentru a vă face viața mai ușoară cu crearea și răspândirea botului dvs. și nu aveți nevoie de mult cod pentru a începe un bot ușor. Acum ești gata să-ți faci singur!

Dacă aveți întrebări, nu ezitați să adresați întrebări în comentariile articolului. 

Citirea ulterioară și legăturile apropiate

  • Telegramă Bots
  • BotFather
  • Boțan
  • PHP Telegram Bot API
  • Telegram Bot Store
Cod