import asyncio
import logging
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import CommandStart, Command
from aiogram.types import Message
from aiogram import Router
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from config import TOKEN
# Логирование
logging.basicConfig(level=logging.INFO)
# ID администратора
ADMIN_ID = **********
# Файл для хранения ID пользователей
USERS_FILE = "users.txt"
# Инициализация бота
bot = Bot(token=TOKEN)
dp = Dispatcher()
router = Router()
# Состояния FSM
class States(StatesGroup):
broadcast = State()
def save_user_id(user_id):
"""Сохраняет ID пользователя в файл."""
with open(USERS_FILE, "a+", encoding="utf-8") as f:
f.seek(0)
if str(user_id) not in f.read():
f.write(f"{user_id}\n")
def get_user_ids():
"""Возвращает список ID пользователей из файла."""
try:
with open(USERS_FILE, "r", encoding="utf-8") as f:
return [int(line.strip()) for line in f]
except FileNotFoundError:
return []
# Обработчик команды /start
@router.message(CommandStart())
async def cmd_start(message: Message, state: FSMContext):
user_id = message.from_user.id
save_user_id(user_id)
await message.answer("Привет! Ты зарегистрирован для получения рассылки.")
# Обработчик команды /admin
@router.message(Command("admin"))
async def cmd_admin(message: Message, state: FSMContext):
user_id = message.from_user.id
if user_id == ADMIN_ID:
await state.set_state(States.broadcast)
await message.answer("Введите текст для рассылки:")
else:
await message.answer("У вас нет прав доступа.")
# Обработчик текста для рассылки
@router.message(F.state == States.broadcast)
async def process_broadcast(message: Message, state: FSMContext):
text = message.text
await state.finish()
print(f"Получен текст для рассылки: {text}")
for user_id in get_user_ids():
try:
await bot.send_message(chat_id=user_id, text=text)
print(f"Сообщение отправлено пользователю {user_id}")
except Exception as e:
print(f"Ошибка при отправке сообщения пользователю {user_id}: {e}")
await message.answer(f"Рассылка отправлена!")
# Регистрация роутера
dp.include_router(router)
# Запуск бота
async def main():
await dp.start_polling(bot)
if __name__ == '__main__':
asyncio.run(main())