Вот мой telegram бот:
👉
import os
import asyncio
import logging
from collections import defaultdict
from dotenv import load_dotenv
from telethon import TelegramClient, events, Button

# Загрузка переменных окружения
load_dotenv()
API_ID = os.getenv("API_ID")
API_HASH = os.getenv("API_HASH")
BOT_TOKEN = os.getenv("BOT_TOKEN")
CHANNEL_ID = int(os.getenv("CHANNEL_ID"))
INTERIM_CHAT_ID = int(os.getenv("INTERIM_CHAT_ID"))
ALLOWED_USER_ID = int(os.getenv("ALLOWED_USER_ID"))

# Инициализация клиента
client = TelegramClient('bot', API_ID, API_HASH)
client.start(bot_token=BOT_TOKEN)

# Настройка логирования
logging.basicConfig(filename="bot.log", level=logging.INFO)

# Словари для хранения сообщений
pending_albums = {}
pending_messages = {}
grouped_messages = defaultdict(list)

ALBUM_TIMEOUT = 1.0

@client.on(events.NewMessage(func=lambda e: e.is_private and e.sender_id == ALLOWED_USER_ID))
async def handle_message(event):
    message = event.message

    if message.text and message.text.startswith('/'):
        return

    if message.grouped_id:
        group_id = str(message.grouped_id)
        grouped_messages[group_id].append(message)
        if len(grouped_messages[group_id]) == 1:
            asyncio.create_task(schedule_group_send(group_id))
    else:
        # Отправляем само сообщение в промежуточный канал
        sent_message = await client.send_message(
            INTERIM_CHAT_ID,
            message
        )

        # Создаём инлайн-кнопки
        buttons = [
            [
                Button.inline("✅ Отправить", data=f"send_message:{message.id}"),
                Button.inline("❌ Отменить", data=f"cancel_message:{message.id}")
            ]
        ]

        # Отправляем сообщение с кнопками
        buttons_message = await client.send_message(
            INTERIM_CHAT_ID,
            "Выберите действие для сообщения:",
            buttons=buttons
        )

        pending_messages[message.id] = {
            'interim_message': sent_message,
            'buttons_message_id': buttons_message.id,
            'sender_id': message.sender_id,
            'message': message
        }
    await event.delete()

async def schedule_group_send(group_id):
    await asyncio.sleep(ALBUM_TIMEOUT)
    if group_id in grouped_messages:
        messages = grouped_messages.pop(group_id)

        # Создаём списки для медиа и подписей
        media_list = [msg.media for msg in messages]
        caption = "\n".join([msg.text for msg in messages if msg.text])

        # Отправляем альбом в промежуточный канал как единое целое
        sent_messages = await client.send_file(
            INTERIM_CHAT_ID,
            media_list,
            caption=caption,
            silent=True
        )

        # Создаём инлайн-кнопки для альбома
        buttons = [
            [
                Button.inline("✅ Отправить", data=f"send_album:{group_id}"),
                Button.inline("❌ Отменить", data=f"cancel_album:{group_id}")
            ]
        ]

        # Отправляем сообщение с кнопками после альбома
        buttons_message = await client.send_message(
            INTERIM_CHAT_ID,
            "Выберите действие для альбома:",
            buttons=buttons
        )

        pending_albums[group_id] = {
            'message_ids': [msg.id for msg in sent_messages],
            'buttons_message_id': buttons_message.id,
            'sender_id': messages[0].sender_id,
            'messages': messages
        }

        # Удаляем исходные сообщения
        for msg in messages:
            await msg.delete()

@client.on(events.CallbackQuery)
async def callback_handler(event):
    data = event.data.decode('utf-8')
    if ':' not in data:
        return

    command, identifier = data.split(':', 1)

    if command in ['send_album', 'cancel_album']:
        pending = pending_albums.get(identifier)
        if not pending or pending['sender_id'] != event.sender_id:
            await event.answer("У вас нет доступа к этой функции.", alert=True)
            return

        if command == 'send_album':
            # Пересылаем все сообщения альбома из промежуточного канала в основной канал
            await client.forward_messages(
                CHANNEL_ID,
                pending['message_ids'],
                from_peer=INTERIM_CHAT_ID
            )

            # Удаляем сообщения альбома и кнопки
            await client.delete_messages(INTERIM_CHAT_ID, pending['message_ids'])
            await client.delete_messages(INTERIM_CHAT_ID, [pending['buttons_message_id']])
            del pending_albums[identifier]
            await event.answer("Альбом успешно отправлен в канал.", alert=True)

        elif command == 'cancel_album':
            # Удаляем сообщения альбома и кнопки
            await client.delete_messages(INTERIM_CHAT_ID, pending['message_ids'])
            await client.delete_messages(INTERIM_CHAT_ID, [pending['buttons_message_id']])
            del pending_albums[identifier]
            await event.answer("Отправка альбома отменена.", alert=True)

    elif command in ['send_message', 'cancel_message']:
        message_id = int(identifier)
        pending = pending_messages.get(message_id)
        if not pending or pending['sender_id'] != event.sender_id:
            await event.answer("У вас нет доступа к этой функции.", alert=True)
            return

        if command == 'send_message':
            # Пересылаем сообщение из промежуточного канала в основной канал
            await client.forward_messages(
                CHANNEL_ID,
                pending['interim_message'].id,
                from_peer=INTERIM_CHAT_ID
            )

            # Удаляем оба сообщения из промежуточного канала
            await client.delete_messages(INTERIM_CHAT_ID, [pending['interim_message'].id, pending['buttons_message_id']])
            del pending_messages[message_id]
            await event.answer("Сообщение отправлено в канал.", alert=True)

        elif command == 'cancel_message':
            # Удаляем оба сообщения
            await client.delete_messages(INTERIM_CHAT_ID, [pending['interim_message'].id, pending['buttons_message_id']])
            del pending_messages[message_id]
            await event.answer("Отправка отменена.", alert=True)

print("Бот запущен!")
client.run_until_disconnected()
👈
Как его пошагово шаг за шагом развернуть на PythonAnywhere 24/7. У меня есть .env, но нету requirements.txt, как его быстро сделать в терминале со всеми зависимостями➡️