import asyncio from aiogram import Bot, Dispatcher, types from aiogram.exceptions import TelegramAPIError from aiogram.utils.markdown import hbold import logging import json import os from aiogram.contrib.fsm_storage.memory import MemoryStorage logging.basicConfig(level=logging.INFO) BOT_TOKEN = "123" ADMIN_ID = 321 DATA_FILE = "new_users.json" bot = Bot(token=BOT_TOKEN) storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) def load_data(): if os.path.exists(DATA_FILE): with open(DATA_FILE, "r", encoding='utf-8') as f: try: return json.load(f) except json.JSONDecodeError: return {} else: return {} def save_data(data): with open(DATA_FILE, "w", encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) new_users = load_data() @dp.message_handler(commands=['start']) async def start(message: types.Message): username = message.from_user.first_name if message.from_user.username: username = "@" + message.from_user.username await message.answer(f"Привет, {hbold(username)}! \nЭто бот для демонстрации возможностей Telegram ботов. \nВы можете использовать команды /site и /website для перехода на сайт.") @dp.message_handler(commands=['site', 'website']) async def site(message: types.Message): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton('Перейти на сайт', url='https://Funpay.com/users/***/') markup.add(btn1) await message.answer('Перейдите по ссылке:', reply_markup=markup) @dp.message_handler(content_types=['photo']) async def get_photo(message: types.Message): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton('Перейти на сайт', url='https://Funpay.com/users/***/') btn2 = types.InlineKeyboardButton('Изменить текст', callback_data='edit') btn3 = types.InlineKeyboardButton('Удалить фото', callback_data='delete') markup.add(btn1, btn2, btn3) await message.answer('Какое красивое фото!', reply_markup=markup) @dp.callback_query_handler(lambda c: c.data and c.data.startswith('edit')) async def process_callback_edit(callback_query: types.CallbackQuery): try: await callback_query.message.edit_text('Измененный текст') await callback_query.answer() except TelegramAPIError as e: await callback_query.answer(f"Ошибка: {e}") logging.error(f"Ошибка редактирования сообщения: {e}") @dp.callback_query_handler(lambda c: c.data and c.data.startswith('delete')) async def process_callback_delete(callback_query: types.CallbackQuery): try: await bot.delete_message(callback_query.message.chat.id, callback_query.message.message_id - 1) await callback_query.answer() except TelegramAPIError as e: await callback_query.answer(f"Ошибка: {e}") logging.error(f"Ошибка удаления сообщения: {e}") @dp.message_handler() async def handle_all_messages(message: types.Message): user_id = message.from_user.id if user_id not in new_users: new_users[user_id] = True try: await bot.send_message(ADMIN_ID, f"Новый пользователь: {message.from_user.first_name} ({user_id}) написал: {message.text}") except TelegramAPIError as e: logging.error(f"Ошибка отправки сообщения администратору: {e}") logging.info(f"New user: {message.from_user.first_name} ({user_id}) sent: {message.text}") save_data(new_users) async def main(): await dp.start_polling(skip_updates=True) if name == 'main': asyncio.run(main()) Ошибка: line 8, in <module> from aiogram.contrib.fsm_storage.memory import MemoryStorage # Импортируем MemoryStorage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ModuleNotFoundError: No module named 'aiogram.contrib.fsm_storage' Токены специально убрал.
from aiogram.fsm.storage.memory import MemoryStorage Code from aiogram.fsm.storage.memory import MemoryStorage
установи pip install aiogram - это для начала, свою ошибку библи замени на эту from aiogram.fsm.state import State, StatesGroup