Конструктор телеграмм ботов python

Обновлено: 02.05.2024

Напишем простой диалоговый 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, следующим образом:

Ну вот и всё, простенький бот в Телеграмме на языке 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 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 и запустить его.

Рынок чат-ботов в России растет с бешеной скоростью и ожидается ежегодный прирост на 30% в течение ближайших трех лет. В 2020 г. количество запросов на чат-боты увеличилось на 17% по сравнению с 2019 г. Большим спросом стали поль­зо­вать­ся голосовые боты, количество запросов на них выросло в четыре раза. В 2021 г. ожидается рост числа запросов на чат-боты на 15-20% от ор­га­низа­ций из госсектора, об­ра­зова­ния, медицины, ло­гис­ти­ки, ре­тей­ла и e-commerce, промышленных и добывающих компаний.

Создаём нашего telegram бота.

Пишем код под наши задачи и тестируем его работоспособность.

Выбираем надежный сервис виртуальных машин.

Переносим нашего бота на виртуальную машину для его дальнейшей работы.

Настраиваем беспрерывную работу бота.

Шаг 1. Создание бота в Telegram

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


Шаг 2. Напишем простейшего чат-бота и протестируем его

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

$ pip install pytelegrambotapi

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

Напишем простого бота, который будет присылать нам в ответ на различные Emoji их размытые PNG копии:

Наш бот готов, теперь осталось его протестировать. Заходим по ссылке, которую прислал BotFather.


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

Шаг 3. Выбираем виртуальную машину!

Что вообще такое эта виртуальная машина?

Виртуальная машина (ВМ ) — это виртуальный компьютер, который использует выделенные ресурсы реального компьютера (процессор, диск, адаптер). Эти ресурсы хранятся в облаке и позволяют ВМ работать автономно. Простыми словами, виртуальная машина позволяет создать на одном компьютере ещё один компьютер, который будет использовать его ресурсы, но работать изолированно.

Именно виртуальная машина поможет нашему боту отвечать на все запросы и работать 24 на 7.

Как выбрать виртуальную машину?

ВМ выбирается исключительно отталкиваясь от ваших потребностей бюджета. Чем больше вам необходимо мощности и памяти, тем выше будет ее стоимость. В настоящее время есть множество хороших сервисов, предоставляющих пробный период с которым вы сможете определиться, подходит ли вам сервис.

Лично я могу рекомендовать следующие сервисы:

Mail cloud solutions — Предоставляют 3000 р. на два месяца тестового периода. (Именно его я и буду использовать в дальнейшей работе).

Yandex.Cloud — Представляют 2000 р. на два месяца тестового периода.

Google Cloud Platform — Предоставляют 300$ на три месяца тестового периода.

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

Создание виртуальной машины.

Я выбрал минимальные параметры, так как нашему боты не нужны какие-то большие энергоресурсы.


Настройка сети.


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

Для этого перейдем в терминал и пропишем следующую команду:

Затем пропишем имя нашего ключа и нажмем Enter. Наш ключ создан. Для подключения нам понадобится public-key с расширением .pub. Копируем содержимое нашего файла и вставляем его в соответствующее поле «Ключ виртуальной машины».

Переходим к следующему шагу.

Подключение к виртуальной машине

Для подключения к нашей виртуальной машине пропишем следующую команду:

ssh -i ~/.ssh/ИмяВашегоКлюча ubuntu@ваш публичный IP-адрес

Например: ssh -i ~/.ssh/my_key ubuntu@22.222.222.222

В случае удачного подключения вы увидите нечто подобное:


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

Установим на наш сервер последнюю версию Python. Для этого последовательно вводите следующие команды:

Установим и создадим виртуально окружение:

Установим и запустим Redis-server:

Проверить, запущен ли наш Redis-server, необходимо прописать «ping»


Если в ответе вы получили PONG, поздравляю, все готово к дальнейшей работе!

Перенесем все необходимые файлы на наш виртуальный сервер. Для этого я буду использовать очень удобную программу CyberDuck

Выбираем новое подключение по SFTP, вводим IP-адрес вашей виртуальной машины, !ПРИВАТНЫЙ! ssh-ключ, логин и пароль от вашей виртуальной машины.

Мы попадаем фактически на наш сервер, с уже установленным Python, папкой с названием нашего бота и виртуальным окружением. Остается перенести все данные нашего бота. Для этого копируем ВСЕ необходимые файлы и вставляем их на сервер.

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

Проверяем работу, если все в порядке, прописываем в терминале deactivate. Нам остается последний шаг. Настроить непрерывную работу нашего бота.

Шаг 5. Настройка беспрерывной работы нашего бота.

Пропишем следующую команду: nano /lib/systemd/system/НазваниеБота.service

Нажимаем CTRL+O → Enter → CTRL+X для сохранения. Эти настройки помогут запускать или перезапускать нашего бота.

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

ГОТОВО! Наш бот запущен и теперь работает 24/7, независимо от того, включен наш с вами компьютер или нет. Если что-то не работает, тщательно проверьте, правильно ли вы прописали путь к файлам. Если терминал выдает ошибку авторизации, попробуйте добавить перед командой «sudo» (Команда от имени администратора)

P.S. Тема телеграм-ботов стала весьма интересной и актуальной в последнее время, поэтому буду рад услышать здравую критику по поводу моей первой на этот момент статьи. Если у вас возникнут идеи для написания новых, буду рад их выслушать.

Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на 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 и вынести токены в отдельный фай.

Поздравляю!

Работа окончена, бот работает удалённо.

Ссылки

Заключение

Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.


В этой статье мы реали­зуем прос­той, но край­не полез­ный про­ект на 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.

Эхо-бот

Для начала реали­зуем так называ­емо­го эхо‑бота. Он будет получать от поль­зовате­ля тек­сто­вое сооб­щение и воз­вра­щать его.


В начале лета у мессенджера Telegram, созданного командой основателя «Вконтакте» Павла Дурова, появился программный интерфейс для разработки ботов. Неплохой повод для экспериментов с диалоговыми интерфейсами!

Вступление

Что должен уметь хороший робот? Ответ на этот вопрос лежит на поверхности. Всякий знает, что по-настоящему хороший робот стремится убить всех людей и уничтожить мир. Но массовые убийства — это, скорее, программа-максимум. Мы к ним обязательно вернемся, но начинать будем с малого.

Возможности

Возможности веб-фреймворков обычно демонстрируют на примере разработки блоговых движков. Мы разработаем нечто похожее по сути, но несколько более персональное: простенький трекер для любителей Quantified Self. Идея Quantified Self заключается в том, что сбор и анализ данных о самом себе помогает заметить тенденции и факты, которые невозможно различить невооруженным взглядом. Некоторые виды информации можно отслеживать автоматически при помощи датчиков в фитнес-браслетах, умных часах или смартфонах. Другие нужно собирать вручную. Существуют, к примеру, приложения для ведения дневника настроений или для хранения данных о съеденной еде (худеющим это полезно).

Ничто не мешает когда-нибудь интегрировать наш трекер с сервисами вроде Fitbit, но в данный момент мы ограничимся ручным сбором информации. Попробуем сделать мокап интерфейса — разумеется, текстовый. Наш воображаемый пользователь будет записывать в трекере результаты взвешивания на напольных весах, прочитанные книги и продолжительность сна. Как? Например, так.

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

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

Приступаем

Идея ясна, можно начинать. Зрители последней серии «Мстителей» знают, что Тони Старк делает роботов, задумчиво шевеля в воздухе цветными голограммами. Увы, нам далеко до Тони Старка. Мы вынуждены обходиться обыкновенным Python. Для хранения истории действий возьмем SQLite с единственной таблицей под названием memories .

Отладить диалог можно и в консоли — дедовском диалоговом интерфейсе.

Посмотрим, что получилось:

Кажется, все работает. Получающийся диалог в достаточной степени похож на мокап. Можно переходить к следующей стадии: подключаться к Telegram.

Подключение

Следующий пункт нашего пути — BotFather. Обычные сервисы раздают ключи для доступа к своим программным интерфейсам через веб. Telegram распространяет их через сам мессенджер. BotFather выделяет жаждущим программистам токены авторизации и настраивает свойства учетной записи новых ботов.


Другие статьи в выпуске:

После ввода команды /newbot BotFather поинтересуется названием и именем нового бота, а затем пожалует адрес и токен, состоящий из 45 цифр и латинских букв. Этот токен понадобится для подключения к API.

Общение

Понятно, что getUpdates — злодейский выбор. Сотни процессоров будут приближать климатическую катастрофу, круглые сутки гоняя через половину планеты тоскливый JSON, в котором сообщается, что полковнику никто не пишет. Ботам Telegram редко выпадает шанс убить всех людей и уничтожить мир. getUpdates — это как раз такой шанс, и лучше не будет. Тем не менее он настолько проще и приятнее, чем webhook, что выхода нет. Будем злодействовать.

Готовые ответы бота можно на месте переправлять в Telegram при помощи метода bot.sendMessage(chat_id, text) . Важный момент: Telegram отказывается иметь дело с кодировками, отличающимися от UTF-8. Перед отправкой текст лучше конвертировать в UTF-8, иначе ошибки неизбежны.

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

Проверка

Первая встреча с ботом

Первая встреча с ботом

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

Хотелось бы обойтись малой кровью и не тратить силы на вещи, которые не относятся напрямую к теме статьи. Рисование графиков свалим на Google: полузаброшенный сервис Google Charts готовит диаграммы в формате PNG, нарисованные по данным, которые содержатся в URL. Следующая функция составляет URL диаграммы Google Charts по списку пар (num, finished) , извлеченных из таблицы memories .

Диаграмма, сгенерированная Google Charts

Диаграмма, сгенерированная Google Charts

Для отправки фотографий служит метод sendPhoto . Он очень похож на sendMessage , но вместо текста принимает либо идентификатор изображения на сервере Telegram, либо открытый файл, в котором содержится изображение, либо адрес изображения в интернете. Вариант с файлом нуждается в пояснении: из-за одной небольшой, но неприятной особенности Python Telegram Bot он должен быть именно файлом и ничем иным. Попытка отдать методу объект, который реализует интерфейс файла, но не является потомком класса file , закончится провалом. Это исключает использование, например, временных файлов, полученных при помощи tempfile , или cStringIO .

Мы с нашими гугловскими урлами можем игнорировать эти проблемы. У нас все просто:

Управление

Еще одна интересная особенность Telegram — специальные клавиатуры с готовыми ответами, которые может показать бот. Ты уже видел их, когда общался с BotFather. Когда приходило время узнать, к чему именно относится наша просьба, он выкатывал кнопки с названиями всех наших ботов. Кнопка запуска в начале общения с ботом — еще один пример этой функциональности.

Наш робот при запуске будет показывать клавиатуру с двумя кнопками: одна из них запрашивает подсказку, а другая — отправляет команду «что я делал», которая выводит список упомянутых в базе данных действий.

Аргумент resize_keyboard заставляет клиент Telegram уменьшить кнопки до осмысленной величины (без него мобильная версия распахнет кнопки на четверть экрана).

Переходим в Web

Теперь, посмотрев, что нас ждет на темной стороне, выясним, чем плоха сторона добра. Не надо противиться эволюции!

За основу веб-приложения возьмем микрофреймворк Flask. Часть «микро» в данном случае означает, что самый простой сайт уместится в три строчки кода и не потребует десяти файлов и пятнадцати вложенных каталогов. Это именно наш случай: иметь пятнадцать файлов для такой малости как-то неловко, даже если все они автоматически сгенерированы при помощи специальной утилиты.

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

Дальше легче. Фактически можно обойтись двумя адресами. Адрес /receive будет принимать обновления Telegram, переводить JSON в объекты python-telegram-bot путем вызова telegram.Update.de_json , а затем отправлять добытое уже известной нам функции process . Это главное.

Другой адрес потребуется лишь однажды. При открытии он регистрирует адрес /receive в Telegram при помощи метода setWebhook .

Итоги

И это все? Увы, на самом деле страдания лишь начинаются! Telegram отказывается иметь дело с ботами, которые обитают на серверах, не поддерживающих защищенное соединение. И не просто защищенное — самодельный сертификат SSL не сгодится, нужно приобретать настоящий. Разумеется, в этом нет ничего невозможного (и даже по большому счету трудного), но при отсутствии практики этот процесс рискует занять куда больше времени, чем написание самого бота, не говоря уже о средствах.

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

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