Создание Telegram бота на Python для признаний в любви

Используем свои знания Python для достижения счастья в личной жизни.

Мы постоянно слышим о людях, использующих программирование, чтобы анализировать эффективность определенных лекарств, делать выводы, оценивать профили клиентов, делать прогнозы, узнавать, сколько будет стоить недвижимость через 10 лет. Этот список можно продолжать до бесконечности.

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

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

Получение API ключа для Telegram бота от BotFather

Для создания бота я использую язык программирования Python.

Как известно большинству программистов, для взаимодействия с внешним сайтом или приложением нам понадобится ключ интерфейса прикладного программирования (API ключ). В нашем случае он нужен, чтобы Python мог общаться с Telegram.

Перед этим нам нужно будет создать бота в Telegram. Для этого в приложении Telegram найдите бота под названием «BotFather».

После запуска бота нам будет показан список всех доступных команд. Для создания нового бота нужно использовать команду /newbot.

Далее BotFather предложит вам ввести имя для вашего бота. Обратите внимание на то, что именно по этому имени люди будут искать ваш бот в Телеграм. Впрочем, впоследствии вы сможете это имя менять.

python logo

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

×

Указав имя бота, нужно задать имя пользователя. Оно должно оканчиваться на слово bot, то есть быть в формате xxxbot. Заметьте, что изменить это имя в дальнейшем будет нельзя.

Как только ваш бот будет создан, вы сможете найти его в Telegram по имени (в моем случае это myfirstbot123).

Далее нам надо скопировать куда-нибудь в безопасное место уникальный токен, предоставленный нам для управления ботом при помощи API.

Интеграция Python с Telegram

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

Мы применим библиотеку python-telegram-bot. Эта библиотека использует модуль logging, который сперва надо настроить. А затем мы сохраним в коде наш API ключ Telegram.

# импортируем необходимые библиотеки
import logging
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler, CallbackContext
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
# настраиваем модуль logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# сохраняем наш api токен
TOKEN = 'INSERT YOUR TOKEN HERE!'

Далее зададим несколько функций, которые помогут нам начать работу с нашим ботом.

Первая необходимая команда — это /start. Эта команда выполняется, когда пользователь запускает бот. Для простоты давайте при запуске бота просто вернем сообщение «Testing 123». Мы встраиваем это сообщение с помощью метода update.message.reply_text. Благодаря этому всякий раз, получая команду или сообщение, наш бот будет отвечать на него текстом.

То же самое мы делаем для команды /hello, которая возвращает сообщение Hello World! и смайлик 😀, как только пользователь запустит ее. Справочник по юникодам эмодзи вы можете найти здесь. Обратите внимание, что для облегчения отладки я также настроил регистратор ошибок, чтобы мне всегда показывалось сообщение об ошибке.

def start(update, context):
    # посылает сообщение в ответ на команду /start
    update.message.reply_text('Testing 123')
    
def hello(update, context):
    # посылает сообщение в ответ на команду /hello 
    update.message.reply_text('Hello World! \U0001F600')
# для отладки
def error(update, context):
    logger.warning('Update "%s" caused error "%s"', update, context.error)

На последнем шаге создадим функцию main(). Метод Updater считает наш API-ключ и зарегистрирует все обработчики, которые мы настроили для нашего бота. Обратите внимание, что для каждой команды, которую мы собираемся создать, нам нужно будет добавить обработчик этой самой команды. Бот запустится при запуске updater.start_polling().

# to start the bot
def main():
    # setup updating together with our telegram api token
    updater = Updater(TOKEN, use_context=True)
# get the dispatcher to register handlers
    dp = updater.dispatcher
# add command handlers for different command
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("hello", hello))
# error logging
    dp.add_error_handler(error)
# start the bot
    updater.start_polling()
# set the bot to run until you force it to stop
    updater.idle()
if __name__ == '__main__':
    main()

Собрав все воедино, протестируем нашего бота в Telegram. Запускаем бота и получаем сообщение Testing123. Аналогично, в ответ на команду /hello мы получаем сообщение Hello World! 😀.

Программируем кнопку yes/no

В случае признания в любви мы ждем однозначного ответа: «да» или «нет». Пока что наш Telegram бот может возвращать сообщения только после того, как пользователь выполнит определенную команду. Есть ли у бота возможность отображать меню, чтобы пользователь мог выбрать и нажать нужную кнопку? Да, в Telegram боте есть такая функция. Она так и называется — buttons (кнопки).

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

Приведенный ниже код даст нашему боту возможность отобразить вопрос “BE MY GIRL OK?” (думаю, эти слова любви в переводе не нуждаются — прим. переводчика) вместе с двумя кнопками «YES» и «NO» при запуске команды /confession. Не забудьте добавить обработчик этой команды в основной код функции, как указано выше.

# отображение кнопки
def confession(update, context: CallbackContext)-> None:
    keyboard = [
        [InlineKeyboardButton("Yes", callback_data='yes'),
        InlineKeyboardButton("No", callback_data='no')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text('BE MY GIRL OK?', reply_markup=reply_markup)
dp.add_handler(CommandHandler("confession", confession))

Как можно увидеть из данного скриншота, сообщение “BE MY GIRL OK?” отображается вместе с двумя кнопками.

Нажатие на эти кнопки в настоящий момент нам ничего не даст, поскольку мы этот процесс еще не настроили. Для этого мы настроим другую команду — /confession_reply. Она будет работать в зависимости от нажатия пользователем определенных кнопок (а именно «YES» или «NO»), используя программный синтаксис if-else.

Если пользователь нажимает Yes, то мы отвечаем вот таким вот эмодзи: 👫💝.

В ответе на нажатие No я позволил себе некоторую дерзость. Мой ответ будет: “Please try again, we make typing errors sometimes 😤 (Пожалуйста, попробуйте еще раз, ведь мы иногда делаем опечатки)”.

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

def confession_reply(update, context):
    query = update.callback_query
    if query.data == 'yes':
        context.bot.edit_message_text(chat_id=query.message.chat_id,
                        message_id=query.message.message_id,
                        text='\U0001F46B\U0001F49D', disable_web_page_preview = 0)
    else:
        context.bot.edit_message_text(chat_id=query.message.chat_id,
                        message_id=query.message.message_id,
                        text='Please try again, we make typing errors sometimes \U0001F624' , disable_web_page_preview = 0)
dp.add_handler(CallbackQueryHandler(confession_reply))

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

Размещение Telegram бота (необязательно)

Эта часть в принципе является необязательной. Но до сих пор мы запускали нашего бота с локального компьютера, а это значит, что как только мы его выключим, он прекратит свою работу. Чтобы решить эту проблему, нам нужно разместить нашего бота на облачном сервере, которой обеспечит его бесперебойную работу в режиме 24/7. И когда придет время свидания, он нас не подведет.

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

Идея признания в любви

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

Как видно на моем скриншоте ниже, после запуска команды /start будет отображаться приветственное сообщение и список команд, в которых первые 10 будут отвечать на сообщения, а последняя будет командой с кнопками, с помощью которой я и задам решающий вопрос.

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

И вы также можете задаться вопросом, почему названия команд такие странные, например как /sob, /banhmi или даже /potato? И почему между командами такие странные интервалы? Ответ дается в моей последней команде /throwback .

Как видно из последнего скриншота, я дал командам такие имена, чтобы из их последних букв сложилась фраза: “BE MY GIRL OK?”. Чтобы к тому моменту, когда моя подруга уже догадается об истинном смысле этого бота, она нажала на последнюю команду /semolaide (на китайском языке это значит «Что это») и получила решающий вопрос.

Заключение

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

Всем удачи!

Перевод статьи «Building a Telegram Bot with Python for a love confession».