Скрипт конструктора ботов телеграмм
Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.
Статья получилась длинной, советую пробежаться глазами по содержанию и кликнуть по интересующему вас пункту.
P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.
Для начала стоит определиться, что же будет делать наш бот. Я решил написать банального простого бота, кторый будет парсить и выдавать нам заголовки с Хабра.
И так, начнём же.
BotFather
Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:
В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.
Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.
P.S. Оно должно заканчиваться на Bot/bot
Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather
all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД"
top - спарсить заголовки с вкладки "ЛУЧШЕЕ"
На этом работа с BotFather закончилась, перейдём к следующей части.
Установка и настройка pipenv. Первый запуск.
Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py
Установим pipenv, если его конечно ещё нет.
Установим pipenv в папку проекта.
Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.
Начинаем писать код!
Открываем bot.py, импортируем библиотеки и создаём главные переменные.
Запустим бота. Посмотри наличие ошибок.
Если ошибок не появилось, то продолжим.
Пришло время научить бота отвечать нам. Возможно даже сделать его ответы полезными.
Основы взаимодействия. Ответ на команды
Начнём с самого простого: ответим на команды /start и /go
Теперь можно запустить бота и написать ему /start или /go и он ответит.
Добавим вот такой код.
Основы взаимодействия. Ответ на картинки, документы, аудио и прочие.
Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=['text'].
Рассмотрим пример с картинкой, добавив этот код.
Все типы контента:
text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message
Но, есть тут проблема. Можно повторно вызвать команду /go или /start, и начнётся бардак.
Пофиксить это несложно, добавим переменную для проверки состояния выполнения скрипта.
С построением простых цепочек мы разобрались, пойдём дальше.
Добавляем парсер в цепочку.
Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно.
Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.
По итогу парсер возвращает нам строку с заголовками статей, основываясь на наших запросах.
Пробуем, используя полученные знания, написать бота связанного с парсером. Я решил создать отдельный класс (это скорее всего неправильный метод, но это уже относится к питону, а не к основной теме статьи), и в объекте этого класса хранить изменяемые данные.
Теория. Методы взаимодействия с ботом.
Также в дополнительных материалах будут ссылки на всё, что использовалось и о чём говорилось.
Маркапы. Добавляем клавиатуры для быстрого ответа.
Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]
Я выведу маркапы в отдельный файл — markups.py.
В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup в send_message .
В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.
Применим полученные знания к нашему боту.
Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.
Деплоим бота на Heroku.
Для начала надо зарегистрироваться на Хероку и на Гитхабе.
Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py
Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).
Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.
Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.
Чтобы выключить бота
И, не забываем перед залитием на гитхаб и удалить TOKEN из нашего bot.py. Ведь нам не нужно, чтобы кто-то им пользовался. Можно конечно воспользоваться .gitignore и вынести токены в отдельный фай.
Поздравляю!
Работа окончена, бот работает удалённо.
Ссылки
Заключение
Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
PHP Telegram Bot
A Telegram Bot based on the official Telegram Bot API
Table of Contents
This is a pure PHP Telegram Bot, fully extensible via plugins.
Telegram announced official support for a Bot API, allowing integrators of all sorts to bring automated interactions to the mobile platform. This Bot aims to provide a platform where one can simply write a bot and have interactions in a matter of minutes.
- Retrieve updates with webhook and getUpdates methods.
- Supports all types and methods according to Telegram Bot API 6.0 (April 2022).
- Supports supergroups.
- Handle commands in chat with other bots.
- Manage Channel from the bot admin interface.
- Full support for inline bots.
- Inline keyboard.
- Messages, InlineQuery and ChosenInlineQuery are stored in the Database.
- Conversation feature.
This code is available on GitHub. Pull requests are welcome.
Create your first bot
Message @BotFather with the following text: /newbot
If you don't know how to message by username, click the search field on your Telegram app and type @BotFather , where you should be able to initiate a conversation. Be careful not to send it to the wrong contact, because some users have similar usernames to BotFather .
@BotFather replies with:
Type whatever name you want for your bot.
@BotFather replies with:
Type whatever username you want for your bot, minimum 5 characters, and must end with bot . For example: telesample_bot
@BotFather replies with:
Note down the 'token' mentioned above.
Optionally set the bot privacy:
Send /setprivacy to @BotFather .
@BotFather replies with:
Type (or select) @telesample_bot (change to the username you set at step 5 above, but start it with @ )
@BotFather replies with:
Type (or select) Disable to let your bot receive all messages sent to a group.
@BotFather replies with:
Require this package with Composer
Install this package through Composer. Edit your project's composer.json file to require longman/telegram-bot .
Create composer.json file
and run composer update
or
run this command in your command line:
Choose how to retrieve Telegram updates
Webhook | getUpdates | |
---|---|---|
Description | Telegram sends the updates directly to your host | You have to fetch Telegram updates manually |
Host with https | Required | Not required |
MySQL | Not required | (Not) Required |
Using a custom Bot API server
For advanced users only!
As from Telegram Bot API 5.0, users can run their own Bot API server to handle updates. This means, that the PHP Telegram Bot needs to be configured to serve that custom URI. Additionally, you can define the URI where uploaded files to the bot can be downloaded (note the placeholder).
Note: If you are running your bot in --local mode, you won't need the Request::downloadFile() method, since you can then access your files directly from the absolute path returned by Request::getFile() .
Note: For a more detailed explanation, head over to the example-bot repository and follow the instructions there.
Create set.php with the following contents:
Open your set.php via the browser to register the webhook with Telegram. You should see Webhook was set .
Now, create hook.php with the following contents:
Self Signed Certificate
Upload the certificate and add the path as a parameter in set.php:
Edit unset.php with your bot credentials and execute it.
For best performance, the MySQL database should be enabled for the getUpdates method!
Create getUpdatesCLI.php with the following contents:
Next, give the file permission to execute:
getUpdates without database
If you choose to / or are obliged to use the getUpdates method without a database, you can replace the $telegram->useMySQL(. ); line above with:
❗ Note that by default, Telegram will send any new update types that may be added in the future. This may cause commands that don't take this into account to break!
It is suggested that you specifically define which update types your bot can receive and handle correctly.
You can define which update types are sent to your bot by defining them when setting the webhook or passing an array of allowed types when using getUpdates.
Alternatively, Update processing can be allowed or denied by defining a custom update filter.
Let's say we only want to allow messages from a user with ID 428 , we can do the following before handling the request:
The reason for denying an update can be defined with the $reason parameter. This text gets written to the debug log.
All types are implemented according to Telegram API 6.0 (April 2022).
Full support for inline query according to Telegram API 6.0 (April 2022).
All methods are implemented according to Telegram API 6.0 (April 2022).
Messages longer than 4096 characters are split up into multiple messages.
To send a local photo, add it properly to the $data parameter using the file path:
If you know the file_id of a previously uploaded file, just use it directly in the data array:
To send a remote photo, use the direct URL instead:
sendAudio, sendDocument, sendAnimation, sendSticker, sendVideo, sendVoice and sendVideoNote all work in the same way, just check the API documentation for the exact usage. See the ImageCommand.php for a full example.
Send Chat Action
Retrieve the user photo. (see WhoamiCommand.php for a full example)
getFile and downloadFile
Get the file path and download it. (see WhoamiCommand.php for a full example)
Send message to all active chats
To do this you have to enable the MySQL connection. Here's an example of use (check DB::selectChats() for parameter usage):
You can also broadcast a message to users, from the private chat with your bot. Take a look at the admin commands below.
MySQL storage (Recommended)
If you want to save messages/users/chats for further usage in commands, create a new database ( utf8mb4_unicode_520_ci ), import structure.sql and enable MySQL support BEFORE handle() method:
You can set a custom prefix to all the tables while you are enabling MySQL:
You can also store inline query and chosen inline query data in the database.
External Database connection
It is possible to provide the library with an external MySQL PDO connection. Here's how to configure it:
All methods implemented can be used to manage channels. With admin commands you can manage your channels directly with your bot private chat.
The bot is able to recognise commands in a chat with multiple bots (/command@mybot).
It can also execute commands that get triggered by events, so-called Service Messages.
Maybe you would like to develop your own commands. There is a guide to help you create your own commands.
Also, be sure to have a look at the example commands to learn more about custom commands and how they work.
You can add your custom commands in different ways:
With this method you can set some command specific parameters, for example:
Enabling this feature, the bot admin can perform some super user commands like:
- List all the chats started with the bot /chats
- Clean up old database entries /cleanup
- Show debug information about the bot /debug
- Send message to all chats /sendtoall
- Post any content to your channels /sendtochannel
- Inspect a user or a chat with /whois
Take a look at all default admin commands stored in the src/Commands/AdminCommands/ folder.
You can specify one or more admins with this option:
Telegram user id can be retrieved with the /whoami command.
To enable this feature follow these steps:
- Add your bot as channel administrator, this can be done with any Telegram client.
- Enable admin interface for your user as explained in the admin section above.
- Enter your channel name as a parameter for the /sendtochannel command:
Upload and Download directory path
To use the Upload and Download functionality, you need to set the paths with:
Take a look at the repo Wiki for further information and tutorials! Feel free to improve!
All project assets can be found in the assets repository.
We're busy working on a full A-Z example bot, to help get you started with this library and to show you how to use all its features. You can check the progress of the example-bot repository).
Projects with this library
Here's a list of projects that feats this library, feel free to add yours!
If you like living on the edge, please report any bugs you find on the PHP Telegram Bot issues page.
See CONTRIBUTING for more information.
See SECURITY for more information.
All work on this bot consists of many hours of coding during our free time, to provide you with a Telegram Bot library that is easy to use and extend. If you enjoy using this library and would like to say thank you, donations are a great way to show your support.
Donations are invested back into the project 👍
Thank you for keeping this project alive 🙏
Available as part of the Tidelift Subscription.
The maintainers of PHP Telegram Bot and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.
Please see the LICENSE included in this repository for a full copy of the MIT license, which this project is licensed under.
В этой статье мы реализуем простой, но крайне полезный проект на Python — бота для Telegram. Боты — это небольшие скрипты, которые могут взаимодействовать с API, чтобы получать сообщения от пользователя и отправлять информацию в разные чаты и каналы.
Python для новичков
Если ты совсем не ориентируешься в Python, то отличным началом будет прочтение трех вводных статей, которые я публиковал в «Хакере» этим летом, либо посещение курса «Python для новичков», который я начну вести для читателей «Хакера» уже совсем скоро — 30 ноября.
Чтобы создать бота, нам нужно дать ему название, адрес и получить токен — строку, которая будет однозначно идентифицировать нашего бота для серверов Telegram. Зайдем в Telegram под своим аккаунтом и откроем «отца всех ботов», BotFather.
Жмем кнопку «Запустить» (или отправим / start ), в ответ BotFather пришлет нам список доступных команд:
- / newbot — создать нового бота;
- / mybots — редактировать ваших ботов;
- / setname — сменить имя бота;
- / setdescription — изменить описание бота;
- / setabouttext — изменить информацию о боте;
- / setuserpic — изменить фото аватарки бота;
- / setcommands — изменить список команд бота;
- / deletebot — удалить бота.
Отправим бате‑боту команду / newbot , чтобы создать нового бота. В ответ он попросит ввести имя будущего бота, его можно писать на русском. После ввода имени нужно будет отправить адрес бота, причем он должен заканчиваться на слово bot. Например, xakepbot или xakep_bot . Если адрес будет уже кем‑то занят, BotFather начнет извиняться и просить придумать что‑нибудь другое.
Для взаимодействия с Telegram API есть несколько готовых модулей. Самый простой из них — Telebot. Чтобы установить его, набери
В Linux, возможно, понадобится написать pip3 вместо pip , чтобы указать, что мы хотим работать с третьей версией Python.
Эхо-бот
Для начала реализуем так называемого эхо‑бота. Он будет получать от пользователя текстовое сообщение и возвращать его.
В последнее время я сделал настолько много ботов для телеграмма, что крайне преисполнился в том, как их писать, как хостить, да и в принципе выработал красивый шаблон для быстрого их создания.
Сразу могу предложить посмотреть на то, что получиться в конце этого туториала. Для этого я запустил бота с идентичном шаблону кодом.
Также стоит отметить, что хостинг в этом примере бесплатный, но его хватает для разумной нагрузки.
А еще сразу скажу, что далее будет все на питоне. Вот. Сказал. Не буду больше ходить вокруг да около, у нас всего 5 минут (помните, да?). Приступим!
Пошаговая инструкция
1) Создаем репозиторий на гитхабе из моего шаблона
2) Регистрируемся на Heroku
3) Создаем новое приложение
4) Привязываем наш репозиторий к проекту на Heroku
5) Настраиваем автоматический deployment
6) Смотрим на адрес, где будет висеть наш бот
7) Настраиваем переменные среды
KEY
VALUE
Рандомная строка из букв для безопастности
Еще одна рандомная строка из букв для безопастности
Токен для бота, куда будут отправляться логи (оставьте пустым, если хотите отключить логирование в телеграм)
user_id, куда будут отправляться логи (получить в боте @userinfobot)
8) Собираем наше приложение и ждем пока оно запустится
Тестируем
Теперь, когда мы закончили все настраивать, пора посмотреть, что же мы "натворили".
Пример работы из коробки Пример работы логирования
Добавляем функционал
Теперь, когда у вас есть рабочий бот, который сам разворачивается и запускается в облаке, пришло время добавить свои функции. Для примера такую:
Думаю, дальше ограничивает вас только воображение. (ну почти)
Применение в проектах
Все любят, когда есть примеры работы. На основе этого шаблона я сделал бота wifi_qr_bot, который генерирует QR-коды для подключения к WiFi. Это упрощает жизнь, ведь пароль у вас длинный (безопасность, все дела), а вводить его на каждом новом устройстве вам лень.
Выводы
Вот мы и сделали нашего бота, который хостится в облаке. Он уже многое умеет в плане логирования. Для логирования я написал отдельную библиотеку, tg-logger. Если интересно, как она работает, то потыкайте в демо бота. Если все еще интересно, прочитайте мою статью. Такие пироги с котятками.
Например, если бот нужен срочно, а вы ещё не освоили Python.
Если вам показались сложными наши статьи о создании своего телеграм-бота и запуске его на сервере, то вот вам подборка конструкторов, где можно сделать почти то же самое.
В основе конструкторов лежит простой принцип: вы собираете из готовых кирпичиков то поведение, которое вам нужно. Если какого-то кирпичика нет, то варианта два: найти другой конструктор или придумать, как можно обойтись без него.
Manybot
Manybot — единственный сервис в нашей подборке, где нет визуального конструктора, а вся работа идёт через телеграм-чат. Сервис подойдёт тем, кому нужны простые и предсказуемые диалоги, выбор из небольшого числа вариантов и маленькое меню. Вряд ли он подойдёт для серьёзных проектов, потому что проще выучить Python, чем управлять сложным ботом через команды в чате.
Bottap
Стоимость: бесплатная версия с рекламой или 390 ₽ в месяц.
Мультиплатформенный конструктор помогает создать бота, который может работать одновременно в Телеграме, Вайбере и во ВКонтакте. В отличие от предыдущего сервиса, здесь есть блоки, которые можно перетягивать мышкой и настраивать связи между ними.
Botmother
Стоимость: бесплатно с ограничениями, но без рекламы, или 1249 ₽ в месяц.
Хороший сервис для тех, кому нужно много функций и подробная документация. Это уже полноценный конструктор, где можно программировать сложную логику.
В сервисе есть встроенные шаблоны для типовых ситуаций и готовые боты, которые можно переделать под свои задачи. Ещё можно отследить каждый диалог с пользователем и вмешаться, если бот не справляется с общением.
PuzzleBot
Мощный сервис, где легко создать бота любого уровня. Можно делать сложные условия, настраивать триггеры, автоматизировать сбор статистики, передавать ответы пользователей в другие сервисы и что угодно ещё.
Единственный минус — для работы с сервисом всё-таки нужно знать основы программирования: что такое переменная, вложенные условия и циклы. С другой стороны, если вы читаете «Код», то это для вас не проблема.
Amylogic
Стоимость: бесплатно, но с ограничениями по возможностям, или от 990 ₽ в месяц.
Это самый крутой по возможностям сервис, который мы тестировали. Если в PuzzleBot и Botmother мы могли делать почти всё, то здесь мы можем делать всё. Без шуток, здесь есть переменные, объекты как в ООП, функции и прочие программистские штуки.
Особый кайф — собирать из кирпичиков нужный шаблон, а потом тонко допиливать его, используя встроенные скрипты. Это выделяет сервис среди остальных, потому что его приятно использовать и тем, кто не знает программирование, и тем, кто знает его очень хорошо. Документация вся есть и на русском, поэтому проблем с изучением возникнуть не должно.
Что дальше
В следующей статье с помощью этих сервисов мы сделаем бота, который будет помогать нам с расписанием занятий, планёрками и встречами. Если у вас есть идеи для бота, которые вы хотите увидеть в наших материалах — напишите их в комментариях.
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Читайте также: