semenovstyle
@semenovstyle

Не могу победить ошибку при запуске бота?

Делаю бота на aiogram 3. 3 при запуске висит ошибка в консоли, VS ошибок не видит. Уже кучу методов перепробовал.
Ошибка из консоли
Traceback (most recent call last):
  File "C:\Users\user1\Desktop\prizma_bot\app.py", line 21, in <module>
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True).add(contact_admin_button)
  File "C:\Users\user1\AppData\Local\Programs\Python\Python39\lib\site-packages\pydantic\main.py", line 164, in __init__
    __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__)
pydantic_core._pydantic_core.ValidationError: 1 validation error for ReplyKeyboardMarkup
keyboard
  Field required [type=missing, input_value={'resize_keyboard': True}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.5/v/missing
Для продолжения нажмите любую клавишу . . .


import logging
from typing import Text
from aiogram.filters import Command
import aiosqlite
from aiogram import Bot, Dispatcher, types
from aiogram.types import ReplyKeyboardRemove, \
    ReplyKeyboardMarkup, KeyboardButton, \
    InlineKeyboardMarkup, InlineKeyboardButton

API_TOKEN = ''
ADMIN_ID = ''  # ID администратора

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)

dp = Dispatcher()

# кнопкоа "Связаться с администратором"
contact_admin_button = KeyboardButton(text='Связаться с администратором')
keyboard = ReplyKeyboardMarkup(resize_keyboard=True).add(contact_admin_button)

# Кнопка-ссылка на сайт
inline_button = InlineKeyboardButton(text="Перейти на сайт", url="https://example.com")
inline_keyboard = InlineKeyboardMarkup().add(inline_button)

# подключение к базе данных и таблицу для сообщений
async def init_db():
    async with aiosqlite.connect('bot_messages.db') as db:
        await db.execute('''
            CREATE TABLE IF NOT EXISTS messages (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER,
                user_name TEXT,
                message TEXT,
                bot_reply TEXT,
                timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        ''')
        await db.commit()

# Функция для сохранения сообщений в базу данных
async def log_message(user_id, user_name, message_text, bot_reply):
    async with aiosqlite.connect('bot_messages.db') as db:
        await db.execute('''
            INSERT INTO messages (user_id, user_name, message, bot_reply)
            VALUES (?, ?, ?, ?)
        ''', (user_id, user_name, message_text, bot_reply))
        await db.commit()

# Обработчик команды /start
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
    bot_reply = "Привет! Если нужно связаться с администратором, нажми кнопку ниже."
    await message.answer(bot_reply, reply_markup=keyboard)
    
    # Логирование запроса и ответа
    await log_message(message.from_user.id, message.from_user.full_name, message.text, bot_reply)

# Обработчик нажатия кнопки "Связаться с администратором"
@dp.message(Text(text="Связаться с администратором"))
async def contact_admin(message: types.Message):
    bot_reply = "Ваше сообщение отправлено администратору. Ожидайте ответа."
    
    # Отправка сообщения админу
    await bot.send_message(ADMIN_ID, f"Пользователь {message.from_user.full_name} хочет связаться с вами.")
    
    # Ответ пользователю
    await message.answer(bot_reply)
    
    # Логирование запроса и ответа
    await log_message(message.from_user.id, message.from_user.full_name, message.text, bot_reply)

# Запуск бота
async def main():
    await init_db()  # Инициализация базы данных
    await dp.start_polling(bot)

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
@Everything_is_bad
У ReplyKeyboardMarkup параметр keyboard обязательный, читай доки или гугли хотя бы примеры.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы