Содержание
Бот для телеграм на php.
На данный момент telegram развивается очень активно и является одним из популярных мессенджеров, охватывающих огромную аудиторию. Одной из особенностей данного приложения является наличие ботов, выполняющих различные функции. К таким функциям относятся онлайн-чаты, информирование пользователя (например, о новой записи в блоге), различные игры или помощь пользователю в различных аспектах.
В этой статье будет рассказано о том, как создать самого простого бота на языке php.
А теперь перейдем подробнее к пошаговой инструкции, рассказывающей как создать бот для телеграм на php.
0. Подготовка
Самым первым делом необходимо отметить, что Телеграм позволяет размещать ботов только на доменах, защищенных сертификатом SSL. Если у вас еще нет такого сертификата, вам необходимо его приобрести. Возможно, вам также понадобится хостинг для размещения файлов бота. Для этих целей прекрасно подойдет хостинг от компании Бегет, предоставляющий бесплатные сертификаты. О его преимуществах подробно я расписал в этой статье.
1. Регистрация бота
Первым пунктом, с которого начинается разработка бота — это регистрация его у специального корневого бота — @BotFather. Находим его в списке, жмем кнопку старт, бот приветствует нас, выводя список всех доступных команд.
Вводим команду /newbot
, далее вписываем имя для своего бота и его username — адрес бота для доступа других пользователей. После этого вашему боту будет присвоен уникальный токен, запишите и сохраните его, он еще пригодится.Обратите вниманиеUsername вашего бота должен заканчиваться символами bot или _bot
Все! Ваш бот создан и зарегистрирован в системе. Теперь можно настроить его описание, задать картинку профиля и другое в разделе Edit Bots.
2. Установка библиотеки
Для разработки бота воспользуемся готовой библиотекой telegram-bot-sdk
. Установим ее с помощью composer
:
composer require irazasyed/telegram-bot-sdk ^2.0
Здесь же можно настроить соединение по ftp с вашим сервером, где находится сайт из пункта 0. Я разместил своего бота в папке /bot/ своего сайта, имейте это ввиду при дальнейшем изучении статьи. Теперь настраиваем webhook для того, чтобы дать понять телеграму, где брать информацию о теле бота. Самый простой способ — веб запрос:
https://api.telegram.org/botздесь_вставляем_токен/setWebhook?url=https://anton-mironov.ru/bot/index.php
Соответственно вписываем свои данные на месте сайта и токена и отправляем данный запрос через любой браузер. В ответ должен прийти JSON файл:
{"ok":true,"result":true,"description":"Webhook was set"}
Это означает, что webhook установлен, и все запросы приходящие к боту будут обрабатываться файлом — обработчиком, указанным в параметре url.
3. Написание кода
Наш файл index.php
в папке /bot/
является главным обработчиком запросов бота. Рассмотрим его возможный вид: 1) Прежде всего подключаем библиотеку и инициализируем бота при помощи токена
include('vendor/autoload.php'); use TelegramBotApi; $telegram = new Api('здесь_вставляем_токен');
2) Далее получаем информацию о полученном от пользователя сообщении методом getWebhookUpdates()
:
$message = $telegram->getWebhookUpdates()->getMessage();
В объекте $message будет содержаться вся информация о присланном сообщении и пользователе, который его прислал. Ниже описаны основные методы данного объекта. Подробную информацию можно найти в документации.
getMessageId() // уникальное id сообщения getFrom() // Информация о пользователе getDate() // Дата сообщения getChat() // Информация о чате, из которого отправлено сообщение getText() // Если прислан текстовый файл, текст сообщения getAudio() // Если прислан аудиофайл, информация о нем getDocument() // Если прислан документ, информация о нем getPhoto() // Если прислано фото, информация о нем getSticker() // Если прислан стикер, информация о нем getVideo() // Если прислано видео, информация о нем
Основные методы
Возвращает объект User, содержащий следующие методы:
getId() // id пользователя getFirstName() // Имя пользователя getLastName() // Фамилия пользователя getUsername() // Username пользователя
методы getFrom()
Возвращает объект Chat:
getId() // id чата, из которого пришло сообщение getType() // Тип чата - 'private', 'group', 'supergroup' или 'channel' getTitle() // Заголовок чата (если групповой или канал) getUsername() // Username (если приватный чат)
методы getChat()
Теперь мы можем проанализировать, что прислал нам пользователь
$text = $message->getText(); // Текст присланный пользователем $chat = $message->getChat()->getId(); // id чата с пользователем
3) Теперь мы можем определить какой тип сообщения прислал пользователь. Для простоты, ограничим возможность присылать нам только текстовые сообщения:
if(!empty($text)){ } else{ $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Для работы с ботом пришлите текстовое сообщение!' ]); }
Все дальнейшие команды будем записывать внутри блока if()
.
4) Каждый бот должен обязательно отвечать на две команды — /start
и /help.
Это — обязательное условие. Все остальные команды необязательны и могут иметь произвольное название. Опишем эти команды:
switch($text){ case '/start': $message = 'Вас приветствует бот anton-mironov.ru! Для вывода списка доступных команд введите /help'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; case '/help': $message = 'Список доступных команд: /start - начало работы с ботом /help - выводит данный список'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; default: $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Команда не распознана. Для помощи введите /help' ]); break; }
5) Добавим команду, позволяющую получать последние записи из RSS ленты сайта (не забываем добавлять команду в /help !). Обычно RSS лента представляет собой простой xml файл. На моем сайте вы можете увидеть его, открыв ссылку https://anton-mironov.ru/feed/.
Для чтения данного файла на PHP воспользуемся функцией simplexml_load_file, которая превращает xml файл в объект:
case '/rss': $url = 'https://anton-mironov.ru/feed/'; $rss = simplexml_load_file($url); $message = ''; foreach ($rss->channel->item as $item) { $message .= "xE2x9Cx85 " . date('d.m.Y', strtotime($item->pubDate)) . " " . $item->title . " link."'>читатьn"; } $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message,'parse_mode' => 'HTML', 'disable_web_page_preview' => true ]); break;
Чтение RSS ленты
Обратите внимание, в строке 6 символы xE2x9Cx85
обозначают смайлик с галочкой в байтовом представлении. Полный список таких смайликов.
В строке 8, в методе sendMessage мы используем дополнительные опции: 'parse_mode' => 'HTML'
позволяет передавать внутри сообщения html теги (в данном случае ), а disable_web_page_preview
указывает, что не надо загружать картинку-превью.
Результат работы после выполнения данных операций
В данной статье мы рассмотрели как создается самый простой бот для телеграм на php. В следующей статье я расскажу как использовать отдельные сложные команды и как работать с отличным от текста содержимым.
Вы задумались о написании своего бота для Telegram и не хотите изобретать велосипед? Мы поможем вам освободить несколько дней своей жизни для более важных дел.
В этой статье мы собрали лучшие фреймворки для написания чатботов на разных языках программирования. Во внимание принимались только те решения, которые имеют открытый исходный код, опубликованный на GitHub.
- Мы нашли целых три библиотеки Telebot на разных языках, которые не связаны друг с другом
- Во всех популярных языках обязательно есть одна популярная, но слабо документированная библиотека, и одна хорошо документированная, но отстающая в популярности
- В Bots Club всегда будут рады вашим ботам, поэтому не забудьте опубликовать их после релиза! ?
.Net остаётся крайне популярным для разработки устойчивых финансовых приложений. Но и у его поклонников нашлось время для создания крайне популярной библиотеки .NET Client for Telegram Bot API. Более 1,4 тыс звёзд на GitHub и более 3,5 тыс проектов на её основе.
C++ не является мейнстримным языком для написания чатботов, однако и здесь можно найти свои жемчужины.
- Например, tgbot-cpp от российского разработчика Олега Морозенкова, ныне поддерживаемую 27 контрибуторами и имеющую 361 звезду на GitHub;
- или LibTelegram из Великобритании от программиста slowriot, чуть менее популярную, но лучше документированную
Разработчики активно набирающего популярность Elixir создали две прекрасные библиотеки для работы с чатботами:
- Nadia от японского разработчика Yu Zhang, уже сплотила вокруг себя 34 контрибуторов и заслужила 293 звезды на GitHub
- Elixir Telegram Bot Boilerplate от бразильца João Ferreira хорошо документирована и уже отмечена 113 звёздами
Энтузиасты языка Go также не остались в стороне от разработки чатботов для Telegram.
- Golang bindings for the Telegram Bot API имеет более 2,3 тыс звёзд на GitHub благодаря усилиям 70 контрибуторов.
- Однако ему на пятки наступает Telebot от Ian P Badtrousers, обретший свою армию поклонников, имеющий более 1,4 тыс звёзд и подробную документацию.
Мы смогли найти одну достойную библиотеку для этого языка: telegram-api от klappvisor, к разработке которой уже подключились 18 других разработчиков.
Java — один из старейших языков, на базе которого работают миллиарды устройств и приложений. Несмотря на появление модных альтернатив, построенных на базе JVM (таких, как Scala и Kotlin), ванильный Java по-прежнему остаётся популярным.
- Самым популярным решением для построения Telegram ботов на Java является Telegram Bot Java Library от испанского разработчика Ruben Bermudez. Более 2 тысяч звёзд и 616 форков на GitHub.
- Стоит также обратить внимание на немного менее популярную, но при этом хорошо документированную библиотеку Java Telegram Bot API от Стаса Паршина, используемую сотнями разработчиков и имеющую 680 звёзд на GitHub.
Kotlin как платформа для серверной разработки только обретает свою популярность, во многом благодаря усилиям команды JetBrains.
Лучшим решением для написания своего бота для Telegram на Kotlin на данный момент является библиотека Kotlin Telegram Bot от испанского разработчика Iván Martín. Более двухсот звёзд на GitHub и 20 контрибуторов.
Отдельного упоминания заслуживает решение Telegraff от российского разработчика Руслана Молчанова с 93 звёздами на GitHub.
Node JS приобрёл большую популярность среди разработчиков из-за своей простоты и обилия библиотек.
- Лучшим фреймворком на Node JS заслуженно считается Telegram Bot API от испанского разработчика Yago. Пройдя долгий путь с 2015 года, эта библиотека получила более 4,5 тысяч звёзд на GitHub, поддерживается 67 контрибуторами и используется более, чем 5,000 разработчиков.
- Также замечательным решением является telegraf от Виталия Домникова и Сергея Совы, с более чем 3,6к звёздами и 6,5к проектами, реализованных на нём.
Наверное, ни один язык не вызывает такого горячего обсуждения, как PHP. Поэтому неудивительно, что PHP разработчики также приложили усилия к созданию качественных библиотек для построения чатботов. Мы рекомендуем обратить внимание на следующие:
- PHP Telegram Bot от Avtandil Kikabidze и Armando Lüscher, с более, чем 2,3 тыс. звёзд на GitHub и используемый в сотнях проектов
- Telegram Bot SDK от Irfaq Syed: 1,7 тыс. звёзд и 27 контрибуторов
- Telegram API Library от Camilo Sperberg с 610 звёздами и крепкой поддержкой сообщества
- PHP Telegram Bot Api, развиваемый сообществом из 26 разработчиков и получивший уже 614 звёзд
Python стал крайне модным в последнее время, особенно в среде аналитиков. Благодаря этому, появилось множество решений, облегчающих работу разработчиков. Остановимся на лучших из них.
- Python Telegram Bot имеет более 11,5 тысяч звёзд на GitHub, используется тысячами разработчиков и активно поддерживается сообществом (141 контрибутор).
- Также профессиональные разработчики оценят AIOGram с почти тысячей звёзд и более 60 контрибуторами
Конечно, мы не могли оставить в стороне Ruby, один из наиболее популярных языков последнего десятилетия.
- Если вы его поклонник, то вам стоит обратить внимание на telegram-bot-ruby, библиотеку от Александра Типугина, имеющую почти тысячу звёзд на GitHub и используемую в более, чем 1300 проектах.
- Также, возможно, вас заинтересует Telegram::Bot от Макса Меленьтева, с очень подробной документацией.
Несмотря на то, что язык Rust очень молод, он уже успел заслужить признательность от разработчиков низкоуровневых, высоконагруженных приложений.
Если вы решили создать своего бота на Rust, то лучшим выбором для вас будут следующие библиотеки:
- Rust Telegram Bot Library от мультинацональной команды разработчиков, с почти 500 звёздами на GitHub
- Чуть менее популярная, но лучше документированная teloxide
- Наконец, молодая, но набирающая популярность Telebot от разработчика Lorenz
Scala крайне любим разработчиками систем для обработки больших массивов данных. И со свойственной им основательностью они создали Canoe (от Юрия Слинкина), прекрасную библиотеку для быстрой разработки сценариев чатбота.
Также рекомендуем обратить внимание на bot4s от Alfono Peterssen, набравшего 300 звёзд на GitHub.
Несмотря на свою ориентированность прежде всего на iOS-разработку, Swift-разработчики могут также порадовать нас своими библиотеками для чатботов.
- К примеру, Telegram Bot SDK от разработчика Rapier, объединившего вокруг себя 10 единомышленников и получившего почти 250 звёзд на GitHub.
- Или чуть менее популярный Telegrammer от Гиви Патаридзе, которому помогают ещё 4 контрибутора.
Знаете ли вы другие библиотеки, достойные упоминания? Напишите о них в комментариях!
Мир чатботов Telegram богат, прекрасен, но крайне непрозрачен. Вы не доверяете ботам, а их разработчики не знают, как им завоевать ваше доверие.
В Bots Club мы создаём уютное место для общения и позволяем пользователям открыть для себя этот мир: задать вопросы разработчикам, поучаствовать в акциях, оставить отзыв и многое другое.
Bots Club — место, где люди находят себе ботов.
Подпишитесь на нас в социальных сетях и следите за новостями в нашем канале Telegram.
? Сайт • Facebook • Чат Telegram
- Tutorial
Шукюров Заур, разработчик @KinomanBot и @GaidarForum_bot, написал руководство по созданию простого чат-бота на PHP. 24 июня 2015 года разработчики Telegram открыли платформу для создания ботов (программ, которые выполняют определенные действия по заданному алгоритму). За полтора года работы платформы набралось много интересных чат-ботов, решающих множество проблем и позволяющих с пользой провести время в мессенджере.
Шаг 1: регистрация бота у @BotFather
Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов: 1) Открываете чат с @BotFather; 2) Вводите или выбираете из списка команду /newbot; 3) Отправляете желаемое название для бота; 4) Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot; 5) По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s. Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token».
Шаг 2: выбираем способ обработки запросов
Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту: 1) проверять «вручную», используя «Long Polling»; 2) доверить всё Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер. Мы остановимся на втором варианте, но у него есть ограничение: у вас на сайте обязательно должен быть установлен SSL-сертификат, чтобы все запросы проходили через безопасный протокол HTTPS. Самоподписанные и бесплатные сертификаты «Let’s Encrypt», которые поддерживает большинство хостингов, также подходят. Пример настройки самоподписанного сертификата из официальной документации Telegram.
Шаг 3: пишем код
Писать код бота будем на PHP, но чтобы не изобретать заново колесо, воспользуемся уже готовой и очень удобной библиотекой. Перво-наперво привязываем через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку:https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// yoursitehere .ru/directory/bot.php, где375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен,https:// yousitehere. ru/directory/bot.php — ссылка на файл-обработчик на нашем сайте. Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Переходим к самому главному — обработке этих самых запросов и написанию функционала бота. Ниже представлен полный листинг файла-обработчика:
include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi; $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя $text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя $keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура if($text){ if ($text == "/start") { $reply = "Добро пожаловать в бота!"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "Информация с помощью."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]); }elseif ($text == "Картинка") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]); }elseif ($text == "Гифка") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]); }elseif ($text == "Последние статьи") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }else{ $reply = "По запросу "".$text."" ничего не найдено."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode'=> 'HTML', 'text' => $reply ]); } }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }
Разберем всё по порядку. 1. Сначала мы подключаем скачанную библиотеку, указав путь (лучше полный) до файла автозагрузчика.
include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi;
2. Создаем экземпляр класса в переменной $telegram и передаем в него наш токен. В переменной $result получаем информацию о сообщении, которое пришлет нам Telegram.
$telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя
3. Затем определяем главные переменные: текстовое сообщение, уникальный идентификатор пользователя и его юзернейм. Если предстоит работа с БД, то не забывайте про фильтрацию (или лучше используйте PDO).
$text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя
4. Создаем нашу клавиатуру, состоящую из трех кнопок.
$keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура
5. Теперь, когда мы обозначили все переменные, можно перейти к обработке полученного сообщения. Для этого можно использовать конструкцию switch-case либо if-else. Так как принципиальной разницы между ними нет, остановимся на втором варианте, как наиболее привычном. В самом начале проверяем, заполнена ли переменная $text и является ли сообщение пользователя текстовым.
if($text){ … //код ... }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }
Если нет, то отправляем пользователю с помощью метода sendMessage сообщение с просьбой ввести текстовое сообщение.6. Рассмотрим вариант, когда пользователь прислал сообщение с командами /start или /help
if ($text == "/start") { $reply = "Добро пожаловать в бота!"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "Информация с помощью."; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }
В этом случае помимо текста из переменной $reply будет подгружаться клавиатура, состоящая из трёх кнопок: «Последние статьи», «Картинка» и «Гифка». Реализуется это с помощью метода replyKeyboardMarkup, параметрами которого являются:
- ‘keyboard’ => $keyboard, передаем нашу клавиатуру
- ‘resize_keyboard’ => true, клавиатура будет сжата в размерах.
- ‘one_time_keyboard’ => false, клавиатура не исчезнет после нажатия на какую-то кнопку.
7. После появления клавиатуры пользователь явно захочет попробовать потыкать на расположенные на ней кнопки, и вот что у нас «под капотом» в этом случае:
}elseif ($text == "Картинка") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]); }elseif ($text == "Гифка") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]); }elseif ($text == "Последние статьи") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }
8. Для отправки картинки используется метод sendPhoto, для отправки гифки – sendDocument. В обоих случаях Telegram позволяет передавать прямую ссылку на файл, что безусловно очень удобно, но не так быстро, как если бы мы передавали file_id уже отправленной на сервера Telegram картинки или гифки.9. Для получения последних статей используется простой парсинг RSS ленты Нетологии при помощи встроенной в PHP функции simplexml_load_file. В параметрах метода sendMessage можно заметить два новых значения: 1) 'parse_mode' => 'HTML'
, чтобы в сообщение можно было вставить HTML-теги
, ,>, или
2)
'disable_web_page_preview' => true
чтобы к сообщению со ссылкой не подгружалось превью.10. В качестве смайла (стрелка вправо) используются символы xE2x9ExA1. Список всех смайлов в таком виде можно найти на специальном сайте.11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение. Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.
От редакции
PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!</pre>
Начнем с того, что у Telegram действительно полностью открытый клиентскийкод. К сожалению, мы не видим комиты каждый день прямо на GitHub, но у нас есть код под открытой лицензией. Архитектура Telegram подразумевает, что и Bot и API имеет практически такие же методы — https://core.telegram.org/methods.
На самом деле, Telegram представляет не просто чат-мессенджер, а социальную платформу, доступ к которой открыт для разного рода приложений. Они могут предоставлять дополнительные фишки пользователям, взамен используя готовую сеть пользователей и сервера для доставки сообщений. Звучит настолько привлекательно, что нам захотелось попробовать написать своего “клиента” для Телеграм.
Суть приложения
В основном мы занимаемся картами и навигацией, поэтому мы сразу смотрели что-нибудь связанные с геолокацией. Мне очень понравилось, что в Telegram, раньше всех остальных приложений, появился удобный способ делится местоположением в реальном времени (https://telegram.org/blog/live-locations) и я достаточно часто этим пользуюсь: помочь сориентироваться другу, показать дорогу и самое главное ответить на главный вопрос “Когда ты будешь?”. В принципе, этого хватает большинству людей, но как всегда есть сценарии, когда простых возможностей не хватает. Например, это может быть группа более 10 человек, с разными устройствами (некоторые устройства возможно не являются телефонами) и разными людьми. Этим людям было бы удобно обмениваться сообщениями в группе, а также видеть перемещения друг друга на карте.
Во главу угла мы поставили задачу создать дополнительную ценность для Telegram, а не пытаться использовать его не по назначению. Мы не хотели, чтобы люди у которых нет специального клиента Телеграм, видели в чате месиво сообщений или что-то невразумительное. У людей с “улучшенным” клиентом, появляются же дополнительные возможности, например:
- Более тонкое управление временем при отправке локации в реальном времени в чат.
- Просмотр местоположения контактов на карте.
- Подключение к чату маячковых устройств, через внешний API (Bot).
Как мы это делали
К счастью, весь код, который мы пишем — Open-Source, поэтому я сразу могу дать ссылку на его реализацию — Реализация Bot и Реализация Telegram Client на Kotlin.
Bot — основы
// Gradle implementation "org.telegram:telegrambots:3.6" TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); telegramBotsApi.registerBot(new TelegramLongPollingBot() {...});
Основная особенность передачи location, что его надо часто обновлять, и боту необходимо редактировать уже отправленные сообщения. Если бы не было такой возможности, то Bot бы просто заспамил чат и это, конечно, был бы Epic Fail. Слава богу, Telegram предоставляет права боту редактировать сообщения на протяжении 24 часов (минимум, возможно и дольше).
Передать сообщение можно многими способами. Есть тип Plain Text, Venue, Location, Game, Contact, Invoice и т.д. Казалось, что для нашей задачи отлично подходит Location, но вскрылась неприятная особенность. Location можно передать только с одного устройства для одного аккаунта или бота одновременно! Представьте у вас 2 телефона и с двух телефонов вы отправили свой Location в один чат. Так вот, на сервере случится ошибка и первый Location Sharing просто остановится. Казалось бы, это явно неральный случай, но представьте, у вас много китайских маячков, которые умеют отправлять Location по заданному URL, но они не умеют отправлять прямо в Telegram. Вы пишите Bot, который забирает с сервера и пушит в телеграм. Вот тут и вылазит, то что Bot не сможет отправить больше одного сообщения маячка с типом Location. Получается, это отлично подходит для единоразовой отправки, но не подходит для Live Location.
Решение простое — отправлять текстовые сообщения, а клиент будет парсить текст и показывать локации на карте. К сожалению в стандартном клиенте Telegram будут видны только текстовые сообщения, но там можно вставить ссылку, чтобы открыть карту.
Bot — Подводные камни
К сожалению, Bot пришлось переписывать аж 2.5 раза. Основная проблема — неправильный дизайн коммуникации.
- Почему-то вначале казалось хорошей идеей, если бот будет полноценным участником чата и отправлять сообщения. Но, это плохо и с точки зрения Privacy переписки и с точки зрения взаимодействия с ботом. Правильное решение, использовать Inline bots. Таким образом, гарантируется, что бот не видит ничего кроме своего Location и его можно использовать в любом чате. По-человечески говоря, некультурно тащить своего бота в какой-то общий чат, а нужно пообщаться с ботом один на один и настроить его, а дальше он сможет отправлять нужные сообщения в любой выбранный чат.
- В Telegram Message API есть исторически 2 типа взаимодействия: кнопки под текстом ( (inline buttons)[https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons] ) и ответы боту напрямую текстом. В общем, ответы с ботом безнадежно устарели. Кнопки немного сложнее с точки зрения реализации, но это полностью окупается удобством использования и именно их надо использовать для всего нетекстового ввода.
- В качестве примера бота можно посмотреть популярный @vote_bot или наш @osmand_bot.
Telegram Client
Найти примеры готовых telegram client, кроме основного, нам не удалось, но достаточно простая структура tdlib помогла нам создать базовый клиент буквально за пару дней.
Настройка Gradle:
task downloadTdLibzip { doLast { ant.get(src: 'https://core.telegram.org/tdlib/tdlib.zip', dest: 'tdlib.zip', skipexisting: 'true') ant.unzip(src: 'tdlib.zip', dest: 'tdlib/') } } task copyNativeLibs(type: Copy) { dependsOn downloadTdLibzip from "tdlib/libtd/src/main/libs" into "libs" } task copyJavaSources(type: Copy) { dependsOn downloadTdLibzip from "tdlib/libtd/src/main/java/org/drinkless/td" into "src/org/drinkless/td" } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) }
Практически все внутренности Телеграмма написаны на С++ и с точки зрения Android виден только класс API на 1.5 Мб прокси методов TdApi.java. Путем сопоставления документации ботов и названия методов, можно достаточно просто сориентироваться куда двигаться.
Инициализация клиента с global handler:
fun init(): Boolean { return if (libraryLoaded) { // create client client = Client.create(UpdatesHandler(), null, null) true } else { false } }
Запрос фото пользователя:
private fun requestUserPhoto(user: TdApi.User) { val remotePhoto = user.profilePhoto?.small?.remote if (remotePhoto != null && remotePhoto.id.isNotEmpty()) { downloadUserFilesMap[remotePhoto.id] = user client!!.send(TdApi.GetRemoteFile(remotePhoto.id, null)) { obj -> when (obj.constructor) { TdApi.Error.CONSTRUCTOR -> { val error = obj as TdApi.Error val code = error.code if (code != IGNORED_ERROR_CODE) { listener?.onTelegramError(code, error.message) } } TdApi.File.CONSTRUCTOR -> { val file = obj as TdApi.File client!!.send(TdApi.DownloadFile(file.id, 10), defaultHandler) } else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj") } } } }
Telegram Client — подводные камни
- Регистрация/Login и Logout. При регистрации необходимо учесть разные сценарии: когда код доступа присылается SMS или в другой телеграм клиент, двухфакторную авторизацию и т.п. Самая большая сложность — это тестирование. Любая авторизация более 3-х раз вела к блокировке аккаунта на 24 часа, поэтому тестировать Logout было особенно весело. Несмотря на то, что регистрация нужна всего лишь один раз, наверное это самая сложная часть интеграции.
- Определить как и в каком порядке вычитывать сообщения. Любой клиент имеет доступ ко всем сообщениям во всех чатах, но вычитывать их надо последовательно. В нашем случае 99% сообщений нужно отбрасывать. Сначала мы почему-то сделали чтение всех сообщений за последние 3 дня при логине, но в дальнейшем это только вызвало проблемы и при рестарте у нас пропадали сообщения. Поэтому сейчас мы читаем только новые сообщения, а для тех сообщений, что нам нужны сохраняем id во внутренней БД.
Что получилось
Наверное, зная все подводные камни можно было бы все сделать в разы быстрее, но получилось где-то 1-2 месяца на трех человек. Финальное приложение можно найти в Google Play.
Главный вопрос в этой истории, насколько правильно это взаимодействие с точки зрения Телеграма и понравятся ли пользователям такого рода интеграции. В любом случае, сама идея нишевая и отдельных клиентов она уже нашла.
Буду рад ответить на ваши вопросы.
Вопрос задан28 дней назадПоследняя активность23 дня назадПросмотрен 34 раза 1
Есть вопрос: делаю телеграм бота на заказ, на laravel, использую laravel sdk ^2.0 (irazasyed автор)пакет, поднял серв с самописным сертификатом, делал всё по туториалам, говорят нада настроить веб хук по сылке в адресной строке https://api.telegram.org/bot<мой токен с botfather>/setWebhook?url=<Домен + сылка, которая прописаная в роутах>, на что мне приходит json ответ: Webhook was set, в контроллере код следующий:
use IlluminateHttpRequest; use TelegramBotApi; use TelegramBotLaravelFacadesTelegram; class TelegramController extends Controller { public function webhook(Request $request){ $key = env('TELEGRAM_TOKEN', 'мой токен'); $telegram = new Api($key); $result = $telegram->getWebhookUpdate(); $text = isset($result["message"]["text"]) ? $result["message"]["text"] : ""; $chat_id = isset($result["message"]["chat"]["id"]) ? $result["message"]["chat"]["id"] : 0; $username = isset($result["message"]["from"]["username"]) ? $result["message"]["from"]["username"] : ""; $telegram->sendMessage([ 'chat_id' => <мой чат id>, 'text' => $text ]); } }
роуты:
Route::match(['get', 'post'], 'webhook/telegram', [ 'uses' => 'TelegramController@webhook' ]);
Проверял в постмане, если в ручную кинуть запрос на отправку меседжа, то всё ок, но если отправить меседж боту, то реакции 0, потому я думаю что проблема где-то меджу серваком и ботом(ерорных записей в логах laravel и сервака не было), всмысле запрос от бота идёт ок, но не идёт ко мне на серв, а если и идёт, то не в метод, пробовал так же продебажить, приходит ли туда вообше что то, результат отрицательный. Прошу помощи с этим вопросом, перепробовал всё. Заранее благодарю.
Улучшить вопрос
1 ответ 1
Текущие По дате публикации Голоса1
- В библиотеке irazasyed есть команда
php artisan telegram:webhook
, используя ее можно легче управлять вебхуком напрямую из вашего приложения - Для вебхука необходим только тип запроса POST, в роутах нет необходимости создавать get-запрос для этого.
- Вероятнее всего проблема в том, что у вас используется самоподписный сертификат. Что бы он работал с Telegram API, необходимо отправлять файл с публичным ключем вместе с
setWebhook
методом. В случае если вы будете использоватьtelegram:webhook
команду, то нужно указать параметрcertificate_path
в конфигурации вашего бота (config/telegram.php
), в котором указать путь к файлу с публичным ключем.
К сожалению библиотека irazasyed ужасно документирована и имеет много проблем в коде, поэтому довольно не комфортна для пользователей, которые не копаются в ней напрямую. Именно по этой причине я написал собственную библиотеку и делал упор на документацию и примеры westacks/telebot
, если вы еще не сильно интегрировались с библиотекой irazasyed, то вам будет комфортнее ознакомиться с моей библиотекой.
Улучшить ответ1
Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.
lang-phpИспользуемые источники:
- https://anton-mironov.ru/telegram/bot-dlya-telegram-na-php/
- https://medium.com/bots-club-ru/25-лучших-библиотек-для-написания-telegram-чатботов-в-2020-г-1a17b204ef4
- https://habr.com/ru/company/netologyru/blog/326174/
- https://habr.com/ru/post/424245/
- https://ru.stackoverflow.com/questions/1244247/laravel-telegram-bot-sdk