Menu

Простые боты для Telegram на Python в Google Colab

Краткие теоретические сведения

Рассмотрим разработку и запуск ботов для мессенджера Телеграм. В качестве языка разработки будет использоваться Python. Запускать код на выполнение будем в рабочих тетрадках (блокнотах) замечательной среды разработки Colab компании Google. Код бота, размещенный в Colab, будет взаимодействовать c сервером Telegram через API.

Telegram (от др.-греч. τῆλε «далеко» + др.-греч. γράμμα «запись») — кроссплатформенная система мгновенного обмена сообщениями (мессенджер) с функциями VoIP, позволяющая обмениваться текстовыми, голосовыми и видео- сообщениями, стикерами и фотографиями, файлами многих форматов. Также можно совершать видео- и аудио- звонки и трансляции в каналах и группах, организовывать конференции, многопользовательские группы и каналы. Клиентские приложения Telegram доступны для Android, iOS, Windows Phone, Windows, macOS и Linux.

API (МФА [ˌeɪ.piˈaɪ]; аббр. от англ. Application Programming Interface — «программный интерфейс приложения») — описание способов (набор классов, процедур, функций, структур или констант), которыми одна компьютерная программа может взаимодействовать с другой программой. Обычно входит в описание какого-либо интернет-протокола, программного каркаса (фреймворка) или стандарта вызовов функций операционной системы. Часто реализуется отдельной программной библиотекой или сервисом операционной системы. Используется программистами при написании всевозможных приложений.

Бот (англ. bot, сокращение от чеш. robot) — виртуальный робот, который функционирует на основе специальной программы, выполняющий автоматически и/или по заданному расписанию какие-либо действия через интерфейсы, предназначенные для людей. Боты находят также применение в условиях, когда требуется лучшая реакция по сравнению с возможностями человека (например, игровые боты, боты для интернет-аукционов и тому подобное) или, реже, для имитации действий человека (например, боты для чатов и тому подобное). Чат-бот может выдать достаточно адекватный ответ на вопрос, сформулированный на правильном русском языке (или любом другом, работа с которым поддерживается). Такие боты часто применяются для сообщения прогноза погоды, результатов спортивных соревнований, курсов валют, биржевых котировок и тому подобное.

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

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

Согласно текущей статистике за 2022 год, недвижимость является ведущей отраслью по прибылям от чат-ботов (28 %). Затем идут путешествия (16 %), образование (14 %), здравоохранение (10 %) и финансы (5 %).

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

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

В сфере путешествий стали одними из первых использовать чат-боты. Чат-бот может предложить направления/рейсы/рестораны — на основании поисковых запросов и предпочтений пользователя. После покупки программа обеспечивает клиентскую поддержку, предоставляя ответы на часто задаваемые вопросы.

 

Практическая часть

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

Достаточно создать одного бота в Telegram - его поведение будет меняться, когда мы поменяем его код. Чтобы создать бота в Telegram потребуется (как это ни странно) обратиться к боту: есть удивительный бот @BotFather - «прародитель всех ботов».

Необходимо найти бота, нажать кнопку «Запустить» (или написать /start), в ответ BotFather пришлет список доступных команд.

Отправим боту команду /newbot, чтобы создать нового бота. В ответ он попросит ввести имя будущего бота, его можно писать на русском. После ввода имени нужно будет изобрести адрес бота, причем он должен заканчиваться на слово bot. Например, drach_pro_bot. Если адрес уже кем‑то занят, придётся придумывать новый.

Когда бот будет создан, мы получим сообщение, в котором будет исчерпывающая техническая информация о боте. Обратите внимание, что после фразы Use this token to access the HTTP API будет написана строка из букв и цифр — это токен.

Реализуем бота для Telegram, воспользовавшись возможностями языка Python. Понятно, что чтобы бот всегда работал, его код должен быть запущен и выполняться 24 часа в сутки. Значит, потребуется сервер (для надежности под операционной системой Linux), на котором установлен Python. Если такого сервера нет, можно запускать код на собственной домашней машине, но тогда придётся повозиться с настройками роутера. Но есть ещё один интересный вариант, который очень подходит для тестирования и изучения ботов - это Colab.

Работать будем в рабочей тетради Colab, так как это нам даёт замечательные преимущества: не надо устанавливать собственный сервер в Интернет и не надо перенастраивать домашний роутер.

Далее в рабочей тетради Colab проверяем версию Python. Чтобы операция выполнялась на уровне операционной системы (а не языка программирования), перед командой ставим восклицательный знак:

!python3 --version

Должны получить ответ вида:

Python 3.7.13

Для взаимодействия с Telegram API средствами языка Python разработаны несколько модулей. Самый простой из них — Telebot. Устанавливаем необходимый пакет:

!pip3 install pytelegrambotapi

В редчайших случаях, возможно, понадобится написать просто pip вместо pip3.

Задача 1. ЭХО

Сначала реализуем простейшего бота – для понимания процесса. Он будет получать от пользователя текстовое сообщение и возвращать его же. Используем код:

 

import telebot
# Создаем экземпляр бота
bot = telebot.TeleBot('Сюда вставить токен для идентификации бота')
# Функция, обрабатывающая команду /start
@bot.message_handler(commands=["start"])
def start(m, res=False):
bot.send_message(m.chat.id, 'Бот запущен. Начните общение с ним.')
# Получение сообщений от пользователя
@bot.message_handler(content_types=["text"])
def handle_text(message):
bot.send_message(message.chat.id, 'Вы написали: ' + message.text)
# Запускаем бота
bot.polling(none_stop=True, interval=0)

 

Для запуска бота в Colab нажимаем Ctrl+F9.

Если всё запустилось без ошибок, переходим в Telegram – проверять работу бота. Ищем бота по придуманному ранее адресу. Запускаем бота кнопкой «Запустить» (Start) или командой /start. При правильной работе бот возвращает сообщения отправителю один-в-один.

 

Задача 2. Бот-всезнайка

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

 

!pip3 install wikipedia

 

Используем следующий код и запустим его.

 

import telebot, wikipedia, re
# Создаем экземпляр бота
bot = telebot.TeleBot('Сюда вставить токен для идентификации бота')
# Выбираем русский язык в Wikipedia
wikipedia.set_lang("ru")
# Чистим текст статьи из Wikipedia и ограничиваем его тысячей символов
def getwiki(s):
try:
ny = wikipedia.page(s)
# Получаем первую тысячу символов
wikitext=ny.content[:1000]
# Разбиваем, считая точку разделителем
wikimas=wikitext.split('.')
# Отбрасываем всё после последней точки
wikimas = wikimas[:-1]
# Создаем пустую переменную для текста
wikitext2 = ''
# Проходимся по строкам, где нет знаков «равно» (то есть все, кроме заголовков)
for x in wikimas:
if not('==' in x):
# Если в строке осталось больше трех символов, добавляем ее
# к нашей переменной и возвращаем утерянные при разделении строк точки на место
if(len((x.strip()))>3):
wikitext2=wikitext2+x+'.'
else:
break
# Теперь при помощи регулярных выражений убираем разметку
wikitext2=re.sub('\([^()]*\)', '', wikitext2)
wikitext2=re.sub('\([^()]*\)', '', wikitext2)
wikitext2=re.sub('\{[^\{\}]*\}', '', wikitext2)
# Возвращаем текстовую строку
return wikitext2
# Обрабатываем исключение, которое мог вернуть модуль wikipedia при запросе
except Exception as e:
return 'В энциклопедии нет информации об этом'
# Функция, обрабатывающая команду /start
@bot.message_handler(commands=["start"])
def start(m, res=False):
bot.send_message(m.chat.id, 'Введите любое слово, чтобы узнать, что это такое!')
# Получение сообщений от пользователя
@bot.message_handler(content_types=["text"])
def handle_text(message):
bot.send_message(message.chat.id, getwiki(message.text))
# Запускаем бота
bot.polling(none_stop=True, interval=0)

 

Задача 3. БОТ С ДВУМЯ ВИРТУАЛЬНЫМИ КНОПКАМИ

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

Потребуется создать два файла: thinks.txt и facts.txt, которые содержат список сегодняшних новостей и афоризмы. Одна строка – одно утверждение. Лучше создать хотя бы три строки в каждом.

На данном этапе куда удобнее будет привязать Google drive (Гугл-диск) к Colab и загрузить туда текстовые документы.

Команда для привязки Гугл-диска:

from google.colab import drive
drive.mount('/content/drive')

Важно! Если использовать для этого бота тот же токен, что и для предыдущего, то, чтобы увидеть кнопки, потребуется перезапуск командой /start.

Внимание! Кнопки могут не появиться, поэтому для вывода информации нужно будет написать “Новость” или ”Афоризм”. В идеальном случае, попробуйте решить проблему самостоятельно.

 

import telebot
import random
from telebot import types
# Загружаем список интересных фактов
f = open(' Сюда вставить путь к файлу facts.txt, который лежит на Гугл-диске', 'r', encoding='UTF-8')
facts = f.read().split('\n')
f.close()
# Загружаем список поговорок
f = open('Сюда вставить путь к файлу thinks.txt, который лежит на Гугл-диске', 'r', encoding='UTF-8')
thinks = f.read().split('\n')
f.close()
# Создаем бота
bot = telebot.TeleBot('Сюда вставить токен для идентификации бота')
# Команда start
@bot.message_handler(commands=["start"])
def start(m, res=False):
# Добавляем две кнопки
markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
item1=types.KeyboardButton("Новость")
item2=types.KeyboardButton("Афоризм")
markup.add(item1)
markup.add(item2)
bot.send_message(m.chat.id, 'Нажми: \nНовость - для получения сегодняшних новостей\nАфоризм — для получения лучших афоризмов всех времён ', reply_markup=markup)
# Получение сообщений от клиента
@bot.message_handler(content_types=["text"])
def handle_text(message):
if message.text.strip() == 'Новость' :
answer = random.choice(facts)
elif message.text.strip() == 'Афоризм':
answer = random.choice(thinks)
# Отсылаем сообщение в чат пользователя
bot.send_message(message.chat.id, answer)
# Запускаем бота
bot.polling(none_stop=True, interval=0)

Задача 4. БОТ, ВЕДУЩИЙ КАНАЛ

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

 

Файл с анекдотами fun.txt загружаем на Гугл диск.

 

import telebot
import time
bot = telebot.TeleBot('Вставить токен')
# Адрес телеграм-канала, начинается с @
CHANNEL_NAME = '@адрес_тестового_канала'
# Загружаем список шуток
f = open('Сюда вставить путь к файлу fun.txt, который лежит на Гугл-диске', 'r', encoding='UTF-8')
jokes = f.read().split('\n')
f.close()
# Пока не закончатся шутки, посылаем их в канал
for joke in jokes:
bot.send_message(CHANNEL_NAME, joke)
# Делаем паузу в 30 секунд (можно указать любое время)
time.sleep(30)
bot.send_message(CHANNEL_NAME, "Анекдоты внезапно закончились")

 

Задача 5. ЧАТ-БОТ

Разработаем чат‑бота, который будет поддерживать диалог с пользователем. Для этого мы подготовим файл dialog.txt, содержащий строки с вопросами и ответами на них в следующей строке. Вопрос будем помечать специальным образом в начале строки - u:, как показано ниже.

 

 

u: Привет

Привет!

u: как зовут

Меня зовут Снежана.

u: как дела

Лучше всех!

 

Пример входного файла можно скачать тут.

 

Для поиска похожих вопросов используем модуль fuzzywuzzy, который позволяет сравнивать, насколько похожи между собой две строки. Естественно, этот модуль нужно установить:

 

!pip3 install fuzzywuzzy

 

!pip3 install python-Levenshtein

 

Подробнее про теорию работы можно прочитать по ссылке: https://habr.com/ru/post/491448/

 

Ниже приведен исходный код бота. После его запуска инициируем диалог с ботом словом «Привет». Естественно, это не искусственный интеллект, и набор его ответов ограничен фразами из фай­ла dialog.txt. Однако, чем больше входной файл, тем больше переписка с ботом будет напоминать осмысленный диалог.

 

import telebot
import os
from fuzzywuzzy import fuzz
bot = telebot.TeleBot('Сюда вставить токен для идентификации бота')
# Загружаем список фраз и ответов в массив
mas=[]
if os.path.exists('Сюда вставить путь к файлу dialog.txt, который лежит на Гугл диске'):
f=open('Сюда вставить путь к файлу dialog.txt, который лежит на Гуглoдиске', 'r', encoding='UTF-8')
for x in f:
if(len(x.strip()) > 2):
mas.append(x.strip().lower())
f.close()
# С помощью fuzzywuzzy определяем наиболее похожую фразу и выдаем в качестве ответа следующий элемент списка
def answer(text):
try:
text=text.lower().strip()
if os.path.exists('Сюда вставить путь к файлу dialog.txt, который лежит на Гугл-диске'):
a = 0
n = 0
nn = 0
for q in mas:
if('u: ' in q):
# Изучаем, насколько похожи две строки
aa=(fuzz.token_sort_ratio(q.replace('u: ',''), text))
if(aa > a and aa!= a):
a = aa
nn = n
n = n + 1
s = mas[nn + 1]
return s
else:
return 'Не смог'
except:
return 'Ошибка'
# Команда «Старт»
@bot.message_handler(commands=["start"])
def start(m, res=False):
bot.send_message(m.chat.id, 'Давай поболтаем. Например, напиши мне Привет!')
# Получение сообщений от клиента
@bot.message_handler(content_types=["text"])
def handle_text(message):
# Запись ответа
s=answer(message.text)
# Отправка ответа
bot.send_message(message.chat.id, s)
# Запускаем бота
bot.polling(none_stop=True, interval=0)

 

 

 

ВЫВОДЫ

Разработаны и запущены пять простых ботов, на примере которых научились принимать и отправлять сообщения, реализовывать ветвление и понимать неточные запросы.

 

Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top