Как создать telegram-бота с помощью библиотеки python-telegram-bot

Регистрация бота

Для начала нам нужно зарегистрировать нашего бота в Telegram, чтобы сгенерировать учетные данные, которые мы будем использовать для подключения к Telegram API. Каждый бот должен быть привязан к конкретной учетной записи пользователя. Это можно сделать с помощью официального управляющего бота Telegram под названием «BotFather».

Для этого сначала войдите в ваш аккаунт и в поиске наберите . Обязательно выберите подтвержденный аккаунт (у которого справа будет голубая галочка), в противном случае мы можем провести беседу с кем-то совсем другим.

BotFather

Для активации нажмите на кнопку :

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

Бот у нас спросит следующие данные:

  • имя бота, которое будет отображаться в верхней части чата нового бота, например, «Replit Quick-start Tutorial».
  • имя пользователя, которое будет использоваться для уникальной ссылки на этого бота, например, «@replit_tutorialbot».

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

Токен

Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:

Обратите внимание, что вся строка (до двоеточия и после) является токеном

Модифицируем код

Отлично! Теперь нам осталось заменить строку в функции на . Ваш код должен выглядеть так:

from telegram.ext import Updater, InlineQueryHandler, CommandHandlerimport requestsimport redef get_url():    contents = requests.get('https://random.dog/woof.json').json()    url = contents    return urldef get_image_url():    allowed_extension =     file_extension = ''    while file_extension not in allowed_extension:        url = get_url()        file_extension = re.search("(*)$",url).group(1).lower()    return urldef bop(bot, update):    url = get_image_url()    chat_id = update.message.chat_id    bot.send_photo(chat_id=chat_id, photo=url)def main():    updater = Updater('YOUR_TOKEN')    dp = updater.dispatcher    dp.add_handler(CommandHandler('bop',bop))    updater.start_polling()    updater.idle()if __name__ == '__main__':    main()

Всё должно работать идеально. Этот код можно найти на моём GitHub.

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

Перевод статьи Dzaky Widya Putra: Learn to build your first bot in Telegram with Python

Метод TF-IDF

Проблема «набора слов» заключается в том, что в тексте могут доминировать часто встречающиеся слова, которые не содержат ценную для нас информацию

Также «набор слов» присваивает большую важность длинным текстам по сравнению с короткими

Один из подходов к решению этих проблем состоит в том, чтобы вычислять частоту появления слова не в одном тексте, а во всех сразу. За счет этого вклад, например, артиклей «a» и «the» будет нивелирован. Такой подход называется TF-IDF (Term Frequency-Inverse Document Frequency) и состоит из двух этапов:

TF — вычисление частоты появления слова в одном тексте

TF = (Число раз, когда слово "t" встречается в тексте)/(Количество слов в тексте)

IDF — вычисление того, на сколько редко слово встречается во всех текстах

IDF = 1+log(N/n), где N - общее количество текстов, n - во скольких текстах встречается "t"

Коэффициент TF-IDF — это вес, часто используемый для обработки информации и интеллектуального анализа текста

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

Пример

Рассмотрим текст, содержащий 100 слов, в котором слово «телефон» появляется 5 раз. Параметр TF для слова «телефон» равен (5/100) = 0,05.

Теперь предположим, что у нас 10 миллионов документов, и слово телефон появляется в тысяче из них. Коэффициент вычисляется как 1+log(10 000 000/1000) = 4. Таким образом, TD-IDF равен 0,05 * 4 = 0,20.

TF-IDF может быть реализован в scikit так:

from sklearn.feature_extraction.text import TfidfVectorizer

Создаем бота

Перейдите в 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»}}

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

Используя длинный опрос

Последняя серьезная проблема с нашим ботом Echo – это то, что он должен сделать веб-запрос каждые 0,5 секунды. Это не отлично подходит для серверов Telegram (они явно просят людей не делать это вне тестирующих сценариев) и не отлично подходит для наших ресурсов. Длительное опрос использует тот факт, что большую часть времени мы получаем «пустые» ответы. Поскольку наш бот, вероятно, не будет получать сообщения каждой полторы, большую часть времени, когда мы просим обновления, нет. С длинным опросом, вместо телеграммы говорят нам, что нет обновлений, он просто держит соединение, пока нет обновлений, а затем отправляет их в открытую трубу. Конечно, нецелесообразно держать соединение открыть навсегда, поэтому мы можем указать количество секунд, пока мы хотим ждать. Это делается путем прохождения другого дополнительного аргумента для Звоните, а именно Отказ

Чтобы наш код использовать длинный опрос, просто обновите наши Способ следующим образом:

def get_updates(offset=None):
    url = URL + "getUpdates?timeout=100"
    if offset:
        url += "&offset={}".format(offset)
    js = get_json_from_url(url)
    return js

Теперь мы всегда проходим вдоль аргумент Потому что у нас сейчас есть два аргумента, нам также нужно менять, где мы ранее имели к (В URL-адресах мы указываем, что список аргументов начинается с A Но дальнейшие аргументы разделены с ).

Запустите бот снова, и он должен работать точно так же, но теперь он будет делать гораздо меньше запросов и использовать меньше ресурсов вашего компьютера. Если вы хотите проверить, что это работает, просто добавьте строку, как прямо под В функция и запустить бот с и без аргумент, который мы только что добавили. Без ожидания времени вы увидите, что бот проверяет обновления каждые 0,5 секунды. В то время как с таймаутом он будет инициировать только новую проверку каждые 100 секунд, или когда получено новое сообщение.

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

Создать программу для приема сообщений и ответа на них можно через сервис @BotFather. Переходим на его страницу в Telegram и вводим команду /newbot. В чате появятся инструкции, согласно которым нужно записать сначала имя бота, а после – его адрес. Когда аккаунт-бот будет создан, на экране появится приветственное сообщение, содержащее токен. Для дальнейшей настройки воспользуемся этими командами:

  • /setdescription – описание;
  • /setabouttext – информация о новом боте;
  • /setuserpic – фотография профиля;
  • /setinline – встроенный режим;
  • /setcommands – описание команд.

На последнем шаге настройки описываем /help и /exchange. Когда все этапы пройдены, пора перейти к составлению кода.

Установка

Почти все, что мы делаем, будет достигнуто, используя только стандартные библиотеки Python, но мы также будем использовать стороннюю Модуль, который предоставляет ряд улучшений для Python’s И позволяет нам делать HTTP-запросы очень просто и кратко. Установите это через PIP, используя команду, аналогичную следующему (вам может потребоваться использовать вместо и/или добавить флаг flag, основанный на том, как вы обычно устанавливаете Python Библиотеки).

pip3 install requests

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

Создание бота телеграммы

Первый шаг – сказать телеграмму, которую вы хотите создать новый бот. Все сообщения, которые наш бот отправляет и получает, пройдет через инфраструктуру телеграммы. Наш код периодически сделает запрос на получение всех новых сообщений на наш бот из серверов Telegram и затем отправит ответы на каждое сообщение по мере необходимости. Для того, чтобы зарегистрировать бот с телеграммой, вам сначала нужно создать личную учетную запись телеграммы. Посетить web.telegram.org и введите свой номер телефона. Telegram отправит вам текстовое сообщение (SMS), и затем вы можете создать учетную запись, следуя инструкциям на экране. Если у вас уже есть учетная запись Telegram, вы можете просто использовать это, и вы также можете использовать любой из настольных компьютеров Telegram и мобильных приложений, доступных из Telegram.org, вместо веб-приложения мы будем использовать для всех примеров в Это руководство.

После того, как у вас есть учетная запись Telegram, вы можете зарегистрировать новую телеграмму BOT с помощью отца BOT. Посетить Telegram.me/botfather Начать разговор с ботом телеграммы, который создает другие боты. Телеграмма боты могут получить Сообщения или Команды Отказ Первые – это просто текст, который вы отправляете, как если бы вы отправили сообщение другому человеку, в то время как последние префиксированы с помощью персонаж. Чтобы создать новый бот, отправьте следующую команду для бота отца в чате (точно так же, как будто вы разговаривали с другим человеком на телеграмме).

/newbot.

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

Сделать бот

Бот отец теперь попросит вас выбрать имя пользователя для своего бота. Это имя пользователя должно закончиться и быть во всем мире уникальным. Когда телеграмма стала более популярной, она стала сложнее найти краткое и соответствующее имя пользователя для вашего бота. В этом руководстве мы будем использовать , но для остальной части этого учебника мы укажем имя пользователя BOT с Итак, вам придется заменить выбранное имя пользователя там, где нет необходимости. Отправьте выбранное имя пользователя на Бот Отец:

<Ваш-бот-имя пользователя>

Теперь бот отец отправит вам сообщение «поздравления», которое будет включать токен. Токен должен выглядеть что-то подобное:

2483457814: aahrlcx234_vskzwejdwjtsdfuwejhyu5mi.

Для остальной части этого учебника мы укажем, где вам нужно поставить свой токен, используя Отказ

Обратите внимание на токен, так как нам понадобится в код, который мы собираемся написать

Как настроить бот, чтобы работать непрерывно

Если вы запустите свой бот в REPL.IT, а затем закройте вкладку, он работает, ваш бот будет прекратить работу.

Но есть два способа постоянно поддержания бота, даже после закрытия веб-бауза.

Первый путь и простейший способ – подписаться на оплаченный план в REPL.IT. Их самый дешевый платный план называется планом хакера, и он включает в себя пять всегда на рентам.

Вы можете получить три месяца бесплатно, используя эту ссылку (ограничена первыми 1000 человек):

После того, как вы подписались на этот план, откройте refl и щелкните по названию вверху. Затем выберите опцию «Всегда на».

Есть еще один способ сохранить ваш код, даже на свободном уровне, но это немного сложнее. Reft.it продолжит запустить веб-сервер, даже после закрытия вкладки. Но даже веб-сервер будет работать только до часа без какого-либо использования.

Вот что за reft.it docs говорят:

Чтобы постоянно поддерживать бот, мы будем использовать другой бесплатный сервис, называемый Robot Womptime At https://uptimerobot.com/ Отказ

Робот безотказной работы может быть установлен на веб-сервер Bot на REPL.IT каждые 5 минут. С постоянными звонками, бот никогда не войдет на сцену сна и будет просто продолжать работать.

Поэтому мы должны сделать еще две вещи, чтобы наш бот постоянно работать:

  1. Создайте веб-сервер в REPL.IT и
  2. Установите 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.

pyTelegramBotApi

Ссылки на документации всех библиотек будут в конце.

Создадим простого бота, отвечающего на команду , с помощью этой библиотеки:

pyTelegramBotApi является просто обёрткой для всего Telegram Bot API, но здесь разберутся только основные составляющие.Взаимодействие с ботом происходит через переменную bot (токен надо вставить свой). Декоратор @message_handler реагирует на входящие сообщение.Message – это объект из Bot API, содержащий в себе информацию о сообщении. Полезные поля: message.chat.id – идентификатор чатаmessage.from.id – идентификатор пользователяmessage.text – текст сообщенияФункция send_message принимает идентификатор чата (берем его из сообщения) и текст для отправки.

Замена клавиатуры

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

ReplyKeyboardMarkup – и есть та самая клавиатура. Метод row() создает ряд (максимум 12) из кнопок, передаваемых в качестве аргумента.Также есть особенная клавиатура types.ReplyMarkupRemove(), которая меняет клавиатуру на стандартную.

Клавиатура для сообщений

Можно создавать клавиатуру для отдельного сообщения. Передавать его нужно так же в аргумент reply_markup:

У кнопок есть несколько режимов, в зависимости от второго аргумента. Подробнее можно прочитать в официальной документации, но я остановлюсь только на callback_data.При нажатии на такую кнопку боту придет отдельный CallbackQuery, который нужно обрабатывать подобно сообщению:

Для обработки обязательно указать аргумент func для «отсеивания» Callback запросов.После обработки каждого запроса нужно выполнить команду answer_callback_query, чтобы Telegram понял, что запрос обработан. В поле callback.data хранится информация из callback_data нажатой кнопки.

Изменение сообщений

У ботов есть функция изменения своих сообщений (можно использовать, чтобы сделать перелистывание страниц, например). Для этого нужно воспользоваться методом edit_message_text (edit_message_caption для картинок):

Смысл аргументов понятен из их названия.

Шаг 0: теоретическая база об API Telegram-ботов

Основной инструмент, который используют при создании Телеграм-ботов – это интерфейс прикладного программирования HTML, или API HTML. Этот элемент принимает запросы посетителей и отправляет ответы в виде информации. Готовые конструкции упрощают работу над программой. Чтобы написать бот для Телеграма, необходимо воспользоваться этим электронным адресом: https://api.telegram.org/bot<token>/METHOD_NAME

Для правильного функционирования бота также нужен токен – комбинация символов, защищающая программу и открывающая доступ к ней доверенным разработчикам. Каждый токен уникален. Строка присваивается боту при создании. Методы могут быть разными: getUpdates, getChat и прочие. Выбор метода зависит от того, какого алгоритма работы разработчики ожидают от бота. Пример токена:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

В ботах используются запросы GET и POST. Параметры методов нередко приходится дополнять – к примеру, когда по задумке метод sendMessage должен отправить id чата и какой-либо текст. Параметры для доработки метода можно передать строкой запроса URL с помощью application/x-www-form-urlencoded или через application-json. Эти способы не подходят для загрузки файлов. Также обязательна кодировка UTF-8. Отправив запрос к API, можно получить результат в JSON-формате. Взгляните на ответ программы на извлечение информации через метод getME:

GET https://api.telegram.org/bot<token>/getMe{   ok: true,   result: {       id: 231757398,       first_name: "Exchange Rate Bot",       username: "exchangetestbot"   }

}

Существует два способа получить пользовательские сообщения в ботах. Обе методики действенны, но подходят в разных случаях. Чтобы получить сообщения, можно вручную написать запрос с методом getUpdates – программа выдаст на экран массив данных Update. Запросы нужно отправлять регулярно, после анализа каждого массива отправка повторяется. Избежать повторного появления проверенных объектов поможет offset – параметр, определяющий количество пропущенных записей перед загрузкой нового результата. Преимущества метода getUpdates проявятся, если:

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

Второй метод, который можно прописать для получения пользовательских сообщений – setWebhook. Он используется один раз, не нужно постоянно отправлять новые запросы. Webhook пересылает обновления данных на указанный адрес URL. Для применения этого способа потребуется SSL-сертификат. Webhook будет полезен в этих случаях:

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

Telegram-сервис @BotFather предназначен для создания чат-ботов. Основные настройки также устанавливаются через эту систему – BotFather поможет сделать описание, поставить фотографию профиля, добавить инструменты поддержки. Библиотеки – наборы HTML-запросов для Телеграм-ботов – доступны в интернете, их достаточно много. При создании программы-примера применена pyTelegramBotApi.

Polling vs Webhook

Если бы не противостояние polling vs webhook и некоторые сложности (отчасти надуманные) с webhook’ом, в этой статье не было бы необходимости. Раз это имеет принципиальное значение, давайте разберемся подробнее.

Что такое бот и как он общается с Телеграмом? Очевидно, бот это программа, которая работает на вашем компьютере или сервере. А общение с Телеграмом происходит методами отправки и получения сообщений. И если с отправкой сообщений примерно все ясно, вариант один — послать (адрес “куда” мы знаем). То вариантов получения ботом сообщений от Телеграма два.

Первый — это опрос (буквальный перевод слова polling) сервера Телеграма на наличие сообщений для бота. Второй — это “почтовый ящик” с ip-адресом (webhook — можно перевести как веб-ловушка), на который приходят сообщения от сервера Телеграма.

Самая простая аналогия с реальной почтой. Пусть почта (почтовое отделение) — это сервер Телеграма, а вы — это ваш бот. Тогда, в первом случае (polling) вам приходится ходить на почту за корреспонденцией. И если хотите получать сообщения без задержек, то придется не ходить, а буквально бегать без передышек взад и вперед. Как понимаем, жить на почте в ожидании сообщений запрещено! Во втором случае вы сообщаете почтовому отделению свой домашний адрес и ждете корреспонденцию спокойно дома, попивая чай или покуривая бамбук.

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

Во втором же случае “почтового ящика” с адресом (webhook’ом) такого не происходит. Потому что ни вы, ни ваш бот, никуда не ходите, а просто ждете. И вам все равно, куда переехало почтовое отделение, потому что почту вам приносит почтальон.

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

Конечно, для первого варианта есть возможность внести в код обработку исключений. Например, если почта закрыта, постоять и подождать. Но интернет утверждает, что все равно боты с polling’ом только для поиграться.

Я сначала не поверил, что проблема настолько серьезна. И сделал вариант с polling’ом, предполагая, что как-нибудь позже перепишу на webhook’и. Но это не сработало. На моем домашнем компе с macOS бот работал без проблем и час и два (конечно, с VPN) и не падал. Но стоило мне перенести его на облачный сервер на Linux’е он не мог проработать и 20 минут. Я пытался решить эту проблему разными путями и настройками, но получал лишь разный код ошибок. Селяви, это Телеграм. Потеряв день, пришлось взяться за webhook’и, не откладывая на потом. В конце концов, я же хотел запустить бот на сервере сейчас, а не через год.

Заключение

Хотя наш примитивный бот едва ли обладает когнитивными навыками, это был неплохой способ разобраться с NLP и узнать о работе чат-ботов. «ROBO», по крайней мере, отвечает на запросы пользователя. Он, конечно, не обманет ваших друзей, и для коммерческой системы вы захотите рассмотреть одну из существующих бот-платформ или фреймворки, но этот пример поможет вам продумать архитектуру бота.

Интересные статьи:

  • Как создать собственную нейронную сеть с нуля на языке Python
  • Word2Vec: как работать с векторными представлениями слов
  • Как применять теорему Байеса для решения реальных задач
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector