Как запустить бота python windows

Обновлено: 30.06.2024

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, поэтому, если вы не уверены, вы можете сначала создать тестового бота со случайным именем пользователя и после того, как вы проверили все функции и убедились, что ваш бот работает, создайте нового бота с желаемым именем пользователя.

Первое общение с BotFather - «one bot to rule them all»!

Первое общение с BotFather - «one bot to rule them all»!

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

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

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

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

Полный код бота Telegram, включая вызов в Google Maps API

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

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

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

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

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

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

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

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

  1. Поиск API и услуг в строке поиска.
  2. Нажмите синюю кнопку «plus » с надписью "ENABLE APIS AND SERVICES" прямо под строкой поиска
  3. Найдите API геокодирования и включите его.
  4. В разделе « API & Services» перейдите в раздел «Credentials» и выберите «CREATE CREDENTIALS» > API key.

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

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

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

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

Если пользователь выберет «Confirm», бот отправит информацию на общедоступный канал. Параметр chat_id файла bot.send_photo представляет ссылку канала.

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


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

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

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

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

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

Настройка

Откройте Telegram, найдите @BotFather и начните беседу. Отправьте команду /newbot и следуйте инструкциям. Вы получите:

Обязательно сохраните токен, так как это ключ для взаимодействия с ботом.

Примечание Хранение токена должно быть локальным: ни в коем случае не выгружайте его в общий доступ, например в GitHub-репозиторий .

Установка Python

Для написания Telegram-бота на Python, нужно установить сам язык. Если вы пользуетесь Windows, скачать Python можно с официального сайта. Версия важна. Нам подойдет Python не ниже версии 3.7. Если же у вас Linux или macOS, то, скорее всего, у вас стоит Python 3.6. Как обновиться, можете почитать здесь.

Тем, кто только начал изучение этого языка, будет также полезна дорожная карта Python-разработчика.

Установка pip

Это менеджер пакетов. В версиях выше Python 2.7.9 и Python 3.4, а также на macOS/Linux он уже есть. Проверить это можно командой pip --version в терминале. Если же по каким-то причинам он отсутствует, установить его можно при помощи команды:

Установка aiogram

Установить данный фреймворк для Telegram Bot API с помощью pip:

Hello, bot!

Давайте напишем простенькую программу приветствия. Для начала следует импортировать библиотеки и создать экземпляры Телеграм бота и диспетчера:

Запускаем Telegram бота, написанного на Python, следующим образом:

ABBYY , Удалённо , По итогам собеседования

Ну вот и всё, простенький бот в Телеграмме на языке Python готов.

Docker

Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:

Каталог проекта должны при этом содержать следующие файлы:

Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:

my_app — это просто название нашего контейнера, вместо которого можно использовать другое имя.

-d — специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.

Деплой на AWS

Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:

  1. Локально или с помощью пайплайнов собрали контейнер.
  2. Загрузили его на докер хаб.
  3. В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
  4. Запустили.

Пройдёмся по этим шагам. Везде, где указано <docker_hub_username> , надо вставлять свой юзернейм, использованный при регистрации на докерхабе. Если это ваша первая публикация на докерхаб, для начала потребуется залогиниться с помощью docker login.

Загружаем его на докерхаб:

Для проверки успешности загрузки можете запустить контейнер из Docker Hub с помощью команды:

Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.

  • Переходим в Elastic Beanstalk, на вкладку Applications, и создаём новое приложение:

Elastic Beanstalk вкладка Applications

Называем приложение в Elastic Beanstalk

environment для будущего Telegram-бота

Worker environment для будущего Telegram-бота

Docker для Telegram-бота на Python

  • В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:

Application code

Создаём окружение

  • AWS начинает создавать окружение, просто ждём завершения процесса:

AWS начинает создавать окружение

  • Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:

Docker для Телеграм бота

Проверяем работу нашего Telegram bot:

Проверка Телеграм бота

Заключение

Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.

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

Кстати, в телеграмме есть аж целых два типа клавиатур:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.

Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.

В первой части мы сделали гороскоп на Python, который выдаёт нам прогноз на день по знаку зодиака. Сегодня пойдём дальше: теперь этот же генератор гороскопов будет встроен в Телеграм в виде бота.

Да. То, что обычно на курсах продают за 50 тысяч рублей, мы вам сейчас расскажем за 15 минут бесплатно.

Как всё будет работать

В этом проекте три звена: наш компьютер с Python, сервер Телеграма и Телеграм-клиент.

На компьютере работает интерпретатор Python, а внутри интерпретатора крутится наша программа на Python. Она отвечает за весь контент: в неё заложены все шаблоны текста, вся логика, всё поведение.

Внутри программы на Python работает библиотека, которая отвечает за общение с сервером Телеграма. В библиотеку мы вшили секретный ключ, чтобы сервер Телеграма понимал, что наша программа связана с определённым ботом.

Когда клиент с Телеграмом запрашивает у бота гороскоп, запрос приходит на сервер, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на Python, ответ идёт на сервер Телеграма, сервер отдаёт ответ клиенту. Изи:

Телеграм-бот на Python

Обратите внимание, что работать наш бот будет только тогда, когда включён компьютер и на нём запущена программа на Python. Если компьютер выключится, пропадёт интернет или вы отключите интерпретатор, то бот работать перестанет: запросы будут приходить, но никто на них не ответит. В одной из следующих частей мы сделаем так, чтобы это всё работало на удалённом сервере и было всегда доступно.

Что будем делать

Если записать пошагово наш план, то он будет выглядеть так:

Теперь по очереди разберём каждый пункт.

В Телеграме находим канал @BotFather — он отвечает за регистрацию новых ботов:


Первый в списке со специальным значком подтверждения — это он.

Нажимаем Start и пишем команду /newbot. Нас по очереди спросят про название бота и его никнейм (мы придумали только с третьей попытки, потому что остальные были заняты):


С третьей попытки нам дали нового бота и токен для управления. Токен нужен для управления ботом, поэтому на экране его нет.

2. Установка библиотеки

Есть два основных способа работать с телеграмом в Python: через библиотеку telebot и с помощью Webhook. Мы будем использовать библиотеку — так проще и быстрее.

Чтобы её установить, запускаем командную строку от имени администратора (если у вас Windows) и пишем команду pip install pytelegrambotapi

Чтобы программа на Python умела управлять Телеграм-ботами, нужно в самое начало кода добавить строки:

Единственное, о чём нужно не забыть — заменить слово «токен» на настоящий токен, который дал нам @BotFather. Открываем программу гороскопа и добавляем.

Теперь научим бота реагировать на слово «Привет». Для этого добавим после строчек с импортом новый метод и сразу пропишем в нём реакцию на нужное слово. Если не знаете, что такое метод и зачем он нужен, — читайте статью про ООП.

И последнее, что нам осталось сделать до запуска, — добавить после метода такую строчку:

Добавляем кнопки

Чтобы пользователям нашего бота было удобно, покажем им сразу все знаки зодиака в виде кнопок. А потом сделаем так, что когда на них нажимаешь — появляется гороскоп для этого знака на сегодня.

Добавляем код с кнопками в раздел, который реагирует на «Привет»:


Кнопки есть, но пока не работают. Сейчас исправим.

Добавляем обработчик кнопок

Скорее всего, вы заметили, что в каждой кнопке у нас написано callback_data='zodiac' . Это значит, что при нажатии на любую кнопку у нас будет вызываться один и тот же метод, который отвечает за гороскоп. Если вы хотите сделать честный гороскоп, придётся в каждой кнопке прописать своё название обработчика, а потом задать его поведение, тоже для каждой кнопки.

Давайте сделаем обработчик кнопок, который будет реагировать на 'zodiac' и выдавать случайный текст, как в исходной программе. Для этого добавим новый метод в программу:


Нажимаем на кнопку — получаем текст гороскопа.

Убираем лишнее

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

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

Что дальше

  • можно сделать индивидуальный гороскоп для каждого знака;
  • научить бота новым командам;
  • присылать свежий гороскоп каждое утро;
  • наладить непрерывную работу на веб-сервере.

Напишите в комментариях, что бы вы хотели от такого бота? Что должен уметь идеальный бот с гороскопом?

Это пошаговое руководство по созданию бота для Telegram. Бот будет показывать курсы валют, разницу между курсом раньше и сейчас, а также использовать современные встроенные клавиатуры.

Время переходить к делу и узнать наконец, как создавать ботов в Telegram.

Шаг №0: немного теории об API Telegram-ботов

Начать руководство стоит с простого вопроса: как создавать чат-ботов в Telegram?

Токен — уникальная строка из символов, которая нужна для того, чтобы установить подлинность бота в системе. Токен генерируется при создании бота. METHOD_NAME — это метод, например, getUpdates , sendMessage , getChat и так далее.

Токен выглядит приблизительно так:

Для выполнения запросов используются как GET, так и POST запросы. Многие методы требуют дополнительных параметров (методу sendMessage , например, нужно передать chat_id и текст). Эти параметры могут быть переданы как строка запроса URL, application/x-www-form-urlencoded и application-json (кроме загрузки файлов). Еще одно требование — кодировка UTF-8.

После отправки запроса к API, вы получаете ответ в формате JSON. Например, если извлечь данные с помощью метода getME , ответ будет такой:

Список всех типов данных и методов API Telegram-бота можно найти здесь (ENG) или с переводом здесь (ру) .

Есть два варианта.

Первый — вручную создавать запросы с помощью метода getUpdates . В качестве объекта вы получите массив объектов Update . Этот метод работает как технология длинных опросов (long polling), когда вы отправляете запрос, обрабатываете данные и начинаете повторяете процесс. Чтобы избежать повторной обработки одних и тех же данных рекомендуется использовать параметр offset .

Как выбрать оптимальный метод? Метод getUpdates лучше всего подходит, если:

Метод с Webhook лучше подойдет в таких случаях:

  1. Вы используете веб-языки (например, PHP).
  2. У бота низкая нагрузка, и нет смысла делать запросы вручную.
  3. Бот на постоянной основе интегрирован в веб-сервер.

В этом руководстве будет использоваться метод getUpdates .

Еще один вопрос: как создать зарегистрировать бота?

@BotFather используется для создания ботов в Telegram. Он также отвечает за базовую настройку (описание, фото профиля, встроенная поддержка и так далее).

Существует масса библиотек, которые облегчают процесс работы с API Telegram-бота. Вот некоторые из них:

По своей сути, все эти библиотеки — оболочки HTML-запросов. Большая часть из них написана с помощью принципов ООП. Типы данных Telegram Bot API представлены в виде классов.

В этом руководстве будет использоваться библиотека pyTelegramBotApi.

Шаг №1: реализовать запросы курсов валют

Весь код был проверен на версии Python==3.7 c использование библиотек:
pyTelegramBotAPI==3.6.6
pytz==2019.1
requests==2.7.0

Создадим файл pb.py со следующим кодом:

Были реализованы три метода:

  • load_exchange : загружает курсы валют по указанному URL-адресу и возвращает их в формате словаря(dict).
  • get_exchange : возвращает курсы валют по запрошенной валюте.
  • get_exchanges : возвращает список валют в соответствии с шаблоном (требуется для поиска валют во встроенных запросах).

Шаг №2: создать Telegram-бота с помощью @BotFather

Его нужно сразу настроить. Необходимо добавить описание и текст о боте (команды /setdescription и /setabouttext ), фото профиля ( /setuserpic ), включить встроенный режим ( /setinline ), добавить описания команд ( /setcommands ). Потребуется использовать две команды: /help и /exchange . Стоит описать их в /setcommands .

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

Шаг №3: настроить и запустить бота

Начнем с создания файла config.py для настройки:

Создадим файл bot.py . Нужно импортировать все необходимые библиотеки, файлы с настройками и предварительно созданный pb.py . Если каких-то библиотек не хватает, их можно установить с помощью pip .

Создадим бота с помощью библиотеки pyTelegramBotAPI. Для этого конструктору нужно передать токен:

Шаг №4: написать обработчик команды /start

Теперь чат-бот на Python работает и постоянно посылает запросы с помощью метода getUpdates . Параметр none_stop отвечает за то, чтобы запросы отправлялись, даже если API возвращает ошибку при выполнении метода.

Из переменной бота возможно вызывать любые методы API Telegram-бота.

Начнем с написания обработчика команды /start и добавим его перед строкой bot.polling(none_stop=True) :

Это было просто, не так ли?

Шаг №5: создать обработчик команды /help

Давайте оживим обработчик команды /help с помощью встроенной кнопки со ссылкой на ваш аккаунт в Telegram. Кнопку можно озаглавить “Message the developer”.

Как видно в примере выше, был использован дополнительный параметр ( reply_markup ) для метода send_message . Метод получил встроенную клавиатуру ( InlineKeyboardMarkup ) с одной кнопкой ( InlineKeyboardButton ) и следующим текстом: “Message the developer” и url='telegram.me/artiomtb' .

Код выше выглядит вот так:

обработчик команды /help

Шаг №6: добавить обработчик команды /exchange

Обработчик команды /exchange отображает меню выбора валюты и встроенную клавиатуру с 3 кнопками: USD, EUR и RUR (это валюты, поддерживаемые API банка).

Вот как работает InlineKeyboardButton . Когда пользователь нажимает на кнопку, вы получаете CallbackQuery (в параметре data содержится callback-data ) в getUpdates . Таким образом вы знаете, какую именно кнопку нажал пользователь, и как ее правильно обработать.

Вот как работает ответ /exchange:

обработчик команды /exchange

Шаг №7: написать обработчик для кнопок встроенной клавиатуры

В библиотеке pyTelegramBot Api есть декоратор @bot.callback_query_handler , который передает объект CallbackQuery во вложенную функцию.

Давайте реализуем метод get_ex_callback :

Все довольно просто.

Сперва отправим состояние ввода в чат, так чтобы бот показывал индикатор «набора текста», пока API банка получает запрос. Теперь вызовем метод get_exchange из файла pb.py , который получит код валюты (например, USD). Также нужно вызвать два новых метода в send_message: serialize_ex , сериализатор валюты и get_update_keyboard (который возвращает клавиатуре кнопки “Update” и “Share”).

Запишем в get_update_keyboard текущий курс валют в callback_data в форме JSON. JSON сжимается, потому что максимальный разрешенный размер файла равен 64 байтам.

Кнопка t значит тип, а e — обмен. Остальное выполнено по тому же принципу.

У кнопки Share есть параметр switch_inline_query . После нажатия кнопки пользователю будет предложено выбрать один из чатов, открыть этот чат и ввести имя бота и определенный запрос в поле ввода.

Методы serialize_ex и дополнительный serialize_exchange_diff нужны, чтобы показывать разницу между текущим и старыми курсами валют после нажатия кнопки Update .

Как видно, метод serialize_ex получает необязательный параметр diff . Ему будет передаваться разница между курсами обмена в формате . Это будет происходить во время сериализации после нажатия кнопки Update . Когда курсы валют отображаются первый раз, он нам не нужен.

Вот как будет выглядеть бот после нажатия кнопки USD:

отображение курса валют ботом

Шаг №8: реализовать обработчик кнопки обновления

Теперь можно создать обработчик кнопки Update . После дополнения метода iq_callback_method он будет выглядеть следующим образом:

Если данные обратного вызова начинаются с get- ( get-USD , get-EUR и так далее), тогда нужно вызывать get_ex_callback , как раньше. В противном случае стоит попробовать разобрать строку JSON и получить ее ключ t . Если его значение равно u , тогда нужно вызвать метод edit_message_callback . Реализуем это:

Как это работает? Очень просто:

Метод get_ex_from_iq_data разбирает JSON из callback_data :

Метод get_exchange_diff получает старое и текущее значение курсов валют и возвращает разницу в формате :

get_edited_signature генерирует текст “Updated…”:

отображение курса валют ботом

И вот так — если изменились:

обновление курса валют ботом

Шаг №9: реализовать встроенный режим

Реализация встроенного режима значит, что если пользователь введет @ + имя бота в любом чате, это активирует поиск введенного текста и выведет результаты. После нажатия на один из них бот отправит результат от вашего имени (с пометкой “via bot”).

Обработчик встроенных запросов реализован.

Библиотека передаст объект InlineQuery в функцию query_text . Внутри используется функция answer_line , которая должна получить inline_query_id и массив объектов (результаты поиска).

Используем get_exchanges для поиска нескольких валют, подходящих под запрос. Нужно передать этот массив методу get_iq_articles , который вернет массив из InlineQueryResultArticle :

Теперь при вводе “@exchangetestbost + пробел” вы увидите следующее:

инлайн режим бота

Попробуем набрать usd, и результат мгновенно отфильтруется:

инлайн режим бота: ввод параметра

Проверим предложенный результат:

инлайн режим бота: результат

Кнопка “Update” тоже работает:

инлайн режим бота: работа

Отличная работа! Вы реализовали встроенный режим!

Выводы

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

У вас должен быть установлен Python 3. Если нет, то вы можете прочитать здесь как это сделать на Windows.


Откройте Телеграм и найдите через Поиск бота BotFather.


Вы найдете много чего с таким названием. Вам нужен тот, что с галочкой синей. Выберите этого бота и запустите нажав на кнопку "Start". BotFather вам покажет все свои команды, используя которые, вы будете потом управлять своими ботами.

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

Здесь вы можете ввести любое имя. Имя можно потом изменить. Я назову своего бота "Валютный бот". После ввода имени нужно придумать уникальный ник для бота(username). Этот ник должен быть на английском и всегда заканчиваться на слово Bot. И еще там не должно быть пробелов. Имейте ввиду, что все популярные названия уже заняты кем-то другим. Поэтому я назову Currency005Bot.


В самом начале есть ссылка на вашего бота, начинающаяся на t.me/. Нажав на нее вы перейдете к вашему боту. Также эту ссылку можно отправлять всем.

А красным цветом внизу написан токен вашего бота. Этот токен как пароль от вашего бота. Его не нужно никому сообщать. Мы будем использовать его при написании программы для бота.

У вас официально есть бот! Конечно, он пока ничего не умеет. Только родился.

2. Первое слово бота Чтобы продолжить дальше, вам нужно научиться работать в Командной строке. Вы можете прочитать статью Работа в терминале в Windows, Linux и MacOS (cli, shell, bash, cmd) .

Перед тем как начать учить нашего бота говорить, попробуем что нибудь сделать на языке Python.

Откройте ваш любимый редактор кода (Sublime Text, PyCharm, Notepad++, Idle и т.п.). Создайте новый пустой файл. Сохраните его с названием bot.py в любую папку(желательно не слишком глубоко, а для начала можно сразу в корне диска С: ).

В этом файле будет написана наша программа для бота. Давайте для начала напишем простую программу, которая печатает текст "Hello World!". Для этого напишите в файле:

Теперь попробуем запустить его. Откройте Командную строку(Windows) или Terminal(Linux, Mac). Использую команду cd перейдите в папку, где вы сохранили файл bot.py.

Эта команда выходит из текущий папки в родительскую папку:

А эта команда переходит в указанную папку(например Projects):
Если вы перешли в папку с файлом bot.py, теперь мы можем его запустить. Напишите в командной строке:

И нажмите Enter. Ваша программа запустится и напечатает "Hello, World!". Мы умеем запускать программы на Python.

Команда print() в языке Python печатает текст на экране. А в скобках нужно указать что именно нужно напечатать. Наш текст для печати мы указали в кавычках. В Python в кавычках записывает любые текстовые данные. И текстовые данные называются строкой или string.

Кроме текстовых данных есть еще числовые данные. И команда print() также умеет их тоже печатать:

Как вы заметили для чисел кавычки не нужны.

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

Мы сначала сохранили в переменной х строку "Hello world" а потом распечатали x. Если вы сохраните такой файл и запустите его снова в командной строке командой:

То вы увидите что программа напечатала на экран не "х", а "Hello World". Потому x - это переменная, которая хранит в себе значение "Hello World".

Также в переменной можно сохранить любые другие значения. И они могут называться как угодно, не только x или y.

Скачиваем библиотеку для создания бота

Чтобы написать бота в Python, нам нужно скачать библиотеку(или пакет) python-telegram-bot для Python. Библиотеки - это дополнительные ресурсы для Python, которые улучшают его способности. Если Python что-то не умеет, вы можете скачать ему библиотеку и он научится как это делать.

Чтобы скачать библиотеку мы будем использовать команду pip. А Pip - это штучка, которая умеет скачивать библиотеки и удалять их. Его еще называют Пакетным менеджером.

Откройте командную строку и напишите:

После этого вы увидите много непонятного текста в командной строке и в конце где-то будет написано

Значит успешно установлено. Теперь мы можем использовать его.

Пишем программу для бота

Откройте ваш код и удалите все что вы там написали. И для начала создайте переменную token и присвойте этой переменной токен вашего бота. Помните? Когда мы создавали бота, BotFather отправил нам красный токен. У вас будет примерно так:

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

Теперь мы подключим разные классы(классные штучки) с библиотеки телеграма, чтобы использовать их в своей программе. Уберите токен вниз и в самой первой строчке напишите:

Мы подключили два класса: Updater и MessageHandler. В языке Python имеет значение регистр букв(заглавные, строчные буквы). Обязательно нужно писать именно так.

а про CommandHandler расскажу чуть ниже.

Давайте создадим новый объект Updater и запустим его. Создается он вот так:

Теперь запускаем Updater:

Первая строчка запускает, а вторая строчка ждет пока вы нажмете Ctrl+C, а когда нажмете завершает работу бота.

Сейчас ваш код должен выглядеть примерно таким:

я незаметно добавил строчку print("Бот запущен. Нажмите Ctrl+C для завершения"). Вы тоже добавьте. Пора попробовать запустить бота. Сохраните файл. И запустите его:

Хотя бот запущен, он все равно ничего не имеет. Какой бесполезный бот! Нажмите Ctrl+C чтобы завершить его работу. Обычно завершение занимает 3-5 секунд.

Добавляем обработчик команды
У ботов есть команды. Они начинаются со знака / (слэш). Например: /newbot, /start. У каждого бота они свои. Но у всех есть команда /start, которая запускается когда кто-то начинает чат с ботом.

Мы сейчас сделаем так, чтобы наш бот представлялся, когда кто-то пишет ему команду /start. Для этого нам нужно создать обработчик для команды start. Такой обработчик создается с помощью класса CommandHandler.

Мы скажем этому диспетчеру, что у нас есть новый обработчик для команды start:

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