Оглавление
- Введение
- Начало работы
- Как всё будет работать
- Разработка ботов
- Резюме
- Окончательные особенности бота
- Обработка запросов пользователей
- Написание кода Python для нашего бота
- Плацдарм для бота
- Создаем бота
- Регистрация бота
- Правильно кодировать наш текст сообщения
- Шаг 1: реализация запросов курсов валют
- Создание скелета бота
- Отказ от команды бота или на пользователя
- Как настроить бот, чтобы работать непрерывно
- Вступление
- Почему Django?
Введение
Добро пожаловать в 2020! В последний раз мы рассматривали нововведения Bot API аж в далёком 2017 году, когда появилось удаление сообщений и ограничения в чатах. С тех пор вышло много чего интересного и, возможно, о чём-то стоит выпустить отдельные уроки.
А сегодня мы познакомимся с опросами 2.0, точнее, с новой сущностью: викторинами (quiz). Викторина – это именно то, что вы и предположили; тест с одним правильными вариантом ответа и ещё N неправильными.
Поставим себе задачу сделать бота, который умеет:
- принимать от пользователя только викторины;
- запоминать их содержимое и записывать к себе в память;
- предлагать викторины в инлайн-запросе и отправляет их в группу;
- получать новые ответы и сохранять ID правильно ответивших;
- останавливать викторину после двух правильных ответов и поздравлять победителей.
Задач много, придётся вспомнить, что такое колбэки, инлайн-режим и классы. Но и это не самое главное…
Начало работы
Для работы нам понадобятся базовые знания в Python, достаточные для написания простого бота. Данный гайд можно использовать не только для интеграции с ботом, но и для других проектов. Если вы не используете PyCharm, и у вас нет средства для работы с БД, то необходимо установить утилиту SQLiteStudio с официального сайта.
Теперь давайте перейдем к написанию кода. В терминале необходимо установить pyTelegramBotAPI (если по какой-то причине у вас его нет).
Далее создаем новый файл с расширением .py. В нем прописываем следующее:
Устанавливать sqlite3 не нужно — это стандартная библиотека. Вместо «token» необходимо указать токен бота, который выдал вам BotFather. Теперь проверим, работает ли бот.
Запустим код. Если при запуске бота он пишет нам «Добро пожаловать», то все работает отлично.
Как мы видим, все работает.
Как всё будет работать
В этом проекте три звена: наш компьютер с Python, сервер Телеграма и Телеграм-клиент.
На компьютере работает интерпретатор Python, а внутри интерпретатора крутится наша программа на Python. Она отвечает за весь контент: в неё заложены все шаблоны текста, вся логика, всё поведение.
Внутри программы на Python работает библиотека, которая отвечает за общение с сервером Телеграма. В библиотеку мы вшили секретный ключ, чтобы сервер Телеграма понимал, что наша программа связана с определённым ботом.
Когда клиент с Телеграмом запрашивает у бота гороскоп, запрос приходит на сервер, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на Python, ответ идёт на сервер Телеграма, сервер отдаёт ответ клиенту. Изи:
Обратите внимание, что работать наш бот будет только тогда, когда включён компьютер и на нём запущена программа на Python. Если компьютер выключится, пропадёт интернет или вы отключите интерпретатор, то бот работать перестанет: запросы будут приходить, но никто на них не ответит
В одной из следующих частей мы сделаем так, чтобы это всё работало на удалённом сервере и было всегда доступно.
Разработка ботов
Какие апдейты можно получать
Бот не может получить старые сообщения из чата. Бот не может получить список всех своих пользователей. Все, что может получать бот — это информацию об обновлениях. В этом заключается главная сложность разработки ботов.
Вы можете получать информацию о новых сообщениях в боте и других событиях, но только один раз. Вам придётся самим хранить список чатов, старых сообщений (если это зачем-то нужно) и так далее. Если вы случайно сотрёте/потеряете эту информацию, вы её больше никак не получите.
В Telegram API бот может чуточку больше: он может получать сообщения по id, получать список участников группы и прочее.
Лимиты
Конечно, на запросы к серверу существуют лимиты. В названы следующие:
-
Не больше одного сообщения в секунду в один чат,
-
Не больше 30 сообщений в секунду вообще,
-
Не больше 20 сообщений в минуту в одну группу.
Эти лимиты не строгие, а примерные. Лимиты могут быть увеличены для больших ботов через поддержку.
Другие известные ограничения в Telegram собраны на limits.tginfo.me — см. раздел про ботов.
Рассылка по пользователям
сказано, что Bot API не позволяет рассылать сообщения всем юзерам одновременно и что в будущем, может быть, они что-то для этого сделают. И написано это уже несколько лет.
Они советуют растянуть рассылку на длительное время (8-12 часов) и замечают, что API не позволит отправлять сообщения более чем ~30 пользователям в секунду.
Смена владельца бота
Осенью 2020 года появилась возможность передавать ботов другому человеку. Это можно сделать в настройках бота в BotFather. Для этого на вашем аккаунте должна быть включена двухфакторная авторизация — не менее, чем за 7 дней до передачи. Передать бота можно только пользователю, который что-либо ему писал.
Локальный сервер Bot API
Также осенью 2020 года исходники Bot API выложили на GitHub. Теперь вы можете поднять собственный сервер Bot API. На GitHub перечислены следующие преимущества:
-
Скачивание файлов с сервера без ограничения (ограничение на отправку файлов пользователями в Телеграме — 2 ГБ),
-
Загрузка файлов на сервер с помощью локального пути и URI файла,
-
Использование HTTP URL для вебхука,
-
Использование любого локального IP-адреса для вебхука,
-
Использование любого порта для вебхука,
-
Возможность увеличить максимальное число соединений до 100000,
-
Получение локального пути файла вместо загрузки файла с сервера.
Юзерботы
В начале статьи я рассказывал о том, что такое Telegram API и Telegram Bot API.
Telegram API используется не только для ботов — тогда в чём проблема управлять аккаунтами пользователей, как ботами? Люди это делают. Кто-то автоматически ставит текущее время себе на аватарку, кто-то скриптом реагирует на свои сообщения как на команды, кто-то сохраняет сообщения из публичных групп и каналов. Всё это называют юзерботами.
Юзерботов следует использовать аккуратно: за большую подозрительную активность аккаунт могут ограничить или забанить.
Резюме
Как мы увидели, создание работающего бота на Python для Telegram мессенджера достаточно просто. Для простых ботов не нужно использовать сложные решения — есть удобная библиотека PyTelegramBotAPI, позволяющая решить такие задачи. В нашем учебном примере мы рассмотрели только работу с текстом, но, благодаря этой библиотеке, бот может работать и с другими форматами данных. Попробуйте сами сделать своего бота, отвечающего на ваши вопросы.
Бесплатные вебинары по схожей тематике:
UX дизайн на практике. Прототипирование и вангирование
Влад Шевченко
SEO – перезагрузка
Александр Шевчук
Джинн – сервис анонимного поиска работы для программистов
Макс Ищенко
С нашей стороны мы рекомендуем ознакомиться с курсом подготовки Python-разработчика. Знания, полученные после прохождения данного курса позволят вам не только создавать различные приложения, но и получить полноценную профессию разработчика программного обеспечения.
Окончательные особенности бота
Бот должен работать, так что это хорошее время, чтобы проверить его. Теперь мы добавим несколько окончательных функций.
Мы добавим возможность получить список представленных пользователем сообщений справа от DiscoD, и мы добавим возможность выключить и на том, отвечает ли бот на грустные слова.
Я дам вам полный последний код программы, а затем обсудим обновления под кодом.
import discord import os import requests import json import random from replit import db client = discord.Client() sad_words = starter_encouragements = [ "Cheer up!", "Hang in there.", "You are a great person / bot!" ] if "responding" not in db.keys(): db = True def get_quote(): response = requests.get("https://zenquotes.io/api/random") json_data = json.loads(response.text) quote = json_data + " -" + json_data return(quote) def update_encouragements(encouraging_message): if "encouragements" in db.keys(): encouragements = db encouragements.append(encouraging_message) db = encouragements else: db = def delete_encouragment(index): encouragements = db if len(encouragements) > index: del encouragements db = encouragements @client.event async def on_ready(): print("We have logged in as {0.user}".format(client)) @client.event async def on_message(message): if message.author == client.user: return msg = message.content if msg.startswith("$inspire"): quote = get_quote() await message.channel.send(quote) if db: options = starter_encouragements if "encouragements" in db.keys(): options = options + db if any(word in msg for word in sad_words): await message.channel.send(random.choice(options)) if msg.startswith("$new"): encouraging_message = msg.split("$new ",1) update_encouragements(encouraging_message) await message.channel.send("New encouraging message added.") if msg.startswith("$del"): encouragements = [] if "encouragements" in db.keys(): index = int(msg.split("$del",1)) delete_encouragment(index) encouragements = db await message.channel.send(encouragements) if msg.startswith("$list"): encouragements = [] if "encouragements" in db.keys(): encouragements = db await message.channel.send(encouragements) if msg.startswith("$responding"): value = msg.split("$responding ",1) if value.lower() == "true": db = True await message.channel.send("Responding is on.") else: db = False await message.channel.send("Responding is off.") client.run(os.getenv("TOKEN"))
Первый раздел, добавленный к коду прямо под список:
if "responding" not in db.keys(): db = True
Мы создаем новый ключ в базе данных под названием «Отвечая» и установите его на «True». Мы будем использовать это, чтобы определить, должен ли бот ответить на грустные слова или нет. Поскольку база данных сохраняется даже после того, как программа останавливается запущена, мы только создаем новую клавишу, если она еще не существует.
Следующая новая часть кода состоит в том, что раздел, который отвечает на печальные слова, теперь находится внутри этого, если утверждение: Отказ Бот будет реагировать только на грустные слова, если Отказ Возможность обновления этого значения заходит после этого следующего раздела.
Далее, после того, как код, чтобы BOT ответил команду «$ del», есть новый код, чтобы ответить на команду «$ список» при отправке в качестве сообщения раздора.
Этот раздел начинается с создания пустого списка, называемого Отказ Затем, если в базе данных уже есть поощрения, эти поощрения заменяют пустой список, который был только что создан.
Наконец, бот отправляет список поощрений в качестве сообщения раздора.
Последний новый раздел находит следующий. Этот код заставляет BOT ответить на команду «$ reganging». Эта команда берет аргумент либо «TRUE», либо «FALSE». Вот пример использования: «$ отвечает правду».
Код сначала снимает аргумент с (Как и раньше, обратите внимание на пространство в ). Тогда есть оператор IF/ELSE, что соответствующим образом устанавливает ключ «Отвечая» в базе данных и отправляет уведомление о сообщениях, чтобы раздор
Если аргумент – это что-нибудь, кроме «правда», код предполагает «ложь».
Код для бота завершен! Теперь вы можете запустить бот и попробовать. Но есть еще один важный шаг, который мы обсудим дальше.
Обработка запросов пользователей
Имеющиеся функциональные возможности разрабатываемого бота были описаны выше. НА завершающем этапе пользователям предстоит обеспечить безошибочную и одновременно стабильную работу интеллекта. Благодаря комплексному подходу появляется шанс организовать четкое взаимодействие с потенциальными клиентами/потребителями. Поэтому требуется активировать дополнительную опцию.
Обратите внимание, функция активируется регулярно при необходимости получить исчерпывающую информацию в webhook. Последовательность действий подразумевает:
Разработчику требуется вернуться к раннее сформированной команде, включающей в себя словари оповещений, которые были получены в результате общения с собеседниками. Выполнение проверки предоставляет возможность отсеивать сведения, которые не были указаны в уведомлениях. Это обусловлено тем, что в скрипте есть возможность получения запроса от пользователей без месседжей.
На практике пользователь может получить несколько уведомлений в одном сформированном запросе, поэтому скрипт должен уметь их отличать. Поэтому требуется инициировать перебор словарей, в составе которых может находиться dict_messages.
После непосредственного вхождения в активированный цикл, требуется объявить переменную «текст». Под ней скрывается исчерпывающий перечень слот, который могут входить в уведомление. Поэтому требуется повторно инициировать обращение к библиотеке, чтобы в полной мере изучить содержание оповещения.
На следующем этапе выполняется проверка на предмет получения от реальных пользователей, а не спама
Поэтому возникает необходимость воспользоваться функциями false и true.Обратите внимание, при отсутствии проверки есть вероятность выхода не бесконечность с вытекающими негативными последствиями.
В результате разработчик автоматически получает ссылку на расположение сообщества и непосредственной библиотеки данных. Чтобы избежать ошибочных проверок, достаточно использовать функцию сравнения данных
Обратите внимание, по завершении процедуры проверки, достаточно инициировать вызов опции, которая ранее была рассмотрена с функцией ввода адреса местоположения группы.
Сразу после этого пользователи могут приступать к тестированию скрипта с последующим подключением к персональному зарегистрированному аккаунту в приложении Ватсап.
Написание кода Python для нашего бота
Теперь мы можем добраться до написания Python. Создать файл и добавьте следующий код:
import json import requests TOKEN = "" URL = "https://api.telegram.org/bot{}/".format(TOKEN) def get_url(url): response = requests.get(url) content = response.content.decode("utf8") return content def get_json_from_url(url): content = get_url(url) js = json.loads(content) return js def get_updates(): url = URL + "getUpdates" js = get_json_from_url(url) return js def get_last_chat_id_and_text(updates): num_updates = len(updates) last_update = num_updates - 1 text = updates chat_id = updates return (text, chat_id) def send_message(text, chat_id): url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id) get_url(url) text, chat = get_last_chat_id_and_text(get_updates()) send_message(text, chat)
Давайте потянемся, что делает этот код:
-
В строках 1 и 2 мы импортируем и модули. Первый – сделать веб-запросы с помощью Python, и мы будем использовать его для взаимодействия с API Telegram (аналогично тому, что мы использовали наш веб-браузер для более раннего). Мы будем использовать модуль JSON для анализа ответов JSON от Telegram в словари Python, чтобы мы могли извлечь кусочки данных, которые нам нужны.
-
Следующие две строки являются глобальными переменными, где мы определяем токен нашего бота, который нам нужно аутентифицироваться с API Telegram, и мы создаем основной URL-адрес, который мы будем использовать во всех наших запросах на API.
-
Функция Просто загружает контент с URL и дает нам строку. Мы добавляем Часть для дополнительной совместимости, поскольку это необходимо для некоторых версий Python на некоторых платформах. Обычно мы проводим некоторое заправка с исключением здесь, так как этот запрос может потерпеть неудачу, если на нашем интернет-соединении сокращаются, если бы служба телеграммы не появилась, или если бы возникла проблема с нашим токеном. Однако для простоты здесь мы просто предполагаем, что все всегда работает (TM).
-
Функция получает строковый ответ, как указано выше и анализирует это в словаре Python, используя ( коротко для загрузки строки). Мы всегда будем использовать этот, поскольку Telegram всегда даст нам ответ JSON.
-
Вызывает одну и ту же команду API, которую мы использовали в нашем браузере ранее, и извлекает список «обновлений» (сообщения, отправленные на наш бот).
-
Предоставляет простой, но нецелентный способ получить идентификатор чата и текст сообщения самого последнего сообщения, отправленного на наш бот. Поскольку Get_Updates всегда будет отправлять все сообщения, которые были недавно отправлены на наш бот, это не идеально, так как мы всегда будем загружать целую кучу сообщений, когда мы хотим только последнего. Мы обсудим позже более подробно, как сделать это более элегантно. На данный момент эта функция возвращает кортеж который определяет конкретный чат между нашим ботом и человеком, который отправил сообщение, и , что сам сообщение.
-
Принимает текст сообщения, который мы хотим отправить ( ) и ID чата чата, где мы хотим отправить сообщение ( ). Затем он называет Команда API, передавая как текст, так и идентификатор чата в качестве параметров URL-адреса, что просит телеграмму отправить сообщение в этот чат.
Последние две линии приносят все, что мы написали вместе, чтобы на самом деле получать и отправить сообщение. Во-первых, мы получаем текст и идентификатор чата от самого последнего сообщения, отправленного на наш бот. Тогда мы называем Используя тот же текст, который мы только что получили, эффективно «эхом» последнее сообщение обратно пользователю.
На данный момент наш сценарий не слушает новые сообщения и немедленно ответить. Вместо этого, когда мы запустим его, наш бот будет получать только самое последнее сообщение, отправленное на это и echo. Мы можем проверить его, отправив нашу бот сообщение, а затем запустить скрипт. Дайте этому!
Плацдарм для бота
Напишем элементарного эхо-бота на aiogram с поллингом, чтобы бегло ознакомиться с фреймворком. Прежде всего, добавим нужные импорты (предполагается, что мы используем Virtual Environment, подробнее о нём – в уроке №0):
Теперь создадим объект бота. А за хэндлеры здесь отвечает специальный Диспетчер:
Далее напишем простейший хэндлер, повторяющий текстовые сообщения:
Началась магия.Во-первых, как я написал чуть выше, за хэндлеры отвечает диспетчер (dp).Во-вторых, подхэндлерные функции в aiogram асинхронные (async def), вызовы Bot API тоже асинхронные, поэтому необходимо использовать ключевое слово .В-третьих, вместо можно для удобства использовать без указания и , чтобы бот сделал «ответ» (reply), либо аналог , чтобы просто отправить в тот же чат, не создавая «ответ». Само выражение в хэндлере пустое, т.к. нас устроят любые текстовые сообщения.
Наконец, запуск!
Параметр позволяет пропустить накопившиеся входящие сообщения, если они нам не важны.Запускаем код, убеждаемся в его работоспособности, после чего удаляем хэндлер вместе с функцией echo, нам они больше не понадобятся, в отличие от остального кода.
Создаем бота
Перейдите в Telegram и найдите @Botfather. Это инструмент для создания новых ботов. Зайдите в него и введите имя бота для пользователей. Затем укажите имя для мессенджера.
Здесь же вы можете указать описание бота, определить для него команды. После того, как робот в мессенджере создан, он понимает только три предопределенные: /start, /help и /settings. Остальные следует определить в @Botfather.
В результате вы получите токен – символьно-числовую последовательность, уникальную для каждого бота Telegram. Именно с помощью этого идентификатора отправляются запросы на сайт https://api.telegram.org.
Каждый запрос имеет вид:
https://api.telegram.org/bot507226896:AAGT_fsEO1milOkqbNp-VolQDJ0tGjaPvD7/КОМАНДА
Методы описаны в документации к Telegram Bot API и являются стандартными. Задача программиста при написании бота заключается в создании кода, который получает сообщения от пользователя и отправляет команду боту на выполнение действий. Запрос может выглядеть следующим образом:
https://api.telegram.org/ bot507226896:AAGT_fsEfg1milOkqbNp-VolQDJ0tGjaPvD7/sendMessage?chat_id=391911270&text=Hello
Это пример отправки сообщения для клиента Telegram. Обязательно необходимо знать параметр id_chat – это идентификатор чата. Узнать его можно из ответа, который присылает сервер, который имеет вид JSON-строки:
{«ok»:true,»result»:{«message_id»:4,»from»:{«id»:507226896,»is_bot»:true,»first_name»:»Anna»,»username»:»Annatuola_bot»},»chat»:{«id»:391911270,»first_name»:»Irina»,»last_name»:»12345678″,»type»:»private»},»date»:1514900499,»text»:»Hello»}}
По сути программа отправляет запросы, считывает ответы и выполняет парсинг полученной строки. В зависимости от сообщений пользователя выполняются те или иные действия.
Регистрация бота
Для начала нам нужно зарегистрировать нашего бота в Telegram, чтобы сгенерировать учетные данные, которые мы будем использовать для подключения к Telegram API. Каждый бот должен быть привязан к конкретной учетной записи пользователя. Это можно сделать с помощью официального управляющего бота Telegram под названием «BotFather».
Для этого сначала войдите в ваш аккаунт и в поиске наберите . Обязательно выберите подтвержденный аккаунт (у которого справа будет голубая галочка), в противном случае мы можем провести беседу с кем-то совсем другим.
BotFather
Для активации нажмите на кнопку :
Для начала рабочего процесса создания нового бота мы должны отправить в BotFather команду .
Бот у нас спросит следующие данные:
- имя бота, которое будет отображаться в верхней части чата нового бота, например, «Replit Quick-start Tutorial».
- имя пользователя, которое будет использоваться для уникальной ссылки на этого бота, например, «@replit_tutorialbot».
Замечание: полезно иметь короткое имя пользователя, чтобы людям было удобно его вводить. Особенно, если вы планируете добавить встроенный режим.
Токен
Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:
Обратите внимание, что вся строка (до двоеточия и после) является токеном
Правильно кодировать наш текст сообщения
Окончательная проблема нашего ECHO BOT состоит в том, что она действует странно, если мы отправим его сообщения, содержащие специальные символы. Например, все + знаки исчезают из наших сообщений, и весь текст после того, как и знак исчезает тоже. Это вызвано этими символами, имеющими специальные значения в контексте URL. Чтобы исправить это, нам нужно кодировать любые специальные символы в нашем сообщении. К счастью, стандартный Python Имеет функцию, которая обрабатывает это для нас, поэтому нам нужно только импортировать это, и добавить одну строку кода.
Добавьте следующую строку в верхней части вашего файла .py
import urllib
И теперь измените Функция для чтения следующим образом:
def send_message(text, chat_id): text = urllib.parse.quote_plus(text) url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id) get_url(url)
Перезапустите бот еще раз и отправьте ему некоторые сообщения, которые были проблематичными ранее, такие как:
+ Hello+ Hello&test
Теперь он должен быть в состоянии ответить на все эти сообщения (и в значительной степени все остальное, что вы бросаете на него, в том числе emoji) безупречно.
Шаг 1: реализация запросов курсов валют
Для начала необходимо написать код, выполняющий запросы. Воспользуемся при написании API ПриватБанка, ниже расположена ссылка на него: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. В коде нужно использовать эти методы:
- load_exchange – находит курсы валют и выводит закодированную информацию;
- get_exchange – выводит данные об определенной валюте;
- get_exchanges – показывает перечисление валют согласно образцу.
В результате код в файле pb.py выглядит так:
import re import requests import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key): for exc in load_exchange(): if ccy_key == exc: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): if re.match(ccy_pattern, exc, re.IGNORECASE) is not None: result.append(exc) return result
Программа может выдать такой ответ на указанные запросы:
Создание скелета бота
Теперь, когда все настроено, мы можем приступить к программированию! Начнем с нашего файла :
import os from telegram import Update #upm package(python-telegram-bot) from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext #upm package(python-telegram-bot) def help_command(update: Update, context: CallbackContext) -> None: htext = ''' Welcome Send a message to store it. Send /fetch to retrieve the most recent message''' update.message.reply_text(htext) def main(): updater = Updater(os.getenv("TOKEN")) dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler("start", help_command)) dispatcher.add_handler(CommandHandler("help", help_command)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
Сначала мы импортируем модуль , чтобы получить доступ к токену как переменной окружения.
Затем мы импортируем некоторые классы из библиотеки Telegram.
Комментарии, начинающиеся с , не являются обязательными. Они используются Replit для загрузки правильного пакета. В общем случае это не нужно, но здесь необходимо, потому что подобных библиотек Telegram очень много.
Функция запускается всякий раз, когда пользователь отправляет нам команду или . Команда также выполняется автоматически, когда новый пользователь запускает ваш бот (как мы ранее запускали ). Бот будет знать, как использовать эту функцию, потому что мы сообщим ему об этом позже в теле функции .
В функции main мы инициализируем экземпляр класса , который использует наш токен.
updater = Updater(os.getenv("TOKEN"))
— это класс, который будет постоянно проверять Telegram на наличие новых сообщений в нашем боте.
Когда получает новое сообщение, он передает его в класс . Тот проверяет, есть ли у нас подходящий обработчик для данного сообщения. Как уже упоминалось выше, нужно задать обработчик для команд и . Мы cделаем это при помощи функции , например:
dispatcher.add_handler(CommandHandler("start", help_command))
и
dispatcher.add_handler(CommandHandler("help", help_command))
Чтобы не усложнять задачу, команда и команда имеют здесь один и тот же обработчик, но при желании для обработки каждой из них вы можете использовать разные функции.
Затем нам нужно сказать классу , чтобы он начал проверку новых сообщений. Мы это сделаем при помощи следующей строки.
updater.start_polling()
Важно знать, что — это неблокирующая функция. Это означает, что код в ней не прекращает выполнение
Он будет исполняться, пока программа не завершится.
Другими словами, если мы оставим это в качестве последней строки функции , код будет выполнен, а затем немедленно завершится, потому что больше ничего не блокирует его. Поэтому, чтобы наш бот не прекращал прослушку, мы используем строку , чтобы заблокировать скрипт, пока мы слушаем.
Отказ от команды бота или на пользователя
Общие способности бота – включить или выключать определенные команды, но возникает проблема, которая возникает, что мы не можем просто удалить обработчик для функциональности, как это удалит его для всех пользователей бота.
К счастью, BOT Python Telegram позволяет нам хранить конкретные данные пользователя, используя контекст, который передается на наши функции обратного вызова. Давайте добавим еще один обработчик под обработчиком повторителя:
dispatcher.add_handler(CommandHandler('echo', echo))
Теперь мы сначала изменим обработчик повторителя, чтобы проверить, следует ли повторять текст пользователя:
def repeater(update, context): if context.user_data: update.message.reply_text(update.message.text)
Здесь мы добавили утверждение, если context.user_data : перед тем, как получить ответ бота пользователю. У Python Telegram Bot имеет словарь user_data, который может быть доступен с использованием контекста.
Это специфично для пользователя, и используя это, мы можем убедиться, что если есть несколько пользователей бота, они не затронуты.
Теперь мы добавим в другую функцию, чтобы пользователь мог установить словарь ECHO с помощью команды echo в чате:
def echo(update, context): command = context.args.lower() if("on" == command): context.user_data = True update.message.reply_text("Repeater Started") elif("off" == command): context.user_data = False update.message.reply_text("Repeater Stopped")
В этой функции обратного вызова мы собираем параметры дополнительных команд пользователей из контекста. Параметры пользователей содержатся с CONTEXT.ARGS, которые предоставляют массив на основе пробелов от пользователя, в этой функции мы проверяем первый параметр, передаваемый пользователем, ищем включение или выключение, и измените переменную user_data .
Как настроить бот, чтобы работать непрерывно
Если вы запустите свой бот в REPL.IT, а затем закройте вкладку, он работает, ваш бот будет прекратить работу.
Но есть два способа постоянно поддержания бота, даже после закрытия веб-бауза.
Первый путь и простейший способ – подписаться на оплаченный план в REPL.IT. Их самый дешевый платный план называется планом хакера, и он включает в себя пять всегда на рентам.
Вы можете получить три месяца бесплатно, используя эту ссылку (ограничена первыми 1000 человек):
После того, как вы подписались на этот план, откройте refl и щелкните по названию вверху. Затем выберите опцию «Всегда на».
Есть еще один способ сохранить ваш код, даже на свободном уровне, но это немного сложнее. Reft.it продолжит запустить веб-сервер, даже после закрытия вкладки. Но даже веб-сервер будет работать только до часа без какого-либо использования.
Вот что за reft.it docs говорят:
Чтобы постоянно поддерживать бот, мы будем использовать другой бесплатный сервис, называемый Robot Womptime At https://uptimerobot.com/ Отказ
Робот безотказной работы может быть установлен на веб-сервер Bot на REPL.IT каждые 5 минут. С постоянными звонками, бот никогда не войдет на сцену сна и будет просто продолжать работать.
Поэтому мы должны сделать еще две вещи, чтобы наш бот постоянно работать:
- Создайте веб-сервер в REPL.IT и
- Установите Robot Roomtime, чтобы непрерывно пинговать веб-сервер.
Как создать веб-сервер в REPL.IT
Создание веб-сервера проще, чем вы можете подумать.
Чтобы сделать это, создайте новый файл в вашем проекте под названием Отказ
Затем добавьте следующий код:
from flask import Flask from threading import Thread app = Flask('') @app.route('/') def home(): return "Hello. I am alive!" def run(): app.run(host='0.0.0.0',port=8080) def keep_alive(): t = Thread(target=run) t.start()
В этом коде мы используем колбу для запуска веб-сервера. Сервер возвращает «Привет. Я жив». всем, кто его посещает. Сервер будет работать на отдельной резьбе с нашего бота. Мы не будем обсуждать все здесь, так как остальные не имеют права актуальны для нашего бота.
Теперь нам просто нужен бот для запуска этого веб-сервера.
Добавьте следующую строку в верхнюю часть импортировать сервер.
from keep_alive import keep_alive
Чтобы запустить веб-сервер, когда Запускается, добавьте следующую строку в качестве второй строки, прямо перед запуском бота.
stear_alive ()
Когда вы запускаете BOT на REPL.IT После добавления этого кода, откроется новое окно веб-сервера. Для веб-сервера, показанного URL. Скопируйте URL, чтобы вы могли использовать его в следующем разделе.
Как настроить робот времени безотказной работы
Теперь нам нужно настроить робот безотказной работы для Ping на веб-сервере каждые пять минут. Это заставит бот постоянно работать.
Создайте бесплатный аккаунт на https://uptimerobot.com/ Отказ
Как только вы вошли в свою учетную запись, нажмите «Добавить новый монитор».
Для нового монитора выберите «HTTP (S)» в качестве типа монитора и назовите его, что вам нравится. Затем вставьте в URL-адрес вашего веб-сервера от REPL.IT. Наконец, нажмите «Создать монитор».
Были сделаны! Теперь бот будет работать непрерывно, чтобы люди всегда могли взаимодействовать с ним на REPL.IT.
Вступление
Что мы хотим сделать
Начнем с того, что определимся, что мы хотим сделать, это телеграмм бот который будет уметь показывать:
- Статистику случаев заражения COVID-19 по геолокации
- Статистику запросов стран пользователями
- Статистику действий пользователей
- Информацию о контактах
- Справку, о том, как пользоваться ботом
Что мы будем с этого иметь
Чему мы научимся во время приготовления вакцина-бота:
- Работой с базой данных mongodb(подключение, получение данных, сохранение)
- Упаковка приложения в Docker контейнер
Регистрация бота в мессенджере Telegram
Затем необходимо зарегистрировать нашего бота в Telegram и получить токен для работы с ним из нашего кода. Процедура тривиальная, но все же для тех кто не знаком с платформой опишу пошагово:
- Выполнить команду /start
- Выполнить команду /newbot
- Выбрать ник бота и адрес по которому он будет доступен в Telegram
- Сохраняем token который бот вернул нам в ответе в блокнот
Подготовка машины для программирования бота
Для того чтобы подготовить машину к программированию бота для Telegram необходимо поставить на нее следующее программное обеспечение:
Структура приложения
Структура приложения может быть выбрана вами в зависимости от ваших потребностей, целей и опыта. Но перед этим предлагаю вам создать репозиторий на github с названием вашего бота и склонировать его к себе на машину, это необходимо для использования системы контроля версий и настройки CI в перспективе.
Наш вакцина-бот внутри будет иметь вот такую структуру
Почему Django?
Многие скажут: ведь Django — очень большой фреймворк! Зачем забивать гвозди микроскопом? У меня на это есть несколько аргументов:
-
В Django есть поддержка баз данных, встроенная админка и огромная библиотека плагинов на все случаи жизни. Теория от YCombinator учит использовать готовые компоненты вместо написания своих с нуля, так как это позволит сильно сэкономить время на старте и не придется наступать на грабли, на которые уже кто-то наступал.
-
Если какие-то модули не нужны сейчас, то они могут пригодится в будущем. Например, ваш бот стал популярным и появились фродеры: админка сильно упростит анализ данных системы и позволит расширить вашу команду «не программистами».
-
Django проверена миллионами разработчиков. Написаны тысячи сайтов с документацией и примерами. Понятно как ее правильно деплоить в продакшн и масштабировать.
Каждый раз, разрабатывая Телеграм бота сложнее, чем hello-world, нужна база данных как минимум, чтобы хранить информацию о всех пользователях, которые пользуются ботом (да, на данный момент Telegram Bot API не выдает даже такую базовую статистику). Как только ботом начинают пользоваться десятки тысячи людей, понадобится как-то масштабировать систему — возможно, одного сервера не хватит.
Если логика вашего Телеграм бота сложна, вам понадобятся background tasks. Например, чтобы разослать тысячам пользователей сообщение с рекламой анонсом новых возможностей бота. В экосистеме Django такие задачи легко реализуются с помощью модуля Celery. В качестве его брокера я люблю использовать Redis, а для периодических задач модуль Django-celery-beat (появляется возможность через админку просто накликать, какую функцию по какому крону вызывать).

Эта тема закрыта для публикации ответов.