Telegram предоставляет Bot API для управления поведением ботов. С помощью доступных методов API вы можете настраивать логику ботов для данного канала.
Например, вы можете:
- отправлять сообщения
- удалять сообщения
Если ваш бот еще не подключен к каналу Telegram, сначала перейдите к инструкции по подключению и выполните ее шаги, чтобы опубликовать бота. После подключения перейдите к следующему шагу этой статьи.
Отправка сообщений
С помощью метода sendMessage вы можете отправлять сообщения от клиента в ваш личный аккаунт Telegram и отвечать клиенту прямо в диалоге с ботом.
В личный аккаунт
Чтобы отправить сообщение клиента в личный аккаунт, добавьте в сценарий:
- Блок text to $var, чтобы записать сообщение клиента в переменную.
- Блок HTTP-запрос:
- Выберите метод GET .
- В поле URL вставьте https://api.telegram.org/bot/sendMessage , где — токен из последнего сообщения бота BotFather при создании бота в Telegram. Это значение вида 5949769123:AAFVkGudasD-qdWscjxJsmlqphhOcD59eXs .
- Скопируйте JSON-объект ниже и вставьте его на вкладку BODY:
«chat_id»: 223001234, «text»: «Клиент $rawRequest.message.from.id: $message» >
- 223001234 — пример идентификатора вашего диалога с ботом. Вы можете узнать его через специального бота.
- $rawRequest.message.from.id — идентификатор диалога клиента с ботом из переменной $rawRequest . Он также имеет вид 223001235 .
- $message — переменная, которая содержит текст сообщения клиента.
Опубликуйте сценарий и протестируйте отправку сообщений. В результате успешного выполнения HTTP-запроса вы получите сообщение от бота в формате Клиент 223001235: Сообщение .
Telegram Bot Tokens, Unveiled: Your Gateway to Web3 Glory! | CertiK
В диалог клиента с ботом
Чтобы отправить сообщение клиенту в диалог с ботом из личного аккаунта, после HTTP-запроса добавьте в сценарий:
- Блок num to $var, чтобы ввести идентификатор клиента, которому вы отправляете сообщение.
- Блок Условия с выражением $currentChatId = $number , чтобы сохранить идентификатор в переменную.
- Блок text to $var, чтобы записать ваше сообщение в переменную.
- Блок HTTP-запрос:
- Выберите метод GET .
- В поле URL вставьте https://api.telegram.org/bot/sendMessage , где — токен из последнего сообщения бота BotFather при создании бота в Telegram. Это значение вида 5949769123:AAFVkGudasD-qdWscjxJsmlqphhOcD59eXs .
- Скопируйте JSON-объект ниже и вставьте его на вкладку BODY:
«chat_id»: $currentChatId, «text»: «Оператор: $text» >
- $currentChatId — идентификатор диалога клиента с ботом.
- $text — переменная, которая содержит текст вашего сообщения.
Опубликуйте сценарий после изменений и протестируйте бота. После того как вы получите сообщение от бота в формате Клиент 223001235: Сообщение , введите идентификатор клиента из этого сообщения. В следующем сообщении введите ответ клиенту. Он получит ваше сообщение в диалог с ботом в формате Оператор: Сообщение .
Удаление сообщений
С помощью метода deleteMessage вы можете удалить сообщение из диалога с ботом. Этот метод можно использовать, например, в ботах с авторизацией по логину и паролю, чтобы не хранить пароль в истории сообщений.
Чтобы удалить сообщение, добавьте в сценарий блок HTTP-запрос:
- Выберите метод GET .
- В поле URL вставьте https://api.telegram.org/bot/deleteMessage , где — токен из последнего сообщения бота BotFather при создании бота в Telegram. Это значение вида 5949769123:AAFVkGudasD-qdWscjxJsmlqphhOcD59eXs .
- Скопируйте JSON-объект ниже и вставьте его на вкладку BODY:
«chat_id»: $rawRequest.message.from.id, «message_id»: $rawRequest.message.message_id >
- $rawRequest.message.from.id — идентификатор диалога пользователя с ботом из переменной $rawRequest . Он имеет вид 223001234 .
- $rawRequest.message.message_id — идентификатор удаляемого сообщения из переменной $rawRequest . Он имеет вид 67 .
В результате успешного выполнения HTTP-запроса сообщение автоматически удаляется из диалога с ботом.
Источник: help.aimylogic.com
Как создать простого бота для Телеграм на PHP
Создадим простого бота для мессенджера Telegram с использованием PHP. Данная статья создана исключительно в поучительных целях и не претендует на полноту или правильность подхода. Весь код бота очень простой и может быть освоен начинающими PHP-разработчиками.
Предупреждаю сразу профессионалов и перфекционистов от программирования — вам здесь делать нечего . Никаких фреймворков и гитхабов! Все будет очень просто и примитивно, но работать будет. И это главное. Всем счастья
Шаг 1: подготовка
Что нам понадобится:
- Веб-сервер с работающим PHP 5.6 и выше — не локальный веб-сервер, а веб-сервер на хостинге, что важно! Так как сервисы Telegram должны будут видеть вашего бота по внешней URL-ссылке;
- Веб-сервер должен работать через https — то есть на веб-сервере должен быть установлен давно (больше суток назад) зарегистрированный SSL-сертификат. Достаточно будет бесплатного Let’s Encrypt SSL-сертификата;
- Доступ к файлам на этом сервере, конечно же — иначе как мы что-то сделаем;
- Установленная кодовая страница UTF-8 на сервере по-умолчанию или добавьте в файл .htacces в корне сайта строку AddDefaultCharset utf-8;
- Аккаунт в мессенджере Telegram;
Шаг 2. Регистрация вашего бота в Телеграм
Да, да. Бот еще даже не создан, но перед этим его уже нужно зарегистрировать, чтобы получить уникальный идентификатор, чтобы в дальнейшем обращаться к BOT API Telegram.
Шаг 3. Создаем код бота
Будем делать прямо в корне сервера (не самый верный подход, можно создать папку bot, а в ней уже файл verysimple_bot.php). Для этого на сервере создадим файл verysimple_bot.php в котором и будет весь код бота. Не забываем, что весь код в файле verysimple_bot.php должен быть в кодировке UTF-8.
Для редактирования файлов кода и заброске их на сервер удобно использовать FAR Manager — в нем есть и подсветка синтаксиса и FTP/SFTP клиент для копирования файла на сервер.
Делаем заготовку бота, который сможет выдавать список команд и информацию о нас:
Шаг 4. Делаем WebHook и конкретизируем код бота
-
Чтобы все заработало, нужно сособщить сервису Телеграм, что наш бот лежит там-то — используй его код для такого-то бота verysimple_bot.
Для этого нужно сформировать ссылку, которая называется WebHook и её мы и сообщим телеграму:
https://api.telegram.org/bot 1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG /setWebhook?url= https://www.mysite.ru/verysimple_bot.php
Не забываем где красное заменяем на свои данные!
Как сформируете эту ссылку — вставьте её в браузер и запустите!
- Пользователь в диалоге с ботом пишет запрос, например /help
- Telegram Bot API через WebHook, что мы установили, берет этот запрос и отправляет в код бота
- Мы в боте получаем его, анализируем, видим например, /help и через Telegram Bot API и
функцию message_to_telegram отправляем ответ — который появлется в диалоге как ответ бота.
Шаг 5. Добавим возможность делать заявки через бота
Заявкой будем считать сообщение или вопрос, которое можно будет отправить через нашего бота какому-то пользователю, назовем его менеджер компании. То есть нам нужно организовать такую цепочку:
- Пользователь запрашивает у бота «Оставить заявку», например набрав команду /order
- Бот входит в режим ожидания текста Заявки
- Если пользователь ввел текст и нажал Enter, только тогда отослать это сообщение заранее запрограммированному по менеджеру компании.
Получим идентификатор chat_id пользователя кому нужно отсылать заявки:
- Помните наш файл message.txt — вот он сейчас понадобится
- Присоединяемся к нашему боту тем пользователем, кому будем слать заявки (менеджер компании)
- Сразу открываем файл message.txt и смотрим блок: [chat]
$order_chat_id = ‘123456789’; //chat_id менеджера компании для заявок $bot_state = »; // состояние бота, по-умолчанию пустое
Сохраняем состояние бота для каждого пользователя
Далее, важный момент: у нас любой присоединившийся пользователь сможет сделать заявку, и чтобы бот понимал, что находится в режиме ввода заявки именно с этим пользователем, мы должны сохранять и считывать состояния бота для каждого пользователя отдельно!
Напишем две функции: set_bot_state($chat_id, $data) и get_bot_state($chat_id) — которые сохраняют текущее состояние бота и получают соответсвенно, для нужного пользователя. Сохранять будем в подпапке /users на сервере, которую создадим предварительно не забыв дать права на запись. Состояния будут хранится все в тех же текстовых файлах с именами chat_id пользователей и содержать последнюю команду:
// сохранить состояние бота для пользователя function set_bot_state ($chat_id, $data) < file_put_contents(__DIR__ . ‘/users/’.$chat_id.’.txt’, $data); >// получить текущее состояние бота для пользователя function get_bot_state ($chat_id) < if (file_exists(__DIR__ . ‘/users/’.$chat_id.’.txt’)) < $data = file_get_contents(__DIR__ . ‘/users/’.$chat_id.’.txt’); return $data; >else < return »; >>
Теперь дополним код бота, добавив запись и отлов состояния и отправив заявку менеджеру компании, если состояние отправки заявки.
Шаг 6. Регистрация команд бота
Вот и все — простой бот работает! Всем спасибо, если дочитали и что-то заработало.
Николай Комарков
Источник: www.novelsite.ru
Telegram бот через webhook
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Что это такое
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
- getUpdates — pull: ваш бот постоянно дёргает сервер Telegram и проверяет есть ли новые сообщения;
- setWebhook — push: по мере поступления новых сообщений сервер Telegram отправляет их вашему боту.
Разницу можно изобразить следующим образом:
Очевидно, что второй способ ( setWebhook ) рациональнее для всех участников процесса. Однако в нём присутствует неявная сложность: кто-то должен принимать сообщения от Telegram на стороне бота, то есть необходим веб-сервер или его эквивалент.
Как настроить
Что нужно сделать:
- Заиметь доменное имя для сервера и получить на него сертификат (например, от Let’s Encrypt). Документация также говорит, что в случае самоподписанного сертификата можно обойтись и просто IP адресом, но этого я не пробовал;
- Запилить серверную часть на стороне бота (куда будет ломиться Telegram);
- Зарегистрировать адрес серверной части в Telegram (зацепить webhook на endpoint), чтобы Telegram знал, куда ломиться с сообщениями.
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Серверная часть чуть посложнее. Я переделал текущую реализацию бота на pyTelegramBotAPI, используя пример для AIOHTTP.
Ставим необходимые пакеты:
pip install pyTelegramBotAPI pip install aiohttp pip install cchardet pip install aiodns
И сокращённо код бота теперь такой:
Что здесь происходит: мы запускаем мини-веб-сервер, который слушает порт 8443 и отвечает на запросы через определённый endpoint, который образован токеном бота. Токен используется здесь как достаточно уникальный идентификатор, чтобы какой-нибудь мимокрокодил из интернета не навызывал бота и не натворил дел. Полный адрес endpoint’а будет выглядеть вот так: https://YOUR.DOMAIN:8443/YOUR-TOKEN/ .
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
python-bot[1824]: Traceback (most recent call last): python-bot[1824]: File «/usr/local/bin/bot/bot.py», line 142, in python-bot[1824]: context.load_cert_chain(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV) python-bot[1824]: PermissionError: [Errno 13] Permission denied systemd[1]: telegram-bot.service: Main process exited, code=exited, status=1/FAILURE systemd[1]: telegram-bot.service: Failed with result ‘exit-code’.
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
groupadd letsencrypt usermod -a -G letsencrypt userforbot chgrp -R letsencrypt /etc/letsencrypt/
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
chown -R userforbot:letsencrypt /etc/letsencrypt/
Тогда сервис запустился нормально.
Регистрация
Теперь осталось самое, как оказалось, сложное — зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.
Для установки/регистрации webhook’а нужно выполнить следующий HTTP запрос (можно просто открыть этот URL в браузере):
https://api.telegram.org/botYOUR-TOKEN/setWebhook?url=https://YOUR.DOMAIN:8443/YOUR-TOKEN/
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
«description»: «Webhook was set», «ok»: true, «result»: true >
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
«ok»: false, «error_code»: 504, «description»: «Gateway Timeout» >
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
https://api.telegram.org/botYOUR-TOKEN/getWebhookInfo
Если всё нормально, должно вернуть такое:
«ok»: true, «result»: «url»: «https://YOUR.DOMAIN:8443/YOUR-TOKEN/», «has_custom_certificate»: false, «pending_update_count»: 0, «max_connections»: 40 > >
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
«ok»: true, «result»: «url»: «https://YOUR.DOMAIN:8443/YOUR-TOKEN/», «has_custom_certificate»: false, «pending_update_count»: 0, «last_error_date»: 1543762687, «last_error_message»: «SSL error «, «max_connections»: 40 > >
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Стоит также отметить, что если вы установили webhook, то опрос Telegram через getUpdates работать больше будет. Чтобы снять webhook, надо отправить тот же самый запрос, что и для установки, но на этот раз без параметра url :
https://api.telegram.org/botYOUR-TOKEN/setWebhook
«ok»: true, «result»: true, «description»: «Webhook was deleted» >
Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe — нет.
Note that even if you sign-in with your e-mail or GitHub, you still won’t be subscribed to replies. That is by design of remark42, unfortunately. To get updates about new replies/commends you need to explicitly subscribe to them either via e-mail or RSS.
Источник: decovar.dev