Разработка простого телеграмм бота своими руками

Quarez

Новичок
Статус
offline
Регистрация
04.08.2018
Сообщения
19
Репутация
3
Вступление
Сегодня telegram является активно развивающейся платформой, а потому актуально будет осветить для широкой аудитории тему создания собственных ботов для этого мессенджера. Хотя-бы поверхностно. Для полноценного освящения этой темы я планирую написать две статьи, первая для php вторая для c#. Почему две? Дело в том, что правила телеграма(защищенность) задают для ботов очень жесткие правила размещения. В частности бот должен находиться на https домене. Сегодня мы будем рассматривать именно такой вариант бота, как наиболее очевидный. К сожалению, разрабатывать бота вам придется прямиком на сервере, то есть я предполагаю что у читателя уже есть свой домен и собственно уже налажен ftp доступ к этому домену. На дэнвере php боты работать не будут. Ну ладно не буду врать — можно сделать чтобы оно и на дэнвере работало, но давайте не будем писать такие велосипеды в этой статье и подождем до следующей, в которой я как раз опишу данный способ на примере с c#(а нахрена нам php с дэнвером когда есть такой замечательный инструмент). В этой статье мы общаемся с telegram api через webhook, это для особо прошаренных. Читающий статью человек должен уметь пользоваться: ftp, ssh(консоль сервера).



Шаг первый. Знакомство с Botfather.
Botfather — это такой бот, через которого регистрируют все остальные боты. Без него нам никак не обойтись, поэтому давайте откроем telegram и перейдем по ссылке — BotFather

Там все крайне просто, вбиваем /help и смотрим на список доступных команд:

Botfather-spisok-komand.png


собственно сейчас нас интересует команда /newbot, пишем ее и создаем бота указывая его название. В данном случае я назову своего бота — Рев.ком.стих и будет он у нас выдавать стихи о Маяковского и Есенина (когда я его доделаю, однако весь процесс в эту статью я включать не буду).

Registriruem-bota.png


Нам выдадут токен, на скриншоте он замазан в целях…, ну вы сами понимаете. Этот токен нам и нужен, сохраните его куда-нибудь в текстовый файл, он нам еще пригодится.

token.png




Далее можно задать оформление для бота. Например картинку — логотип. Для этого используем команду /setuserpic после чего загружаем картинку. Так-же задаются описание бота и прочие вещи до которых вы допрете и без моего участия.

zadaem-kartinku-bota.png


Ну и чтобы проверить установилась картинка или нет переходим на бота вбивая его имя через собачку в поиск

rezultat.png


Теперь надо сделать боту доступ к сообщениям пользователей, то есть выключить нахер приватный режим. Если мы планируем добавлять бота в группы или конфы, назовите как хотите, в любом случае приватность нам нахер не нужна. Чтобы ее выключить вбиваем команду /setprivacy после чего выбираем пункт — disabled. Обязательновыполните этот шаг, если вы хотите сделать действительно интерактивного бота.

daem-botu-dostup-k-soobshheniyam.png


Теперь самое время заняться backend частью, а именно написанием кода для команд нашего бота, но сначала настроим среду разработки.

Шаг третий. Среда для разработки.
Собственно в качестве библиотеки для обращения к API я буду использовать данный проект — TelegramBotApi у которого нифига нет документации, зато код довольно просто читается. В любом случае в этой статье я постараюсь описать максимально подробно все варианты работы с этой библиотекой, так что документация вам не понадобится вообще.

Но сначала давайте ее установим. Для этого будем использовать composer. Короче говоря будем делать все по «правилам», если этот термин вообще применим к php. Хороший язык, гибкий, не вгоняет в рамки, я знаете ли люблю его за эту вот гибкость. Но любителям «сапога в жопе» конечно всегда больше подходят ruby или какой-нибудь go в котором даже нормально библиотеку в своей папке не разместить, только в gopath. Однако так уж вышло, что данную библиотеку руками ставить будет геморойнее, чем через composer, я тут непричем, просто экономия времени. Для начала нам понадобится ssh соединение с вашим сервером. Для таких дел я предпочитаю ZOC terminal т.к. работаю из под windows. Скачать этот продукт можно на торрентах, сами найдете короче. Далее запускаем ваш терминал и заходим на сервер, после чего переходим к директории нашего домена(команда cd).

terminal-papka-proekta.png


Я не хочу размешать наш проект в корне директории, потому что там может быть например… форум. А вот в подпапке — запросто. Так что давайте эту самую подпапку и создадим через команду mkdir

sozdaem-podpapku.png


В данном случае подпапка называется ‘revcom_bot’.

Теперь в эту папку надо засунуть composer, собственно делается это тремя командами:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Просто вставляете их в ssh консоль по очереди и все.

ustanavlivaem-composer.png


Отлично, если вы справились с этой задачей, то далее нам следует установить компонент telegram-bot/api, для этого просто пишем в консоли:

php composer.phar require telegram-bot/api
ustanovka-biblioteki.png


После чего проверяем создались ли новые файлы в нашей директории. Вклчаем FTP менеджер, у меня это WinScp (бесплатное приложение, советую вам использовать его вместо глючной файлзиллы), переходим в папку проекта и смотрим что там есть:

zagotovka-proekta-1.png




Отлично. Вот теперь можно начинать писать код.

Шаг четвертый. Кодинг
Минимальная версия PHP
Для использования кода, который я демонстрирую, у вас должен стоять минимум php-5.6

Собственно создаем в директории файл index.php в котором мы и будем писать код нашего проекта. Внимание: кодировка файла — utf-8 без bom! Вообще описание кода по шагам это не моя сильная сторона, поэтому я просто буду вставлять код с комментариями в статью, а вы читайте и повторяйте.

header('Content-Type: text/html; charset=utf-8');
// подрубаем API
require_once("vendor/autoload.php");

// создаем переменную бота
$token = "ваш токен, мы его выше сохраняли в текстовый файл";
$bot = new \TelegramBot\Api\Client($token);
После того как переменная бота создана мы можем обращаться к api, но сначала нам надо зарегистрировать webhook.
Что такое webhook? Это такой механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в телеграме вводит команду ее надо как-то передать в на сервер и получить ответ. Webhook как раз это и делает — указывает телеграму куда передавать команду пользователя. Но так как изначально телеграм НЕ ЗНАЕТ где мы разместили нашего бота, то надо ему об этом обязательно сообщить.
Для этого у нас есть команда: $bot->setWebhook

// если бот еще не зарегистрирован - регистрируем
if(!file_exists("registered.trigger")){
/**
* файл registered.trigger будет создаваться после регистрации бота.
* если этого файла нет значит бот не зарегистрирован
*/

// URl текущей страницы
$page_url = "https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
$result = $bot->setWebhook($page_url);
if($result){
file_put_contents("registered.trigger",time()); // создаем файл дабы прекратить повторные регистрации
}
}
Отлично, можно запустить наш бот и проверить, перейдя к нему из браузера. Если в папке бота создался файл registered.trigger значит телеграм теперь знает о том, где находится наш бот.

registraciya-uspeshna.png


Приготовления пройдены, самое время зарегистрировать первые команды для бота. В спецификации телеграма сказано, что каждый бот должен отвечать на две обязательные команды. Первая команда — /start и вторая — /help, создадим их.

// обязательное. Запуск бота
$bot->command('start', function ($message) use ($bot) {
$answer = 'Добро пожаловать!';
$bot->sendMessage($message->getChat()->getId(), $answer);
});

// помощ
$bot->command('help', function ($message) use ($bot) {
$answer = 'Команды:
/help - помощ';
$bot->sendMessage($message->getChat()->getId(), $answer);
});

// запускаем обработку
$bot->run();
Теперь протестируем:

pervye-rezultaty-raboty-bota-telegram.png


Отлично! А теперь давайте разберемся немного с API нашей библиотеки.

Команды задаются блоком:

$bot->command('start', function ($message) use ($bot) {
});
Где $message — объект Message, все его поля можно посмотреть тут — Types/Message.php

Отправка сообщения выполняется командой:

$bot->sendMessage(ид пользователя которому отправляем, текст сообщения);
Отправка картинок
Отправка картинок пользователю выполняется через передачу телеграму ссылки на эту картинку. Телеграм САМ скачивает изображение и отдает пользователю, нам ничего качать не надо! В качестве демонстрации я загружу сейчас на свой блог изображение и отошлю его пользователю на команду /getpic.

картинка

// передаем картинку
$bot->command('getpic', function ($message) use ($bot) {
$pic = "http://aftamat4ik.ru/wp-content/uploads/2017/03/photo_2016-12-13_23-21-07.jpg";

$bot->sendPhoto($message->getChat()->getId(), $pic);
});
otpravka-kartinki-proshla-uspeshno.png


Как вы видите — все работает.

Отправка документа
Документы, в отличие от картинок, на сервер телеграма надо оправлять в POST формате, но не пугайтесь, библиотека сделает все за вас.
Для начала файл документа нам надо загрузить в папку с ботом:

dokument.png


После чего добавить такую команду:

// передаем документ
$bot->command('getdoc', function ($message) use ($bot) {
$document = new \CURLFile('shtirner.txt');

$bot->sendDocument($message->getChat()->getId(), $document);
});
Результат выполнения:

dokument-peredan-uspeshno.png


Точно так-же можно передать войсы:

// передаем войс
$bot->command('getvoice', function ($message) use ($bot) {
$voice = new \CURLFile('путь_до_файла_в_папке_бота_.mp3');
$bot->sendVoice(
$message->getChat()->getId(),
$voice,
//$duration,
//$replyToMessageId,
//$replyMarkup,
//$disableNotification
);
});
Получение сообщений из чата
Теперь осталось только добавить чуточку интерактивности, например заставить бота в чате постить что-нибудь с определенным шансом.

Дабы сделать это у API есть очень годная команда .on() ее мы и будем использовать в самой простой из форм.

// говорильник
$bot->on(function($Update) use ($bot){
$message = $Update->getMessage();
$mtext = $message->getText();
$cid = $message->getChat()->getId();

if(mb_stripos($mtext,"власть советам") !== false){
$bot->sendMessage($message->getChat()->getId(), "Смерть богатым!");
}
}, function($message) use ($name){
return true; // когда тут true - команда проходит
});
Результат работы:

rezultat-raboty.png


Этот метод так-же позволит вам прикрутить к телеграму, например, нейросеть для анализа сообщений или алгоритм Маркова, чтобы развлекать публику генерацией случайного бреда.

Задаем список команд
Теперь команды работают а значит настало время сообщить о том что они у нас есть в Botfather’а. Идем туда и вбиваем /setcommands

Soobshhaem-o-komandakh.png


И к стати если вы где-то опечатались можете заново вбить /setcommands и переопределить команды.

Смотрим добавились команды на страницу бота или нет:

komandy-dobavilis.png


Заключение
Думаю этого будет достаточно. Статья получилась полной, я разве что не осветил методы отправки аудио файлов, но думаю вы и сами сможете на них посмотреть без моего в этом участия — тут, я ведь разобрался, хоть и не нашел ни документации нормальной ни освещения данных вопросов в интернете. Зато теперь в этой статье я рассказал вам все что сам знаю о создании ботов к telegram на php. Однако, как я говорил выше эта статья всего лишь часть всех возможностей. Советую вам прочитать вторую статью уже про C# и работу с telegram api БЕЗ webhook, https и прочих геморроев. Проще говоря хостинг не понадобится.

Надеюсь, дорогой читатель, что я не зря писал эту статью.
 

Quarez

Новичок
Статус
offline
Регистрация
04.08.2018
Сообщения
19
Репутация
3
Если вдруг кому-то что-то не понятно пишите помогу )
 

Papaboy

Заблокированные
Статус
offline
Регистрация
05.12.2018
Сообщения
50
Репутация
20
Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
Ну вроде как всё не понятно
 

Quarez

Новичок
Статус
offline
Регистрация
04.08.2018
Сообщения
19
Репутация
3

Papaboy

Заблокированные
Статус
offline
Регистрация
05.12.2018
Сообщения
50
Репутация
20
Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.

Papaboy

Заблокированные
Статус
offline
Регистрация
05.12.2018
Сообщения
50
Репутация
20
Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.