Разработка сайта

Мы Makklays. Мы помогаем воплотить идею.

БОТ Телеграм на PHP


Makklays - Статьи image

eye 57


Сейчас многие пишут о практичности, современности и полезности использования ботов для получения различного рода статистики или данных, облегчая нагрузку на сайт и call-центры. Да, БОТ в меседжере, в данном случае Telegram, это очень удобно на мобильном телефоне. Еще это очень быстро - обмен данными между телефоном и сайтом в формате json всего несколько байт.

Вы можете только представить, как же удобно использовать бота, например, на вашем интернет-сайте или корпоративном сайте. Например, когда пользователю нужно узнать статус его заказа или стоимость той или иной услуги или продукта. Пользователю больше не нужно звонить и надоедать вам своими вопросами. Используя современную автоматизацию произодства он может зайти в Telegram и ваш бот с помощью указанных комманд (и номера заказа пользователя) выдаст ему необходимые ответы 24 часа в сутки без привлечения вашего внимания (или веременных затрат на ответы от вашего персонала). Это только малая часть преимущест использования бота, но уже достаточно ощутимая и заметная в современных условиях сокращения времени на рутинную работу и развитие бизнеса.

Бота удобно использовать при опросе или проведении тестирования у пользователей. Так как месенджер позволяет получить быстрые ответы от пользователя, который им пользуется и сохранить эти данные в базе данных для последующего использования (сумировании статистики, получение данных, построении графиков на основании результатов ответов пользователей).

Разберемся как сделать БОТ для Телеграм. Поверьте это очень просто (лично я разобрался за вечер) в простой интерпретации. Но, сложно, если Вы будете подключать обработку статистических данных на сайте и отдавать результат этих данных sql запросов и т.д. назад в телефон (подразумеваю какую-то вашу необыкновенную разработку). Чтобы разработать Телеграм Бот вам необходимо сделать несколько простых шагов:

✔ Регистрация бота
✔ Получение входящих сообщений
✔ Фотографии
✔ Документ
✔ Разработка ответов бота

Согласно официальной документации Telegram все запросы отправляются по HTTPS протоколу. "Let's Encrypt" - бесплатный сертификат тоже подойдет. Так как Telegram заблокирован в РФ, то нужно будет воспользоваться прокси (если вы из РФ).



РЕГИСТРАЦИЯ БОТА



Для регистрации нового бота вам потребуется написать боту с названием @BotFather "папа ботов" (найдите бот с этим названием в Telegram) и выполнить команду /newbot

В следующем сообщении указываете название вашего бота, на конце обязательно должно быть "bot" или "_bot" (название позже можно будет отредактировать). В ответном сообщении получим токен нашего бота. Копируем токен, он нам еще пригодиться, когда начнем делать WebHook. Как видим из списка комманд

/setname - Имя
/setdescription - Краткое описание
/setabouttext - Описание бота
/setuserpic - Юзерпик

можем сделать дополнительные настройки для своего бота используя @BotFather.
Далее настраиваем WebHook - это когда все сообщения из Тelegram приходят на PHP файл/скрипт (https://somesite.com/bot.php) на вашем сайте. Для этого нужно перейти по ссылке в которой вставлен токен и корректный адрес к вашему файлу на сайте.

https://api.telegram.org/bot<token>/setWebhook?url=https://somesite.com/bot.php

где token - ваш токен, а url - ваш адрес к скрипту на сайте (c https)

В ответ получим следующее:
{"ok":true,"result":true,"description":"Webhook was set"} 

Обратите внимание, что при смене токена - установку WebHooka нужно повторить.
Иначе как же Telegram узнает, что у вас новый url к скрипту обработки сообщений из Telegram?



ПОЛУЧЕНИЕ ВХОДЯЩИХ СООБЩЕНИЙ



Все сообщения приходят POST-запросом, с типом данных application/json. Получить сообщения в PHP можно следующим образом:


$data = file_get_contents('php://input');
$data = json_decode($data, true);

Чтобы посмотреть входящие сообщения их нужно писать в файл:

ob_start();
print_r($data);
$out = ob_get_clean();
file_put_contents(__DIR__ . '/message.txt', $out);

Выглядит это так:

Array (
[update_id] => 17584194
[message] => Array (
[message_id] => 26
[from] => Array (
[id] => 123456789
[is_bot] =>
[first_name] => UserName
[language_code] => ru-US
)
[chat] => Array (
[id] => 123456789
[first_name] => UserName
[type] => private
)
[date] => 1541888068
[text] => Привет бот!
)
)

Получаем текст сообщения:

if (!empty($data['message']['text'])) {
$text = $data['message']['text'];
echo $text;
}


ФОТОГРАФИИ



При отправке фото боту, на файл скрипта приходит массив превьюшек, последним элементом будет оригинальное фото. Максимальный размер файла 20МБ.

Запрос от Телеграм:


Array (
[update_id] => 17584194
[message] => Array (
[message_id] => 38
[from] => Array (
[id] => 123456789
[is_bot] =>
[first_name] => UserName
[language_code] => ru-US
)
[chat] => Array (
[id] => 123456789
[first_name] => UserName
[type] => private
)
[date] => 1541924962
[photo] => Array (
[0] => Array (
[file_id] => AgADAgADUqexG7u8OEudBvlhgMzKC1agOQ8ABC6Bx26USA7Mw3gAAgI
[file_size] => 1196
[width] => 51
[height] => 90
)
[1] => Array (
[file_id] => AgttAgADUqoxG7u8OEudBvlhgMzKC1agOQ8ABKwp_3jDPrIlxHgAAgI
[file_size] => 21146
[width] => 180
[height] => 320
)
[2] => Array (
[file_id] => AgADAgADUqyxG7u8OEudBvlhgMzKC1agOQ8ABAN8gJWpUT1MxXgAAgI
[file_size] => 90940
[width] => 449
[height] => 800
)
[3] => Array (
[file_id] => AgADAgADUqouu7u8OEudBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI
[file_size] => 114363
[width] => 719
[height] => 1280
)
)
)
)

Для скачивания файла нужно отправить POST или GET запрос на получение с параметром file_id изображения по URL:
https://api.telegram.org/botbot<token>/getFile

В ответ прийдет информация о файле:

Array (
[ok] => 1
[result] => Array (
[file_id] => AgADAgADUqoxG5u88E0dBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI
[file_size] => 114363
[file_path] => photos/file_1.jpg
)
)

Далее его можно скачать по ссылке:
https://api.telegram.org/file/botbot<token>/bot<file_path>

А в PHP сохранение файла на сервер можно реализовать следующим образом:
$token = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11';

if (!empty($data['message']['photo'])) {
$photo = array_pop($data['message']['photo']);

$ch = curl_init('https://api.telegram.org/bot' . $token . '/getFile');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file_id' => $photo['file_id']));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);
if ($res['ok']) {
$src = 'https://api.telegram.org/file/bot' . $token . '/' . $res['result']['file_path'];
$dest = __DIR__ . '/' . time() . '-' . basename($src);
copy($src, $dest);
}
}


ДОКУМЕНТ


Запрос от Телеграм:


Array (
[update_id] => 17474201
[message] => Array (
[message_id] => 44
[from] => Array (
[id] => 123456789
[is_bot] =>
[first_name] => UserName
[language_code] => ru-US
)
[chat] => Array (
[id] => 123456789
[first_name] => UserName
[type] => private
)
[date] => 1541925844
[document] => Array (
[file_name] => IMG_7947.JPG
[mime_type] => image/jpeg
[thumb] => Array (
[file_id] => AAQCABMNv_QOAATwQugveIZBldZ3AAIC
[file_size] => 2644
[width] => 67
[height] => 90
)
[file_id] => BQADAgADtQEAAqu9OEhzn2cEz8LpkgI
[file_size] => 1976218
)
)
)

Скачивание файлов происходит по такой же схеме как у фотографий.

if (!empty($data['message']['document'])) {
$file_id = $data['message']['document']['file_id'];

$ch = curl_init('https://api.telegram.org/bot' . $token . '/getFile');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file_id' => $file_id));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);
if ($res['ok']) {
$src = 'https://api.telegram.org/file/bot' . $token . '/' . $res['result']['file_path'];
$dest = __DIR__ . '/' . time() . '-' . basename($src);
copy($src, $dest);
}
}


РАЗРАБОТКА ОТВЕТОВ БОТА


Отправка текста

$response = array(
'chat_id' => $data['message']['chat']['id'],
'text' => 'Хай!'
);

$ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

Отправка картинки

$response = array(
'chat_id' => $data['message']['chat']['id'],
'photo' => curl_file_create(__DIR__ . '/image.png')
);

$ch = curl_init('https://api.telegram.org/bot' . $token . '/sendPhoto');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

Отправка файла

$response = array(
'chat_id' => $data['message']['chat']['id'],
'document' => curl_file_create(__DIR__ . '/file.xls')
);

$ch = curl_init('https://api.telegram.org/bot' . $token . '/sendDocument');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);