Сегодня мы побеседуем о том как делаются Telegram боты.
Кто ты по жизни?
Telegram боты бывают двух видов:
- Боты основанные на Webhoock
- Боты основанные на Long Polling
Первый вариант бота требует от вас поднять сервер и установить “вебхуки” для асинхронного оповещения вас о новых изменениях. На вашем сервере должен быть соответствующий роутинг.
Второй вариант бота — это имитация асинхронности. Ваш бот с определенным периодом будет запрашивать последние изменения с сервера телеграм на основании механизма long polling. Т.е. бот делает запрос и подвисает, а отвисает либо по таймауту, либо по получению новыйх обновлений. Об этом виде ботов сегодня и пойдет речь.
Long polling в разрезе работы с сетью
Когда вы работаете с Telegram Api вы нагружаете сервера Telegram. Все запросы вы отправляете по одному URL, но в один момент времени может работать только один обработчик для Telegram бота.
Интересно, что в API предусмотрена умная обработка ошибок, среди прочего, в ответе телеграм сервера, который вы за DDOS’или, может сообщить вам сколько нужно подождать, чтобы вы могли взаимодействовать с Telegram снова
Как создать своего Телеграм бота ? / Telegram bot / Token / API
Как сказано выше у вас фактически однопоточная обработка запросов к телеграм. По этому, кажется, здравым принять одну из следующих реализаций ботов:
- реализовать поток, который будет отправлять запросы и складировать ответы в общую очередь из которой потоки-обработчики будут их разбирать;
- поставить прокси-сервер, который будет затягивать последние изменения и шарить их между нодами (другими серверами) бота. В этом случае можно подменяя прокси-сервер менять реализации взаимодействия с telegram api не меняя реализацию для нод. Это решение мне нравится несколько больше, его масштабируемость зависит от потребностей в функциональности бота, т.к. если можно обрабатывать параллельно несколько чатов независимо друг от друга, то масштабируемость на пределе.
Оставим использование прокси-сервера для будущих статей, а пока давайте рассмотрим как вы можете реализовать своего бота.
Красная или синяя таблетка?
На сколько вы любите писать велосипеды? В зависимости от этого у вас есть 2 пути реализации Telegram бота:
- писать всё самому с нуля;
- воспользоваться существующей библиотекой.
Если вы используете динамически типизируемые языки, которые поддерживают нативную работу с JSON, то первый вариант, не так уж и плох, однако, уже существует большое количество библиотек для разработки ботов их публичный перечень вы можете увидеть здесь. Вы найдете много вариантов для PHP, Java, Python, Node.js и так далее. Я сейчас реализую собственную библиотеку на языке Kotlin — Clabo. Эта библиотека поможет вам на основании расширяемого DSL описать работу своего бота, например, всё что надо для запуска бота, который говорит “Привет!” по команде /start это небольшой кусочек кода по ссылке.
Пишем Telegram Bot на Python / Создание ботов для начинающих за 30 минут
BotFather
В телеграме есть специальный бот, который позволяет создавать других ботов и настраивать их. Некоторые действия вы, как пользователь, не можете сделать из интерфейса, например, сменить имя бота или задать набор команд, для этого нужен BotFather.
Теперь у вас есть представление, как реализовать бота, но что с ним можно сделать? Об этом я расскажу ниже.
И зачем всё это?
Боты очень способные, они обладают следующими возможностями:
Что в итоге?
Как создать Телеграм бот на php (инструкция)
Сегодня поговорим о том, как написать бота для Телеграм на php. Материал рассчитан на программистов начального уровня, владеющих азами php. Итак, начнем.
Подготовка к написанию бота
Прежде чем мы приступим к созданию бота, убедимся в том, что в нашем распоряжении имеются хостинг, домен и SSL-сертификат для него (т.е URL начинается с https).
BotFather. Получение API токена
Работа с TelegramBotApi
Дабы облегчить себе жизнь, взаимодействовать с API Телеграма будем при помощи TelegramBotApi. Для начала нам нужно будет клонировать проект с Гитхаба при помощи Composer. Важный момент. Composer, как правило, не устанавливается без файла php.exe. Самый простой способ это исправить — установить Open Server на ПК.
Клонирование проекта с Гитхаба
В командной строке, при помощи команды cd открываем папку, в которой планируем разместить файлы с нашим ботом и последовательно прописываем команды:
php -r «copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);» php composer-setup.php php -r «unlink(‘composer-setup.php’);»
php composer.phar require telegram-bot/api
Откроем в бразуере папку с проектом и убедимся, что все файл установились.
Далее нам нужно скопировать их на хостинг, в папку, в которой будет располагаться наш бот. Наконец можно приступить к непосредственному кодингу бота.
Кодинг Telegram бота на php
В папке с ботом создаем файл index.php.
Важно! Кодировка индексного php-файла должна быть utf-8 без bom!
Пропишем заголовки и подключим АПИ.
header(‘Content-Type: text/html; charset=utf-8’); // подключаемся к API require_once(«vendor/autoload.php»); // создаем переменную бота $token = «токен, который выдал BotFather»; $bot = new TelegramBotApiClient($token);
Переменная бота $bot создана. С этого момента, мы можем обращаться к api, однако, сначала необходимо зарегистрировать webhook.
Что такое webhook?
WebHook — это механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в вводит команду, ее надо каким-то образом передавать на сервер и получать ответ. Webhook служит как раз для этих целей. Он сообщает телеграму куда передавать команды. Поскольку сейчас Телеграм НЕ ЗНАЕТ, где именно расположен код нашего бота, то нам нужно это исправить.
Воспользуемся командой: $bot->setWebhook
// если Телеграм-бот не зарегистрирован — регистрируем if (!file_exists(«registered.trigger»)) < /** * файл registered.trigger будет создаваться после регистрации бота. * если этого файла не существует, значит бот не * зарегистрирован в Телеграмм */ // URl текущей страницы $page_url = «https://».$_SERVER[«SERVER_NAME»].$_SERVER[«REQUEST_URI»]; $result = $bot->setWebhook($page_url); if ($result) < file_put_contents(«registered.trigger»,time()); // создаем файл дабы остановить повторные регистрации >>
Сохраняем индексный файл в том виде, в каком он есть сейчас, а после обратимся к этому файлу по прямому URL. После первого такого обращения в папке с ботом должен появиться registered.trigger — файл, наличие которого подтверждает, что Телеграм знает, где лежит наш бот.
Обязательные команды для Телеграм-ботов
По правилам Телеграм — все боты должны уметь работать с двумя обязательными командами /start и /help. Займемся этим:
// обязательное. Запуск бота $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();
Cохраняем индексный файл и тестировать нашего бота! Ура! Все прекрасно работает!
Дальнейший кодинг зависит исключительно от стоящих перед Вами задач. Мне лишь остается ознакомить вас с общим принципом работы библиотеки TelegramBotApi.
Как работает библиотека TelegramBotApi
Все команды TelegramBotApi задаются блоком:
$bot->command(‘start’, function ($message) use ($bot) < . >);
Где $message — объект Message. Советую ознакомиться со всми возможными полями здесь — Types/Message.php
Второй момент. Команды перечисляются до вызова $bot->run(); , если прописать какую-то из команд ниже $bot->run(); — она не будет выполняться. Т.е. $bot->run(); должен замыкать наш код.
Отправка сообщения в TelegramBot API
Отправка сообщения выполняется командой:
$bot->sendMessage(id пользователя которому отправляем, текст сообщения);
Отправка картинок в TelegramBot API
Чтобы переслать пользователю картинку — достаточно передать ее URL. Мессенджер самостоятельно скачает, сконвертирует, а затем перешлет изображение пользователю. В качестве примера запрограммируем команду /getpic.
// передаем картинку $bot->command(‘getpic’, function ($message) use ($bot) < $pic = «https://icopydoc.ru/wp-content/uploads/fortelegrambot.jpg»; $bot->sendPhoto($message->getChat()->getId(), $pic); >);
Отправка документов и голосовых сообщений
Документы, в отличие от картинок необходимо оправлять в виде POST. К счастью, библиотека TelegramBotApi сделает все что нужно без нашего с вами участия. Для начала загрузим документ в папку с ботом.
Отправлять документ будем так:
// передаем документ $bot->command(‘getdoc’, function ($message) use ($bot) < $document = new CURLFile(‘sendfrombot.txt’); $bot->sendDocument($message->getChat()->getId(), $document); >);
Обратите внимание, что строчка
$document = new CURLFile(‘sendfrombot.txt’);
предполагает размещение txt-файла sendfrombot в в корневой папке бота. Однако, можно передавать в переменную и обычный урл. Передачей войсов (голосовых сообщения) осуществляется точно также:
// передаем войс $bot->command(‘getvoice’, function ($message) use ($bot) < $voice = «https://icopydoc.ru/wp-content/uploads/maxim_glazunov-prividenie.mp3»; $bot->sendVoice( $message->getChat()->getId(), $voice //, //$duration, //$replyToMessageId, //$replyMarkup, //$disableNotification ); >);
Получение сообщений из чата
Для получения данных из чата в API используется команда .on():
// болталка $bot->on(function($Update) use ($bot) < $message = $Update->getMessage(); $mtext = $message->getText(); $cid = $message->getChat()->getId(); if (mb_stripos($mtext,»привет») !== false) < $bot->sendMessage($message->getChat()->getId(), «Привет, чувак!»); > >, function($message) use ($name) < return true; // когда тут true — команда проходит >);
Теперь, если написать «привет», то бот ответит «Привет, чувак!».
Сообщаем Botfather-у список наших команд
После того, как все необходимые команды написаны — сообщим об их существовании в Botfather. Данный шаг не обязательный, но лучше сделать. Все просто. Открываем чат с Botfather, вводим /setcommands . Если про вводе команд совершим опечатку — повторно введем /setcommands и переопределим все команды по новой.
Протестируем получившегося бота.
Наш бот работает! Надеюсь, что смог объяснить как создать своего бота на php для телеграмма. Успехов в разработке!
Источник: icopydoc.ru
Как создать telegram api
- 10/12/2021
- Chebukin Pavel
- 2255 просмотров
- 0 комментариев
Создаем канал в Telegram и отправляем в него сообщение через PHP/Laravel просто и легко
Многие проекты используют нотификацию. Некоторые отправляют сообщения на почту, другие в Telegram, Slack и прочее. Сообщения — отличный вариант сообщить о новом заказе, комментарии, материале на сайте или происхождении какого-то события. Для многих вариантов используются библиотеки. Но вот для текстового сообщения в телеграм такое не нужно.
Достаточно открыть прямую ссылку с нужными параметрами и сейчас я покажу как это сделать, начиная от создания самого канала и до отправки сообщения.
Создаем канал в который бот будет слать сообщение
Почему канал, а не напрямую человеку? Потому что вам не нужно будет переделывать алгоритм, если нотификации должно видеть несколько человек. Не понадобится лезть в код добавляя или удаляя участников. Вы все это сможете сделать в самом телеграмме будучи администратором.
Чтобы создать канал, идем в левое меню, со значком трех полосок и нажимаем «Создать канал»
Задаем название канала, выбираем тип «Публичный» и вводим ссылку по которой он будет доступен. Канал можно позже закрыть, но это самый простой вариант пригласить бота сразу.
Создаем бота
/newbot
После этого бот вам должен ответить сообщением:
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
На которое вы вводите название бота, в моем случае пусть будет MyLaravelClub. В ответ бот спросит техническое имя бота. Оно должно быть с приставкой bot в конце, а значит я просто отвечаю сообщением MyLaravelClubBot.
Если вы не попали на уже существующее имя, бот ответит вам сообщением:
Done! Congratulations on your new bot. You will find it at t.me/MyLaravelClubBot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you’ve finished creating your cool bot, ping our Bot Support if you want a better username for it.
Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
nnnnnnnn:MMMMMMMMMM
Keep your token secure and store it safely, it can be used by anyone to control your bot.For a description of the Bot API, see this page: https://core.telegram.org/bots/api
В этом сообщении nnnnnnnn:MMMMMMMMMM это токен обращения к боту и он нам, как раз будет нужен. Переходим по указанной в сообщении ссылке, в моем случае это t.me/MyLaravelClubBot. В вашем случае будет имя вашего бота. Вместо отправки сообщения будет кнопка с надписью Запустить. Ее и нажимаем, запуская бота.
Приглашаем бота на канал и получаем идентификатор по которому будем писать от имени бота.
Переключаемся в телеграмме на наш канал, жмем на три точки в правом верхнем углу и жмем пункт «Добавить участников». После этого вводим имя нашего бота, это MyLaravelClubBot, в моем случае.
Телеграм предупредит что бота можно добавить только как администратора, на что соглашаемся, нажимая Назначить.
Следующий экран спрашивает какие права управления каналом стоит назначить боту. В нашем случае это не важно, оставляем как предложено по умолчанию.
Нажимаем Сохранить.
Самое время, если сообщение на канале от бота личные и никто не должен их видеть кроме тех кого вы сами пригласили на канал, то меняем тип канала в настройках(правый верхний угол — три точки). Меняем с Публичный на Частный и жмем кнопку Сохранить. Токен бота у нас есть, нужно теперь получить ID нашего канала. На нашем канале пишем сообщение от себя, любого содержимого, например «hello, world!».
«channel_post»:,»chat»:,»date»:1639177800,»text»:»hello, world!»>>
В этом сообщении нас интересует «id»:-1001111111111. Где число вместе со знаком и будет искомым идентификатором нашего канала. Теперь у нас есть все что нужно, а отправить сообщение можно прямой ссылкой вида:
https://api.telegram.org/bot/sendMessage?chat_id=text=Привет%20мир
После перехода по ссылке видим сообщение от бота в нашем канале:
Отправляем сообщение из PHP и/или Laravel
Теперь все просто, осталось лишь в нужном куске кода вызвать переход по ссылке. Сделать это просто следующим образом:
//ID канала куда отправляем $idChannel = ‘-100111111111’; //токен бота которым отправляем сообщение $botToken = ‘nnnnnnnnn:MMMMMMMMMM’; //наше импровизированное сообщение $message = «Статистика заказов за сутки: » .» nnВсего: заказов 99″; //кодируем его, чтобы сохранить переносы строк $message = urlencode($message); //после этого отправляем try < file_get_contents(«https://api.telegram.org/bot$botToken/sendMessage?chat_id=$idChannel>
Отзывы
Пока нет комментариев
Для того чтобы оставить комментарий, авторизуйтесь.
Источник: my-laravel.club