Свой бот телеграмм php

Диалоговый телеграм бот на PHP

Первое, с чего нужно начать, так это с создания бота. Есть официальная документация и там подробно расписаны шаги.

  1. находим в телеграм бота BotFather и добавляем себе в контакт лист
  2. смотрим доступные команды бота с помощью команды /help


выбираем /newbot и далее, следуя инструкции, выполняем необходимые действия (следующая картинка взята из google)


После создания бота вы получите токен, которые нужно будет использовать в коде вашего бота, поэтому сообщение с токеном необходимо сохранить.

Связываем бота с приложением\сайтом

Начинается самое интересное, а также именно тут я столкнулся с первой проблемой.
Первым делом выбираем библиотеку на php по созданию бота. Я свой выбор остановил на этой библиотеке, так как мне она показалась самой удобной.

После подключения библиотеки нужно организовать взаимодействие бота с вашим сайтом\приложением. Организовать это взаимодействие можно с помощью вебхуков.

Вебхук — это своего рода ретранслятор, который все запросы от бота будет передавать на адрес, указанный при регистрации вебхука. Зарегистрировать вебхук очень просто, нужно просто отправить запрос вида https: //api.telegram.org/bot~token~/setWebhook?url=https: //example.ru/path, где
https: //example.ru/ — это ссылка на ваш сайт, куда будет перенаправлять бот запросы.
~token~ — это токен, который вы получили при регистрации своего бота.
path — это часть url, на которую будут приходить обращения.

И вот именно тут возникает проблема. Оказывается вебхук можно зарегистрировать только в случае, если сайт находится на https. Если же ваш сайт на http, то зарегистрировать вебхук вам не получится.

Вы можете воспользоваться сервисом Let’s Encrypt
Переходим в раздел getting startted и следуем инструкции.

Написание кода бота

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

Разработчики telegram, для того чтобы пользователям было проще работать с ботами, просят всех разработчиков реализовывать поддержку следующих команд:

/start — начинает общение с пользователем (например, отправляет приветственное сообщение). В эту команду также можно передавать дополнительные аргументы.
/help — отображает сообщение с помощью по командам. Оно может представлять собой короткое сообщение о вашем боте и список доступных команд.

Все что нам нужно сделать, это в контроллере вашего приложения\сайта написать следующий код:

$token = "токен"; $bot = new \TelegramBot\Api\Client($token); // команда для start $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(); 

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

Команды:
/help — вывод справки

Что ж, мы написали список рекомендуемых команд. Далее мы можем реализовывать необходимые нам команды.

Так как команды могут принимать аргументы, то мы эту возможность используем. Например, мы сделаем так, чтобы наш бот, на команду hello Вася, отвечал сообщением: Привет, Вася.

Для этого следует написать следующий код:

$bot->command('hello', function ($message) use ($bot) < $text = $message->getText(); $param = str_replace('/hello ', '', $text); $answer = 'Неизвестная команда'; if (!empty($param)) < $answer = 'Привет, ' . $param; >$bot->sendMessage($message->getChat()->getId(), $answer); >);

Получается все очень просто и быстро.

Заносим список команд бота

Для того, чтобы бот мог выдавать интерактивную справку

необходимо боту BotFather сообщить список команд.
Сделать это можно с помощью его команды /setcommands

Велосипедство

Описанный выше вариант не совсем удобен, потому что не хочется вбивать после команды текст, так как если использовать подсказки от бота, то это совсем нереально.

Значит нужно сделать так, чтобы бот запоминал команду, которую вы вводите. Это можно сделать с помощью любого хранилища (MySQL, memcached, redis, tarantool, Postgres, etc)
Все что нужно, это запоминать предыдущий ввод пользователя.

Для этого нужно перед отдачей пользователю сообщения, помещать его в ваше хранилище, а перед принятием сообщения — проверять, если в хранилище данные. И если есть, то на основании этих данных строить дальнейшую логику.

Вот на этом этапе у меня снова возникла трудность, так как я не нашел в библиотеке возможности получить команду до вызова метода command. Также мне не понравилось то, что вся логика будет заперта в рамках одного контроллера приложения.

Было принято решение написать свой обработчик данных, с возможностью выносить каждую команду в отдельный контроллер приложения.

Для начала мы описываем точку входа в контроллер

function main() < $telegram = new Telegram(); // подключаем хранилище $storage = new Storage(); // получаем объект сообщения $message = $telegram->getMessage(); // получаем команду, если ее передали $command = $message->getCommand(); // получаем текст, если его передали (тут лежит все, что не является командой) $text = $message->getParams($command); // если команда пустая, то мы проверяем, есть ли у пользователя на предыдущем шаге вызов команды и восстановливаем ее if (empty($command)) < $command = $storage->restoreCommand($message->getChat()->getId()); > // запоминаем команду, котрую ввел пользователь $storage->storeCommand( $message->getChat()->getId(), $command ); // логика подключения нашего метода для котроллера $this->chooseMethod($command, $message, $text); >

Теперь рассмотрим один из методов.

function getnewtext(Message $telegram, $text) < // если не передали текст, то выведем сообщение с разъяснением if (empty($text)) < $answer = "Введите слово или несколько слов для поиска. Именно по ним будет происходить поиск 5 свежих новостей."; $telegram->sendMessage($telegram->getChat()->getId(), $answer); > else < // основаня логика $tgNews = new TelegramNews(); $arData = $tgNews->getByWord($text, 'new'); if (empty($arData)) < $answer = 'Ничего не найдено'; >else < $answer = common_setViewGetContent('telegram/get', [ 'data' =>$arData ]); > $telegram->sendMessage($telegram->getChat()->getId(), $answer); > >

Так стало все в разы приятнее, интерактивнее и удобнее.

Спасибо, что дочитали статью до конца. Поиграть с живым ботом, который работает в режиме диалога можно тут.

UPD: боту добавлена возможность отдавать фото на некоторые виды запросов. Например на
/gettable — возвращает результирующую таблицу спортивных событий
/getevents — возвращает события спортивных мероприятий

Источник

Бот Телеграм на PHP

Примеры как зарегистрировать бота в Telegram, описание и взаимодействие с основными методами API. Документация на core.telegram.org и tlgrm.ru (неофициальный, на русском).

Все запросы к API должны осуществляться по HTTPS, подойдет бесплатный сертификат «Let’s Encrypt».

Регистрация бота

Для регистрации нового бота нужно написать «папе ботов» @BotFather команду /newbot

Регистрация бота в Telegram

Следующим сообщением отправляем название для бота, обязательно на конце имени должно быть слово «bot» или «_bot». Ответным сообщением получим токен:

Получение токена к bot API Telegram

Тут же можно настроить описание и аватарку:

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

Далее нужно поставить «Webhook» чтобы все сообщения из Telegram приходили на PHP скрипт ( https://example.com/bot.php ). Для этого нужно пройти по ссылке в которой подставлены полученный токен и адрес скрипта. https://api.telegram.org/bot /setWebhook?url= https://example.com/bot.php

В ответе будет

Входящие сообщения

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

$data = file_get_contents('php://input'); $data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true));

Текстовое сообщение

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

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] => Привет бот! ) )

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

Фотографии

При отправки фото боту, на скрипт приходит массив превьюшек, последним элементом будет оригинальное фото. Максимальный размер файла 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 запрос на получение c параметром file_id изображения по URL: https://api.telegram.org/bot /getFile В ответ придет информация о файле:

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

Далее его можно скачать по ссылке: https://api.telegram.org/file/bot / В 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);

Пример скрипта

 define('TOKEN', '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'); // Функция вызова методов API. function sendTelegram($method, $response) < $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); return $res; >// Прислали фото. if (!empty($data['message']['photo'])) < $photo = array_pop($data['message']['photo']); $res = sendTelegram( 'getFile', array( 'file_id' =>$photo['file_id'] ) ); $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); if (copy($src, $dest)) < sendTelegram( 'sendMessage', array( 'chat_id' =>$data['message']['chat']['id'], 'text' => 'Фото сохранено' ) ); > > exit(); > // Прислали файл. if (!empty($data['message']['document'])) < $res = sendTelegram( 'getFile', array( 'file_id' =>$data['message']['document']['file_id'] ) ); $res = json_decode($res, true); if ($res['ok']) < $src = 'https://api.telegram.org/file/bot' . TOKEN . '/' . $res['result']['file_path']; $dest = __DIR__ . '/' . time() . '-' . $data['message']['document']['file_name']; if (copy($src, $dest)) < sendTelegram( 'sendMessage', array( 'chat_id' =>$data['message']['chat']['id'], 'text' => 'Файл сохранён' ) ); > > exit(); > // Ответ на текстовые сообщения. if (!empty($data['message']['text'])) < $text = $data['message']['text']; if (mb_stripos($text, 'привет') !== false) < sendTelegram( 'sendMessage', array( 'chat_id' =>$data['message']['chat']['id'], 'text' => 'Хай!' ) ); exit(); > // Отправка фото. if (mb_stripos($text, 'фото') !== false) < sendTelegram( 'sendPhoto', array( 'chat_id' =>$data['message']['chat']['id'], 'photo' => curl_file_create(__DIR__ . '/torin.jpg') ) ); exit(); > // Отправка файла. if (mb_stripos($text, 'файл') !== false) < sendTelegram( 'sendDocument', array( 'chat_id' =>$data['message']['chat']['id'], 'document' => curl_file_create(__DIR__ . '/example.xls') ) ); exit(); > >

Источник

Читайте также:  Object to string conversion in java
Оцените статью