Делаю бота на 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())