Как сделать кнопки в телеграмм боте python

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы "запилим" полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.

Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую Python библиотеку, реализующую все основные функции ботов - telepot. Как я уже упоминал ранее, для того, чтобы обслуживать пользователей нашего бота мы будет разрабатывать веб-приложение, используя Django фреймворк.

Как создать Telegram бота?

Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:

После создания бота, обратите внимание на строку с текстом:

За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:

  • Присвоить боту описание
  • Установить аватар
  • Поменять token

и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.

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

  • Использование вызова API метода getUpdates
  • Установка Webhook

Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.

Итак, вернёмся к python библиотеке для работы с Telegram - telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:

Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:

Переменной token присваиваем значение токена, полученного при создании бота через BotFather. В итоге после выполнения этих команд мы получим:

Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.

Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

Telegram Bot

На этапе написания простейшего Telegram бота нам этих вызовов достаточно. Приступим к написанию Django приложения для обслуживания наших пользователей.

Простая функция парсинга RSS фида Planet Python выглядит вот так:

Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django "вьюшка" выглядит следующим образом:

Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь :)

После запуска runserver, URL на который необходимо посылать запрос выглядит следующим образом:

где BOT_TOKEN - это токен нашего бота. Смотрим скриншот:

Postman REST Client

telegram-bot-postman

А давайте-ка отправим команду feed для получения списка новостей из Planet Python:

Postman и Telegram
Postman и Telegram

На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.

Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.

Как создать Telegram bot на Python основы

В этой статье мы разберём, как создать простой Telegram bot на языке программирования Python, но тут будут только основы, которые скорее для новичков, чем для профессионалов.

Установка Telegram API:

После того как это сделали скачиваем telegram bot API на Python, это делается как обычно через pip install.

На этом установка закончилась.

Перед созданием, нужно получить токен для бота, для этого напишите боту @BotFather.

botFather

Получение токена для API, чтобы создать Telegram bot на Python

Там где замазано, это и есть токен который вы получаете.

Создание Telegram bot на Python:

Потом объявляем переменную для токена, и создаём бота.

Следующие, пишем не большую функцию для создания кнопок.

Здесь первым делом мы должны сделать специальный массив, для хранения кнопок, используя types.InlineKeyboardMarkup() , потом делаем две кнопки, тут самое интересное, то какие параметры используются при создание, первый, это текст кнопки, а второе, callback_data , то какое значение оно будет возвращать при нажатие.

После через метод add() , добавляем их в массив и возвращаем его. После можно создать функцию, которая будет срабатывать при запуске бота.

Примечание:

Название функции после декоратора может быть любое, это не имеет значение.

Последняя функция которая осталось сделать, это для получения значений их кнопки, она делается точно таким же способом.

Здесь мы уже в качестве декоратора обозначаем получение информации от кнопок, но это может быть и что-то другое не обязательно кнопки.

Если же первое условие не верно, то проверяем второе, то там нужно значение два, если правильно, то делаем всё также, единственное вместо картинки с водой, используем картинку с блинчиками.

Делимся инструкцией, как написать бота с помощью библиотеки python-telegram-bot за считанные минуты. На примере гайда от программиста Давида Мастроматтео.

Установка python-telegram-bot

Для создания бота понадобится пакет python-telegram-bot — оболочка для API от Telegram. Написать бота с помощью этой библиотеки очень просто, так как она полностью совместима с Python 3.6+.

Первое, что нужно сделать — установить python-telegram-bot. Вот ссылка на официальную документацию библиотеки .

$ pip install python-telegram-bot –upgrade

Создание бота

Теперь можно взяться за создание бота. Для этого даже не нужно писать код. Перейдите в Telegram и найдите канал @BotFather, который отвечает за регистрацию новых ботов. Начните общаться с ботом и введите команду /newbot . Затем BotFather спросит у вас имя и юзернейм.

bot father 1

bot father 2

У BotFather можно запросить много других интересных вещей. Например, изменить изображение профиля бота.

Теперь нужно принять важное решение: определиться с главной задачей бота. В этой инструкции мы сделаем бота, который предоставляет информацию о биоритмах пользователей . Будьте осторожны: речь идет о псевдонаучных теориях, так что б от будет такой же полезный, как и гороскопы. Но если дойдете до конца — сможете создавать любых ботов.

Программирование бота

Пакет python-telegram-bot состоит из оболочки API Telegram. Этот инструмент доступен через telegram.Bot- классы. Помимо них, есть еще модуль telegram.ext , который значительно упростит работу.

Модуль telegram.ext содержит много классов, но самые важные — telegram.ext.Updater и telegram.ext.Dispatcher . Updater отвечает за выборку новых обновлений от Telegram. Также он передает их в Dispatcher , после чего они обрабатываются с помощью Handler .

Приступим к программированию:

В функции main создан класс Updater , который автоматически сгенерировал объект Dispatcher , доступный через .dispatcher- свойства класса Updater .

Добавьте несколько обработчиков:

Тестирование

Теперь можно протестировать бота. Запустите его.

Пошлите ему команду /start .

Ура, бот работает!

Чтобы узнать день рождения пользователя, для начала нужно изменить функцию, обрабатывающую команду /start . Чтобы упростить задачу, попросите пользователя указать год, месяц и день рождения.

В параметре update можно найти полезную информацию о пользователе, например, его имя.

В самом начале скрипта определите новую переменную STATE , которая нужна, чтобы понять, на какой вопрос отвечает пользователь.

Теперь необходимо реализовать функцию start_getting:_birthday_info() , она вызывается с помощью команды start() . После запуска вы получите информацию о дне рождения от пользователя.

Теперь пользователь ответит обычным текстом, поэтому нужно изменить функцию text() .

В функции text() необходимо понять, на какой вопрос отвечает пользователь, используя переменную STATE . После чего остается вызвать функцию для обработки каждого ответа.

Эти функции можно записать так:

Если пользователь вводит недопустимое значение, то получает ответ, что оно неверно. Значение переменной STATE не меняется, поэтому пользователь застревает на этом вопросе, пока не ответит правильно.

Создание команды

Теперь нужно обработать команду /biorhythm .

Добавьте новый обработчик команд в функцию main() .

Напишите функцию расчета биоритма:

В примере представлены две разные функции: одна для обработки команды, а другая для расчета биоритма. Таким образом удается разделить ответственность этих функций.

Полный код бота

Пришло время проверить его:

telegrem bot

Поздравляем! Telegram-бот на Python полностью готов.

Бот, созданный для примера, был сохранен. Его можно протестировать по имени пользователя @mastro35_mastrobot.

Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .

Telegram-боты - это увлечение которые позволяют вам играть в игры, находить друзей, находить новых ботов и даже создавать ботов - возможности безграничны. Сегодня я расскажу о том, как я создал telegram-бота для борьбы с пищевыми отходами, предоставляя полное учебное пособие, начиная с:

1) как создать telegram-бота с помощью BotFather

2) задавать вопросы

3) получать и хранить ответы пользователей и фотографии

4) размещать эту информацию на общедоступном Telegram-канале

5) вызов API Google Maps, чтобы показать местоположение еды на карте.

По данным продовольственно-сельскохозяйственной организации, ежегодно в мире растрачивается около 1,3 миллиарда тонн продуктов, что составляет одну треть всего продовольствия, производимого для потребления человеком. Самые распространенные виновники этой ситуации - это буфеты, рестораны и даже домашние хозяйства, по-причине закупки большого количества продуктов и не рационального их использования, превращая их в отходы даже по абсурдным причинам их внешнего вида.


В то же время 820 миллионов человек ежедневно голодают. Это кажется противоречивым - как мы можем тратить так много еды и в то же время позволить стольким людям в мире голодать? Это сводится к отсутствию связи между теми, у кого остались излишки и теми, кто нуждается в пище. Конечно, есть благотворительные организации, которые принимают пожертвования на питание, но нет прямой связи между теми, кто нуждается в еде и у того у кого продукты в избытке. В сочетании с удручающе запутанными регулирующими процессами неудивительно, что существует значительный временной промежуток между пожертвованиями продуктов питания и тем, когда они действительно приносят пользу, кто в них больше всего нуждается.

Учитывая эту проблему, почему бы не облегчить общение между теми у кого есть лишние продукты и теми, кто нуждается в еде? Это поможет связать людей с остатками пищи непосредственно с теми, кто нуждается в еде. Таким образом, пища может быть быстро получена теми, кто в ней нуждается, без значительной задержки.

Конечно, это все звучит хорошо, но как мы можем реализовать это? Именно здесь боты и каналы Telegram предоставляют простое решение для связи поставщиков продуктов питания с теми, кто нуждается в пище.

Поставщики продуктов питания могут сначала пообщаться с ботом Telegram, чтобы предоставить важную информацию о еде, такую ​​как местоположение пищи, диетические характеристики и т.д. После того, как эта информация будет собрана, бот опубликует свои списки продуктов на канале Telegram, который доступен для общественности. Как только еда размещена на канале, нуждающиеся люди могут просто забрать еду. Все это может быть выполнено без какой-либо существенной задержки - фактически весь процесс отправки еды конечному пользователю, получающему информацию, может занять менее 10 секунд!

Иллюстрированный поток процесса размещения продуктов питания

Для этого бот будет задавать следующие вопросы из поста о продуктах:

  1. Расположение еды. Используя API Карт Google, местоположение будет преобразовано в соответствующие координаты широты и долготы, которые затем могут быть отображены на карте, чтобы пользователи могли легко перемещаться к этому местоположению.
  2. Изображение еды.
  3. Диетические характеристики, то есть, является ли еда халяльной, вегетарианской и так далее.
  4. Количество порций, доступных для приема.
  5. Время, за которое еда должна быть собрана, прежде чем она будет выброшена.

Теперь, когда у нас есть понимание того, как работает этот процесс, давайте перейдем к мельчайшим деталям!

Прежде всего, мы создадим бота. Для этого отправьте в телеграмме команду /newbot в BotFather. Он запросит у вас имя бота, а затем имя пользователя (которое должно заканчиваться на боте). Вы можете легко изменить имя бота с помощью команды /setname, но невозможно изменить имя пользователя бота через BotFather, поэтому, если вы не уверены, вы можете сначала создать тестового бота со случайным именем пользователя и после того, как вы проверили все функции и убедились, что ваш бот работает, создайте нового бота с желаемым именем пользователя.

Создав нашего бота, пришло время дать ему дополнительный функционал! Поскольку цель состоит в том, чтобы создать бота, который взаимодействует с постом еды, он должен иметь возможность отправлять ему вопросы, чтобы запросить необходимую информацию, а затем сохранить информацию, прежде чем пересылать ее на общедоступный канал. Для этого мы можем использовать очень удобную оболочку Python, python-telegram-bot. На странице Github приведено множество примеров ботов, написанных с помощью оболочки, так что проверьте страницу, чтобы увидеть, есть ли примеры, подходящие для вашего варианта использования!

Во-первых, мы установим необходимые пакеты. Поскольку мы вызываем API Карт Google для предоставления карты местоположения продуктов питания, мы также установим пакет Python googlemaps. Если вы не хотите использовать Google Maps, вы можете пропустить установку этого пакета.

В вашем терминале / командной строке введите следующие команды для установки двух библиотек:

Теперь, когда мы установили две библиотеки, давайте погрузимся в код! Вот код (на случай, если вы захотите перейти прямо к нему), который я подробно покажу ниже.

Во-первых, мы импортируем соответствующие библиотеки:

Далее мы настраиваем параметры ведения журнала следующим образом:

Далее мы определяем шесть пунктов, которые определяют вопросы, которые будет задавать бот: местоположение еды, фото, диетические характеристики, количество порций, время сбора еды, а также подтверждение с постом.

Для подтверждения появится клавиатура с ответами, где пользователь сможет выбрать два варианта: подтвердить правильность информации или перезапустить весь процесс.

Кнопка подтверждения и перезагрузки

Итак, мы указываем две опции, используя модуль ReplyKeyboardMarkup в модуле python-telegram-bot, используя следующую строку кода:

После этого мы указываем некоторые переменные, включая API вашего бота Telegram (который вы получили от BotFather), а также API Google Maps.

Чтобы получить API Карт Google, вам потребуется аккаунт Google Cloud Platform. После создания учетной записи (будут предоставлены бесплатные кредиты, поэтому она должна быть бесплатной, если вы не превышаете квоту), перейдите в консоль Google Cloud Platform и выполните следующие действия:

Будет сгенерирован ключ API, поэтому просто скопируйте его. Это будет ваш токен API карт Google. Опять же, держите его в безопасности! API геокодирования предоставляет 200 долларов в кредит, так что этого будет достаточно для ваших целей.

Теперь, когда мы определили переменные, давайте углубимся в фактическую часть кода! Во-первых, мы определяем функцию для суммирования информации, представленной рекламным постом, как показано ниже:

Когда эта функция вызывается, она возвращает информацию в формате ключ-значение (например, Dietary Specifications - Halal).

Получив всю необходимую информацию, настало время ее обобщить и подтвердить с помощью поста. Во-первых, бот объединяет информацию, а затем отправляет сводку, используя функцию fact_to_str (user_data), которую мы определили выше.

Кроме того, теперь мы обращаемся к картам Google, чтобы точно определить местоположение, указанное на плакате. Местоположение было сохранено в user_data ['Location'] ранее, когда пользователь ответил на первый вопрос о нем, поэтому теперь мы будем извлекать широту и долготу, используя карты Google. Получив эту информацию, бот отправляет данные о местоположении вместе с картой на канал, указанный в @nameofchannel.


Вот некоторые вспомогательные функции на случай, если пользователь отменит разговор с ботом или возникнет ошибка:

Мы находимся в последнем сегменте кода! Здесь код определяет, что бот должен делать для каждого из шести пунктов. Наконец, мы начинаем опрос, который в основном позволяет нам получать информацию с постов. GitHub wiki python-telegram-bot лучше объясняет код здесь, так что проверьте его, если вы не уверены, что делает каждая строка!

Чтобы запустить своего бота, просто перейдите в terminal/command и запустите файл python. После выполнения файла перейдите к боту и введите /start. Ваш бот должен ответить и задать вам вопросы, как написано выше! Когда вы отвечаете, вы также должны увидеть следующие журналы:

Читайте также: