Содержание статьи
Python для новичков
Если ты совсем не ориентируешься в Python, то отличным началом будет прочтение трех вводных статей, которые я публиковал в «Хакере» этим летом, либо посещение курса «Python для новичков», который я начну вести для читателей «Хакера» уже совсем скоро — 30 ноября.
Чтобы создать бота, нам нужно дать ему название, адрес и получить токен — строку, которая будет однозначно идентифицировать нашего бота для серверов Telegram. Зайдем в Telegram под своим аккаунтом и откроем «отца всех ботов», BotFather.
Жмем кнопку «Запустить» (или отправим /
), в ответ BotFather пришлет нам список доступных команд:
-
/
— создать нового бота;newbot -
/
— редактировать ваших ботов;mybots -
/
— сменить имя бота;setname -
/
— изменить описание бота;setdescription -
/
— изменить информацию о боте;setabouttext -
/
— изменить фото аватарки бота;setuserpic -
/
— изменить список команд бота;setcommands -
/
— удалить бота.deletebot
Отправим бате‑боту команду /
, чтобы создать нового бота. В ответ он попросит ввести имя будущего бота, его можно писать на русском. После ввода имени нужно будет отправить адрес бота, причем он должен заканчиваться на слово bot. Например, xakepbot
или xakep_bot
. Если адрес будет уже кем‑то занят, BotFather начнет извиняться и просить придумать что‑нибудь другое.
Когда мы наконец найдем свободный и красивый адрес для нашего бота, в ответ получим сообщение, в котором после фразы Use this token to access the HTTP API будет написана строка из букв и цифр — это и есть необходимый нам токен. Сохраним ее где‑нибудь на своем компьютере, чтобы потом использовать в скрипте бота.
Для взаимодействия с Telegram API есть несколько готовых модулей. Самый простой из них — Telebot. Чтобы установить его, набери
pip install pytelegrambotapi
В Linux, возможно, понадобится написать pip3
вместо pip
, чтобы указать, что мы хотим работать с третьей версией Python.
Эхо-бот
Для начала реализуем так называемого эхо‑бота. Он будет получать от пользователя текстовое сообщение и возвращать его.
import telebot# Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather')# Функция, обрабатывающая команду /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)
Запускай скрипт и ищи в поиске Telegram своего бота по адресу, который ты придумал ранее. Запускаем бота кнопкой «Запустить» (Start) или командой /
и можем убедиться в том, что он работает и возвращает сообщения.
Wikipedia-бот
Давай научим нашего бота не просто отсылать сообщения обратно, а чему‑нибудь поинтереснее. Например, по введенному слову давать статью на Википедии. Здесь нам поможет модуль Wikipedia:
pip install wikipedia
Готовим код.
import telebot, wikipedia, re# Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather')# Устанавливаем русский язык в Wikipediawikipedia.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, 'Отправьте мне любое слово, и я найду его значение на Wikipedia')# Получение сообщений от юзера@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)
www
При создании следующих ботов мы будем использовать несколько текстовых файлов с контентом. Скачать их можно с моего сайта.
Бот с двумя виртуальными кнопками
Во многих Telegram-ботах для выбора каких‑то действий используются так называемые виртуальные кнопки. Давай попробуем сделать себе такие же!
Предположим, что у нас есть два файла facts.
и thinks.
, которые содержат список интересных фактов и поговорки. На каждой строке файлов находится по одному факту или поговорке.
Сделаем бота, в котором будут две кнопки: «Факты» и «Поговорки». Если нажать любую, бот отправит пользователю соответствующее сообщение.
info
Если ты будешь использовать для этого бота тот же токен, что и для предыдущего, то, чтобы увидеть кнопки, перезапусти бота командой /
.
import telebotimport randomfrom telebot import types# Загружаем список интересных фактовf = open('data/facts.txt', 'r', encoding='UTF-8')facts = f.read().split('\n')f.close()# Загружаем список поговорокf = open('data/thinks.txt', 'r', encoding='UTF-8')thinks = f.read().split('\n')f.close()# Создаем ботаbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Команда 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): # Если юзер прислал 1, выдаем ему случайный факт if message.text.strip() == 'Факт' : answer = random.choice(facts) # Если юзер прислал 2, выдаем умную мысль elif message.text.strip() == 'Поговорка': answer = random.choice(thinks) # Отсылаем юзеру сообщение в его чат bot.send_message(message.chat.id, answer)# Запускаем ботаbot.polling(none_stop=True, interval=0)
Бот, ведущий Telegram-канал с анекдотами
Предыдущие боты посылали юзеру сообщения тогда, когда получали от него команды или фразы. Но что, если нам нужен бот, который будет периодически и в автоматическом режиме постить что‑то в наш канал?
Давай сделаем бота, который получает список анекдотов из файла и каждый час постит в канал один из этих анекдотов. Для этого нам нужно создать свой канал в Telegram, добавить в подписчики канала нашего бота и назначить его администратором канала с правом публиковать сообщения.
Файл с анекдотами должен лежать в папке data
рядом со скриптом бота.
import telebotimport time# Токен, который выдает @botfatherbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Адрес телеграм-канала, начинается с @CHANNEL_NAME = '@адрес_твоего_канала'# Загружаем список шутокf = open('data/fun.txt', 'r', encoding='UTF-8')jokes = f.read().split('\n')f.close()# Пока не закончатся шутки, посылаем их в каналfor joke in jokes: bot.send_message(CHANNEL_NAME, joke) # Делаем паузу в один час time.sleep(3600)bot.send_message(CHANNEL_NAME, "Анекдоты закончились :-(")
Чат-бот «Маша»
Теперь давай сделаем простейшего чат‑бота, который будет болтать с пользователем. Для этого мы подготовим файл boltun.
, содержащий строки с вопросами (в начале таких строк поставим метку u:
) и ответами на них в следующей строке.
u: как зовутМаша меня зовут!u: сколько тебе летМне уже 18, честно-честно!
Файл boltun.
поместим в папку data
рядом со скриптом бота. Для поиска похожих вопросов используем модуль fuzzywuzzy, который позволяет сравнивать, насколько похожи между собой две строки. Естественно, сперва этот модуль нужно установить:
pip install fuzzywuzzypip install python-Levenshtein
Ниже приведен исходный код бота. После его запуска напиши боту «Привет» и попробуй с ним пообщаться. Естественно, это не искусственный интеллект и набор его ответов ограничен фразами из файла boltun.
.
import telebotimport osfrom fuzzywuzzy import fuzz# Создаем бота, пишем свой токенbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Загружаем список фраз и ответов в массивmas=[]if os.path.exists('data/boltun.txt'): f=open('data/boltun.txt', '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('data/boltun.txt'): a = 0 n = 0 nn = 0 for q in mas: if('u: ' in q): # С помощью fuzzywuzzy получаем, насколько похожи две строки 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): # Запись логов f=open('data/' + str(message.chat.id) + '_log.txt', 'a', encoding='UTF-8') s=answer(message.text) f.write('u: ' + message.text + '\n' + s +'\n') f.close() # Отправка ответа bot.send_message(message.chat.id, s)# Запускаем ботаbot.polling(none_stop=True, interval=0)
Выводы
Мы написали пять простых ботов, на примере которых научились принимать и отправлять сообщения, делать кнопки и понимать неточные запросы.
В следующей статье мы рассмотрим работу с Telegram-ботами более подробно: научимся делать ботов, работающих через веб‑хуки, принимать оплату от пользователей и взаимодействовать с базой данных SQLite.
Также призываю тебя не откладывать и записываться на курс «Python для новичков», где мы от простейших понятий перейдем к созданию первых интересных проектов. Стартуем уже совсем скоро!
Курс по Python
Курс «Python с нуля» направлен на изучение основ и базовых концепций программирования. После него ты сможешь легко углубиться в любую из ИТ‑сфер: веб‑разработку, анализ данных, безопасность приложений и так далее. Продолжительность курса — два календарных месяца. Уроки будут проводиться два раза в неделю (вторник и четверг, ориентировочно в 17:00 по Москве), каждый по одному академическому часу. Периодически будут выдаваться домашние задания.