Создать своего бота в Telegram. Просто как дважды два
Всем привет. О ботах телеграма тут вроде бы ещё не писали. Возьмусь восполнить этот пробел.
Сразу ссылочка на второй урок
Если кто не в курсе, то вкратце о телеграм.
Telegram - это мессенджер(типа Viber или WatsApp) от Павла Дурова. В телеграме есть множество ботов, которые знают погоду, могут найти картинку, подсказать курсы валют и множество всего другого.
В данном уроке я объясню как создать своего собственного бота и научить его здороваться.
Для начала установите на компьютер приложение Telegram или воспользуйтесь web-версией
Если вы ещё не зарегистрировались в телеграме - регистрируйтесь.
Для того, чтобы создать бота вначале добавьте в контакт-лист бота BotFather. Это официальный бот телеграма. С его помощью можно создавать и удалять ботов, а так-же управлять ими.
Кликайте на имя бота и затем нажмите “Start”
Бот сразу же покажет вам список доступных команд.
Нам нужна команда /newbot Можно нажать на неё или написать её вручную в окне чата.
BotFather срезу предложит нам ввести имя бота. Я напишу GolosHelper
Теперь необходимо указать машинное имя бота, оно должно заканчиваться на bot. Пусть это будет golos_helper_bot
Готово. Теперь наш бот физически существует и у нас есть токен для управления им.
После строчки Use this token to access the HTTP API отображен токен для работы с ботом. На этом начальная настройка бота закончена и можно приступать к программированию бота.
Для управления ботом нам потребуется хостинг, можно самый слабенький, ресурсов нам нужен самый минимум. Если хостинг доступен по IP или техническому домену от хостера - это подойдёт, если есть домен - ещё лучше.
Теперь давайте откроем корневую директорию сайта, на котором мы будем делать бота и создадим там несколько файлов.
Сразу уточню, что бота будем писать самостоятельно, на чистом PHP и без использования уже готовых библиотек для телеграма.
Если вы используете среду разработки - то она сама умеет сохранять файлы на сервере. Если нет - то можно создавать их хоть в блокноте, например Notepad++ и потом любым FTP клиентов копировать на сервер. Я рекомендую WinSCP.
В корне сайта создаём папку telegram
Теперь поместим в неё файл bot.php - это будет единственный файл, к которому будет обращаться бот. Наша задача научить его принимать запросы от бота и отправлять ответ.
Выглядеть этот файл будет так:
// листинг bot.php
//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '261641349:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');
//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];
При объявлении константы 'BOT_TOKEN' вы конечно-же указываете свой токен, полученный при регистрации бота.
Теперь нужно сказать боту, что его логика находится на таком-то сервере и в таком-то файле, у телеграма это называется указать Webhook URL.
Загружаем файл на сервер
У меня есть домен https://www.autozap50.ru/ - на нём и работает мой бот. Поэтому путь для Webhook URL у меня будет https://www.autozap50.ru/telegram/bot.php
Теперь мне нужно обратиться по адресу <путь к апи><мой токен>/setWebhook?url=<мой bot.php>
То есть https://api.telegram.org/bot281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk/setWebhook?url=https://www.autozap50.ru/telegram/bot.php
Просто один раз открываем эту ссылку в браузере.
Важно - домен обязательно должен работать по https
Если у вас всё сделано верно - вы получите следующее сообщение.
Всё, теперь попробуем добавить себе в контакт лист нашего бота и написать ему что-нибудь.
Вот он наш бот. Жмём “Start”
Наш бот молчит и никак нам не отвечает, что в принципе логично.
Можно открыть access логи сайта и убедиться, что запросы доходят до bot.php
В логах я вижу, что телеграм с IP 149.154.167.206 отправлял POST запрос на мой bot.php и получал в ответ 200 код ответа, что есть хорошо.
Что именно он отправлял - из этого лога я не вижу. Логирование POST запросов как правило выключено, так как это очень большой объём данных.
Мы напишем свой логгер, только для своего бота.
Создадим для этого функцию с именем teleToLog
Поместим её в файл function.php (который так-же создадим и положим рядом с bot.php)
Листинг функции teleToLog
function teleToLog($log) {
$myFile = 'log.txt';
$fh = fopen($myFile, 'a') or die('can\'t open file');
if ((is_array($log)) || (is_object($log))) {
$updateArray = print_r($log, TRUE);
fwrite($fh, $updateArray."\n");
} else {
fwrite($fh, $log . "\n");
}
fclose($fh);
}
Теперь в bot.php проинклудим этот файл в начале файла
include_once './functions.php';
Передавать в функцию будем переменную $update
Допишем это в bot.php
Полный листинг:
//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');
include_once './functions.php';
//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];
//запись в лог
teleToLog($update);
Кладём файл function.php на сервер
Пишем что-нибудь боту
Теперь у нас появился файл log.txt
Если у вас этого файла нет - значит у скрипта недостаточно прав на запись в папку. Пользователь, от имени которого выполняется запрос должен иметь права на запись в папку.
В нём будет примерно следующее
Array
(
[update_id] => 652027113
[message] => Array
(
[message_id] => 12
[from] => Array
(
[id] => 261166341
[first_name] => Evgeny
[last_name] =>
)
[chat] => Array
(
[id] => 261166341
[first_name] => Evgeny
[last_name] =>
[type] => private
)
[date] => 1487053292
[text] => тест
)
)
В ключе массива [message][text] текст нашего сообщения боту.
Давайте научим бота здороваться.
Для этого познакомим его с приветствиями чтобы он научился их распознавать.
Создадим функцию getUserRequest - в которую будем передавать запрос от пользователя и id чата. Поместим её в functions.php
function getUserRequest($text, $chat_id) {
//список приветствий, который понимает бот
$hello = array();
$hello[] = 'привет';
$hello[] = 'хай';
$hello[] = 'здорова';
$hello[] = 'здравствуйте';
$hello[] = 'здрасьте';
$hello[] = 'йо';
// варианты ответов бота
$bot_hello = array();
$bot_hello[] = 'И тебе привет';
$bot_hello[] = 'Привет от голоса';
$bot_hello[] = 'Доброго времени суток';
$bot_hello[] = 'Привет привет';
if (in_array(mb_strtolower($text), $hello)) {
//пользователь поздоровался.
//случайная фраза привет от бота
$bot_resp = $bot_hello[rand(0, (count($bot_hello) - 1))];
$data = array(
'text' => $bot_resp,
'chat_id' => $chat_id,
);
requestToTelegram($data);
}
}
Массив $data формируется исходя из документации Telegram
Я намеренно обернул переменную $text в функцию mb_strtolower, чтобы заглавная(и все остальные) буква "опустилась" в нижний реестр и стала строчной.
Так-же создадим функцию requestToTelegram, которая будет отправлять сообщение телеграму, а он в свою очередь от имени бота ответит пользователю.
Чтобы телеграм понял, кому именно нужно отправить ответ - как раз нужна переменная $chat_id
function requestToTelegram($data, $type = 'sendMessage') {
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, API_URL . $type);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_exec($curl);
curl_close($curl);
}
}
Так-же обновим bot.php
//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');
include_once './functions.php';
//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];
//получаем текст запроса
$text = $update['message']['text'];
//запись в лог
teleToLog($update);
//обработка запроса
getUserRequest($text, $chat_id);
И пробуем поздороваться с ботом
Таки работает!
Можете сами добавиться к боту golos_helper_bot и попробовать поздороваться с ним.
Код на pasterbin
bot.php http://pastebin.com/JwtVH70z
functions.php http://pastebin.com/K5aTJJYh
Так выглядит первоначальная настройка бота. В дальнейшем я покажу как его можно научить бота понимать команды, обрабатывать более сложные запросы, прикрутить к нему клавиатуру и т.д.