You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动