Найти в Дзене
Записки сисадмина

Python. Telegram bot. Создаем первого бота.

Времена меняются, а вместе с ними меняются и люди. У людей появляются новые привычки и предпочтения. Многие, даже в рабочем процессе, уходят от писем на электронных почтах к сообщениям в мессенджерах. И как бы консервативен инженер ни был, под это тоже нужно подстраиваться. Если людям удобнее получать информацию через телеграмм - так тому и быть. Ранее мы настраивали рассылку отчетов людям через email. Многие пропускали эти письма, многим в принципе не удобно было пользоваться почтой. Но мы же не будем отправлять каждый день файлы руками. Давайте автоматизировать! В телеграмме все боты создаются через главного бота BotFather. Наш бот готов, мы получили его токен, который будем использовать для обращения к api telegram. Для нашего проекта нам нужны будут python, любая IDE, которая вам удобнее и библиотека pytelegrambotapi. import telebot bot = telebot.TeleBot('bot_token') bot.polling() Вместо строки 'bot_token' вписываем в кавычках API token, который мы получили от BotFather. Строка b
Оглавление

Времена меняются, а вместе с ними меняются и люди. У людей появляются новые привычки и предпочтения. Многие, даже в рабочем процессе, уходят от писем на электронных почтах к сообщениям в мессенджерах. И как бы консервативен инженер ни был, под это тоже нужно подстраиваться. Если людям удобнее получать информацию через телеграмм - так тому и быть.

Ранее мы настраивали рассылку отчетов людям через email. Многие пропускали эти письма, многим в принципе не удобно было пользоваться почтой. Но мы же не будем отправлять каждый день файлы руками. Давайте автоматизировать!

Создадим нашего первого бота

В телеграмме все боты создаются через главного бота BotFather.

  • Напишем ему, чтобы создать нашего бота.
-2
  • Создадим ему команды /start и /help
-3
  • И добавим аватарку.
-4

Наш бот готов, мы получили его токен, который будем использовать для обращения к api telegram.

Приступаем к написанию кода

Для нашего проекта нам нужны будут python, любая IDE, которая вам удобнее и библиотека pytelegrambotapi.

  • Устанавливаем библиотеку и создаем файл bot.py
-5
import telebot
bot = telebot.TeleBot('bot_token')
bot.polling()

Вместо строки 'bot_token' вписываем в кавычках API token, который мы получили от BotFather.

Строка bot.polling() не даст нашему скрипту завершиться, так как бот будет держать соединение с api telegram открытым.

  • Напишем обработчики для наших команд /start и /help

Любое сообщение, которое бот увидит, обрабатывается декоратором message_handler. Внутри мы указываем, на какие именно сообщения будет отрабатывать функция внутри декоратора: команды (commands), определенный тип сообщений (content_types) и т.д.

Обработка команды /start
Обработка команды /start

Как только наш бот получит сообщение с командой "/start", он выведет нам объект сообщения:

{'content_type': 'text', 'id': 49, 'message_id': 49, 'from_user': {'id': 779500420, 'is_bot': False, 'first_name': 'Mikhail', 'username': 'nightfear_kael', 'last_name': None, 'language_code': 'ru', 'can_join_groups': None, 'can_read_all_group_messages': None, 'supports_inline_queries': None, 'is_premium': None, 'added_to_attachment_menu': None, 'can_connect_to_business': None, 'has_main_web_app': None}, 'date': 1738332935, 'chat': {'id': 779500420, 'type': 'private', 'title': None, 'username': 'nightfear_kael', 'first_name': 'Mikhail', 'last_name': None, 'is_forum': None, 'max_reaction_count': None, 'photo': None, 'bio': None, 'join_to_send_messages': None, 'join_by_request': None, 'has_private_forwards': None, 'has_restricted_voice_and_video_messages': None, 'description': None, 'invite_link': None, 'pinned_message': None, 'permissions': None, 'slow_mode_delay': None, 'message_auto_delete_time': None, 'has_protected_content': None, 'sticker_set_name': None, 'can_set_sticker_set': None, 'linked_chat_id': None, 'location': None, 'active_usernames': None, 'emoji_status_custom_emoji_id': None, 'has_hidden_members': None, 'has_aggressive_anti_spam_enabled': None, 'emoji_status_expiration_date': None, 'available_reactions': None, 'accent_color_id': None, 'background_custom_emoji_id': None, 'profile_accent_color_id': None, 'profile_background_custom_emoji_id': None, 'has_visible_history': None, 'unrestrict_boost_count': None, 'custom_emoji_sticker_set_name': None, 'business_intro': None, 'business_location': None, 'business_opening_hours': None, 'personal_chat': None, 'birthdate': None, 'can_send_paid_media': None}, 'sender_chat': None, 'is_automatic_forward': None, 'reply_to_message': None, 'via_bot': None, 'edit_date': None, 'has_protected_content': None, 'media_group_id': None, 'author_signature': None, 'text': '/start', 'entities': [<telebot.types.MessageEntity object at 0x751eb50bf400>], 'caption_entities': None, 'audio': None, 'document': None, 'photo': None, 'sticker': None, 'video': None, 'video_note': None, 'voice': None, 'caption': None, 'contact': None, 'location': None, 'venue': None, 'animation': None, 'dice': None, 'new_chat_members': None, 'left_chat_member': None, 'new_chat_title': None, 'new_chat_photo': None, 'delete_chat_photo': None, 'group_chat_created': None, 'supergroup_chat_created': None, 'channel_chat_created': None, 'migrate_to_chat_id': None, 'migrate_from_chat_id': None, 'pinned_message': None, 'invoice': None, 'successful_payment': None, 'connected_website': None, 'reply_markup': None, 'message_thread_id': None, 'is_topic_message': None, 'chat_background_set': None, 'forum_topic_created': None, 'forum_topic_closed': None, 'forum_topic_reopened': None, 'has_media_spoiler': None, 'forum_topic_edited': None, 'general_forum_topic_hidden': None, 'general_forum_topic_unhidden': None, 'write_access_allowed': None, 'users_shared': None, 'chat_shared': None, 'story': None, 'external_reply': None, 'quote': None, 'link_preview_options': None, 'giveaway_created': None, 'giveaway': None, 'giveaway_winners': None, 'giveaway_completed': None, 'forward_origin': None, 'boost_added': None, 'sender_boost_count': None, 'reply_to_story': None, 'sender_business_bot': None, 'business_connection_id': None, 'is_from_offline': None, 'effect_id': None, 'show_caption_above_media': None, 'paid_media': None, 'refunded_payment': None, 'proximity_alert_triggered': None, 'video_chat_scheduled': None, 'video_chat_started': None, 'video_chat_ended': None, 'video_chat_participants_invited': None, 'web_app_data': None, 'message_auto_delete_timer_changed': None, 'json': {'message_id': 49, 'from': {'id': 779500420, 'is_bot': False, 'first_name': 'Mikhail', 'username': 'nightfear_kael', 'language_code': 'ru'}, 'chat': {'id': 779500420, 'first_name': 'Mikhail', 'username': 'nightfear_kael', 'type': 'private'}, 'date': 1738332935, 'text': '/start', 'entities': [{'offset': 0, 'length': 6, 'type': 'bot_command'}]}}

Ко всем данным, которые мы получили, мы можем обращаться напрямую. Так, узнать id пользователя можно с помощью message.from_user.id

Заранее советую использовать именно это поле для идентификации пользователя, так как в групповых чатах и каналах message.chat.id будет отдавать ID группы, а не пользователя.

Добавим ответ бота на наши команды

Для отправки текстового сообщения используется функция send_message. Все ее параметры разбирать сейчас не будем. Для нас важны только первые два: chat_id (кому отправлять) и text (что отправлять).

-7
@bot.message_handler(commands=['start'])
def start_message(message):
bot.send_message(chat_id=message.chat.id, text='Давай начнем общение')

Также пропишем реакцию на команду /help

-8
-9

Итак, наш бот работает и умеет обрабатывать 2 команды.

Итоговый код:

import telebot
bot = telebot.TeleBot('bot_token')
@bot.message_handler(commands=['start'])
def start_message(message):
bot.send_message(chat_id=message.chat.id, text='Давай начнем общение')
@bot.message_handler(commands=['help'])
def help_message(message):
bot.send_message(message.chat.id, 'Здесь будет справочная информация')
bot.polling()

В дальнейших статьях мы будем погружаться в мир API telegram все глубже и глубже :)