使用aiogram 3.0开发Telegram Bot遭遇ModuleNotFoundError错误的解决求助
aiogram 3.0开发Telegram Bot遭遇ModuleNotFoundError错误的解决求助
昨天我在用aiogram 3.0开发一个Telegram机器人,已经把所有需要的库都装到虚拟环境(venv)里了,而且反复检查了好几遍。可每次运行代码都会报错,有没有大佬能帮忙看看啊!
报错信息
Exception has occurred: ModuleNotFoundError No module named 'aiogram' File "/home/nwlie/Giveaway/bot.py", line 2, in <module> from aiogram import Bot, Dispatcher, types ModuleNotFoundError: No module named 'aiogram'
我的代码
import asyncio import sqlite3 from datetime import datetime from aiogram import Bot, Dispatcher, types from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery, FSInputFile from aiogram.filters import CommandStart, Command from aiogram.fsm.storage.memory import MemoryStorage from aiogram.exceptions import TelegramBadRequest # ======================= # НАСТРОЙКИ # ======================= TOKEN = "YOUR_BOT_TOKEN" # Вставьте ваш токен ADMIN_IDS = {5042914354, 5871506949} # ID администраторов CHANNEL_ID = "@community_so2" # Канал для проверки подписки bot = Bot(token=TOKEN, parse_mode="HTML") storage = MemoryStorage() dp = Dispatcher(storage=storage) # ======================= # БАЗА ДАННЫХ # ======================= def init_db(): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users ( telegram_id INTEGER UNIQUE, username TEXT, coins INTEGER DEFAULT 0, invited_by INTEGER, blocked INTEGER DEFAULT 0 )''') c.execute('''CREATE TABLE IF NOT EXISTS raffles ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, description TEXT, image TEXT, end_date TEXT, participants TEXT DEFAULT '' )''') conn.commit() conn.close() def add_user(telegram_id, username, invited_by=None): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('SELECT * FROM users WHERE telegram_id = ?', (telegram_id,)) if not c.fetchone(): c.execute('INSERT INTO users (telegram_id, username, invited_by) VALUES (?, ?, ?)', (telegram_id, username, invited_by)) if invited_by: c.execute('UPDATE users SET coins = coins + 5 WHERE telegram_id = ?', (invited_by,)) c.execute('UPDATE users SET coins = coins + 2 WHERE telegram_id = ?', (telegram_id,)) conn.commit() conn.close() def update_coins(telegram_id, amount): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('UPDATE users SET coins = coins + ? WHERE telegram_id = ?', (amount, telegram_id)) conn.commit() conn.close() def add_participant(raffle_id, user_id): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('SELECT participants FROM raffles WHERE id = ?', (raffle_id,)) participants = c.fetchone()[0] if str(user_id) not in participants.split(","): participants += f",{user_id}" c.execute('UPDATE raffles SET participants = ? WHERE id = ?', (participants, raffle_id)) conn.commit() conn.close() # ======================= # ПРОВЕРКА ПОДПИСКИ # ======================= async def check_subscription(user_id): try: user_status = await bot.get_chat_member(CHANNEL_ID, user_id) return user_status.status in ["member", "administrator", "creator"] except: return False # ======================= # ХЭНДЛЕРЫ # ======================= @dp.message(CommandStart()) async def start_handler(message: Message): add_user(message.from_user.id, message.from_user.username) markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text=" Профиль", callback_data="profile")], [InlineKeyboardButton(text=" Розыгрыши", callback_data="raffles")] ]) await message.answer("Добро пожаловать! Выберите действие:", reply_markup=markup) @dp.callback_query(lambda c: c.data == "profile") async def profile_handler(callback: CallbackQuery): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('SELECT coins FROM users WHERE telegram_id = ?', (callback.from_user.id,)) coins = c.fetchone() if coins: await callback.message.edit_text(f" Ваш профиль:\n Баланс Coins: {coins[0]}") else: await callback.message.edit_text("Профиль не найден.") @dp.callback_query(lambda c: c.data == "raffles") async def raffles_handler(callback: CallbackQuery): conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('SELECT id, title, description FROM raffles') raffles = c.fetchall() if not raffles: await callback.message.edit_text(" Розыгрышей пока нет.") else: for raffle in raffles: await callback.message.answer(f" {raffle[1]}\n{raffle[2]}\n\nУчаствуйте!") conn.close() @dp.message(Command("admin")) async def admin_panel(message: Message): if message.from_user.id not in ADMIN_IDS: await message.reply("У вас нет доступа к этой панели.") return markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="➕ Создать розыгрыш", callback_data="create_raffle")], [InlineKeyboardButton(text=" Выдать Coins", callback_data="give_coins")], ]) await message.answer("Админ-панель:", reply_markup=markup) @dp.callback_query(lambda c: c.data == "create_raffle") async def create_raffle(callback: CallbackQuery): await callback.message.answer("Отправьте информацию о розыгрыше в формате:\n\n<Название>|<Описание>|<YYYY-MM-DD>") @dp.message(lambda m: "|" in m.text and m.from_user.id in ADMIN_IDS) async def save_raffle(message: Message): title, description, end_date = message.text.split("|") conn = sqlite3.connect('bot.db') c = conn.cursor() c.execute('INSERT INTO raffles (title, description, end_date) VALUES (?, ?, ?)', (title, description, end_date)) conn.commit() conn.close() await message.reply(f" Розыгрыш '{title}' создан!") # ======================= # ЗАПУСК БОТА # ======================= async def main(): init_db() await dp.start_polling(bot) if __name__ == '__main__': asyncio.run(main())
所有库都已经装在虚拟环境里了,而且这个虚拟环境也关联到机器人的文件夹了,但还是一直报错。😫 ChatGPT给的都是通用解决方案,根本没帮上忙。
备注:内容来源于stack exchange,提问作者Zero ZXC




