Теперь у вас есть готовый бот, который будет отправлять комплименты вашей второй половинке. Показываем, как его сделать и использовать.
941 открытий5К показов
Помните, как много лет назад мы бегали в канцелярские за самыми милыми валентинками? Сейчас можно не бегать — за вас все сделает бот. Можно даже не искать картинки для WhatsApp.
Рассказываем, как написать такого Типичного пикапера на фреймворке Aiogram, который порадует вашу вторую половинку красивыми айтишными (и не только) словами. Можете взять наш код и написать свои комплименты, а если погрязли в дедлайнах, то забирайте фичу в конце статьи.
Шаг 1: регистрируем бота
Открываем бота-батю, простите, @BotFather в Telegram, регистрируем нашего бота и получаем токен:
Тут же даем ему имя. У нас это — Типичный пикапер. Также здесь загружаем аватарку, создаем короткое имя (оно будет отображаться в виде ссылки и username) и пишем два описания:
about — то, что будет отображаться в профиле бота
description — то, что отображается, когда вы первый раз заходите в бота
Первым делом копируем токен в .env файл в формате:
TOKEN=111111:AAAAAAAAAAAAAAAAAAA
Далее заполняем файл зависимостей requirements.txt. Нам понадобятся всего два пакета:
aiogram — для взаимодействия с Telegram API
python-decouple — для импорта токена из .env файл.
Теперь открываем терминал и устанавливаем зависимости из файла:
pip install -r requirements.txt
Когда все зависимости установлены, можно приступать к написанию кода для бота.
В файле /config/__init__.py импортируем библиотеку decouple для работы с токеном из .env файла, а также добавим 2 словаря для хранения состояний.
from decouple import config
BOT_TOKEN = config('TOKEN')
# словари для хранения состояний
compliment_tasks = {}
current_indices = {}
В файле /utils/compliments.py добавим словарь с комплиментами:
COMPLIMENTS = [
"Ты — моя главная зависимость, без которой не компилируется этот день ",
"Даже самый мощный процессор не справится с вычислением моей любви к тебе ",
"Ты — тот редкий баг, который не хочется исправлять, а хочется любить ещё больше "
]
Здесь лишь небольшой список комплиментов, а чтобы увидеть все придуманные нами комплименты — запускайте нашего бота.
В файле handlers/user.py напишем функции для отправки комплиментов, выбора интервала отправки и обработки нажатия кнопок “start” и “stop”:
import asyncio
from aiogram import types
from aiogram import Bot
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from config import compliment_tasks, current_indices
from keyboards.reply import get_stop_keyboard, get_interval_keyboard
from utils.compliments import COMPLIMENTS
from config import BOT_TOKEN
bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
# функция отправки комплиментов
async def send_periodic_compliments(chat_id: int, interval_hours: int):
while current_indices[chat_id] < len(COMPLIMENTS):
if chat_id not in compliment_tasks:
break
compliment = COMPLIMENTS[current_indices[chat_id]]
await asyncio.sleep(interval_hours * 3600)
await bot.send_message(chat_id, compliment)
current_indices[chat_id] += 1
if chat_id in compliment_tasks:
del compliment_tasks[chat_id]
del current_indices[chat_id]
# функция для выбора интервала отправки
async def process_interval_choice(callback: types.CallbackQuery):
chat_id = callback.message.chat.id
interval_hours = int(callback.data.split("_")[1])
if chat_id not in current_indices:
current_indices[chat_id] = 0
if chat_id in compliment_tasks:
compliment_tasks[chat_id].cancel()
await bot.send_message(chat_id, COMPLIMENTS[current_indices[chat_id]],
reply_markup=get_stop_keyboard())
current_indices[chat_id] += 1
task = asyncio.create_task(
send_periodic_compliments(chat_id, interval_hours)
)
compliment_tasks[chat_id] = task
await callback.answer(f"Установлен интервал: {interval_hours} час(ов)")
await callback.message.delete()
# функция для команды /start
async def cmd_start(message: types.Message):
chat_id = message.chat.id
if chat_id in current_indices:
del current_indices[chat_id]
await message.answer(
f"Привет, {message.from_user.full_name}!\n\n"
"На связи пикап-бот от медиа Tproger — он будет отправлять тебе айтишные комплименты."
" Не отключай уведомления и наслаждайся 14-м февраля!❤️"
)
await message.answer(
"Выбери, как часто ты хочешь получать комплименты:",
reply_markup=get_interval_keyboard()
)
# функция обработки кнопки stop
async def handle_stop(message: types.Message):
if message.chat.id in compliment_tasks:
compliment_tasks[message.chat.id].cancel()
del compliment_tasks[message.chat.id]
await message.answer(
"Отправка комплиментов остановлена. Выбери новый интервал:",
reply_markup=get_interval_keyboard()
)
# функция обработки кнопки start
async def handle_start(message: types.Message):
await message.answer(
"Выбери, как часто ты хочешь получать комплименты:",
reply_markup=get_interval_keyboard()
)
В файле keyboards/reply.py реализуем функции «клавиатуры» для кнопок “start” и “stop” и inline-кнопок для выбора интервала отправки:
from aiogram import types
from aiogram.utils.keyboard import InlineKeyboardBuilder
# функция клавиатуры с кнопкой stop
def get_stop_keyboard():
keyboard = [[types.KeyboardButton(text="stop")]]
return types.ReplyKeyboardMarkup(keyboard=keyboard, resize_keyboard=True)
# функция клавиатуры с кнопкой stop
def get_start_keyboard():
keyboard = [[types.KeyboardButton(text="start")]]
return types.ReplyKeyboardMarkup(keyboard=keyboard, resize_keyboard=True)
# функция inline-клавиатуры с кнопками выбора интервала
def get_interval_keyboard():
builder = InlineKeyboardBuilder()
builder.button(text="Каждый час", callback_data="interval_1")
builder.button(text="Каждые 3 часа", callback_data="interval_3")
builder.button(text="Каждые 6 часов", callback_data="interval_6")
builder.adjust(1)
return builder.as_markup()
Теперь напишем основной файл работы бота bot.py:
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.filters.command import Command
from config import BOT_TOKEN
from handlers.user import cmd_start, process_interval_choice, handle_stop, handle_start
# уровень логированиря
logging.basicConfig(level=logging.INFO)
bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
dp = Dispatcher(storage=MemoryStorage())
# функция регистрации хэндлеров
def register_handlers():
dp.message.register(cmd_start, Command("start"))
dp.message.register(handle_stop, lambda message: message.text == "stop")
dp.message.register(handle_start, lambda message: message.text == "start")
dp.callback_query.register(process_interval_choice, lambda c: c.data.startswith("interval_"))
# функция запуска бота
async def main():
register_handlers()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Поздравляем, вы великолепны! Делайте своего бота с кастомными комплиментами или сразу забирайте нашего по ссылке и поднимайте настроение своим любимым.
24 января в Рунете вновь произошёл масштабный сбой — третий за январь. Проблемы с доступом наблюдались у пользователей Telegram, WhatsApp, Steam и операторов связи, таких как МегаФон, МТС и Tele2