@Lertex

Aiogram бот выдаёт ошибку. TypeError: rezume() missing 1 required positional argument: 'message' что делать?

Создал callback
и мне надо впихнуть туда message: types.Message
но он мне пишет TypeError: rezume() missing 1 required positional argument: 'message'
если меняю всё точно так же. Помогите пж
Вот код:
from config import TOKEN
import sqlite3
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
from aiogram.types import  InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher import FSMContext

class rezume_(StatesGroup):
    fio = State()
    age = State()
    obrazovanie = State()
    opit = State()
    vacansiya = State()
    phone = State()

try:
    sqlite_connection = sqlite3.connect('sqlite_python.db')
    cursor = sqlite_connection.cursor()
    print("База данных успешно подключена к SQLite")

    sqlite_select_query = "select sqlite_version();"
    cursor.execute(sqlite_select_query)
    record = cursor.fetchall()
    print("Версия базы данных SQLite: ", record)

except sqlite3.Error as error:
    print("Ошибка при подключении к sqlite", error)

logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
kb = types.InlineKeyboardMarkup()
urlkb = InlineKeyboardMarkup(row_width=1)
channel_id ='тут есть'

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    userid = message.from_user.id
    username = message.from_user.username
    nick = message.from_user.first_name
    info = cursor.execute('SELECT * FROM users WHERE userid=?', (userid,))
    @dp.callback_query_handler(text="subs")
    async def subs_bd_check(call: types.CallbackQuery):
        user_channel_status = await bot.get_chat_member(chat_id='тут тоже есть' , user_id=userid)
        if user_channel_status["status"] != 'left':
            await call.answer(text="Спасибо, что подписались!", show_alert=True)

            if info.fetchone() is None:
                cursor.execute(f"""INSERT INTO users(userid, tag, username, is_adm) 
                               VALUES('{userid}', '{username}', '{nick}', '0');""")
                sqlite_connection.commit()
                btn1 = types.InlineKeyboardButton(text="Актуальные вакансии", callback_data="vac")
                btn2 = types.InlineKeyboardButton(text="Отправить резюме", callback_data="rezum")
                btn3 = types.InlineKeyboardButton(text="Оставить контактные данные", callback_data="cont")
                btn4 = types.InlineKeyboardButton(text="Отдел кадров", callback_data="kadr")
                kb.add(btn1, btn2, btn3, btn4)
                await bot.send_message(message.from_user.id, 'Отлично, выбери действие', reply_markup=kb)
            else:
                btn1 = types.InlineKeyboardButton(text="Актуальные вакансии", callback_data="vac")
                btn2 = types.InlineKeyboardButton(text="Отправить резюме", callback_data="rezum")
                btn3 = types.InlineKeyboardButton(text="Оставить контактные данные", callback_data="cont")
                btn4 = types.InlineKeyboardButton(text="Отдел кадров", callback_data="kadr")
                kb.add(btn1, btn2, btn3, btn4)
                await bot.send_message(message.from_user.id, 'Отлично, выбери действие', reply_markup=kb)
        else:
            await call.answer(text="Вы не подписались!", show_alert=True)

    if info.fetchone() is None:
        btn1 = InlineKeyboardButton('Подписаться', url='и тут есть')
        btn2 = types.InlineKeyboardButton(text="Я подписался", callback_data="subs")
        kb.add(btn1, btn2)
        await bot.send_message(message.from_user.id, "Привет! Чтобы начать пользоваться ботом, подпишись на наш канал!",
                               reply_markup=kb)
    else:
        btn1 = types.InlineKeyboardButton(text="Актуальные вакансии", callback_data="vac")
        btn2 = types.InlineKeyboardButton(text="Отправить резюме", callback_data="rezum")
        btn3 = types.InlineKeyboardButton(text="Оставить контактные данные", callback_data="cont")
        btn4 = types.InlineKeyboardButton(text="Отдел кадров", callback_data="kadr")
        kb.add(btn1, btn2, btn3, btn4)
        await bot.send_message(message.from_user.id, 'Отлично, выбери действие', reply_markup=kb)

@dp.callback_query_handler(text="rezum")
async def rezume(call: types.CallbackQuery, message: types.Message):
    await message.answer('Введите ваше ФИО')
    await rezume.fio.set()
    @dp.message_handler(state = rezume.fio)
    async def fio(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(fio = answer)

    await call.message.answer('Введите ваш возраст')
    await rezume.age.set()
    @dp.message_handler(state=rezume.age)
    async def age(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(age=answer)

    await call.message.answer('Введите ваше образование')
    await rezume.obrazovanie.set()
    @dp.message_handler(state=rezume.obrazovanie)
    async def obrazovanie(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(obrazovanie=answer)

    await call.message.answer('Введите ваш опыт работы')
    await rezume.opit.set()
    @dp.message_handler(state=rezume.opit)
    async def opit(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(opit=answer)

    await call.message.answer('На какую вакансию вы претендуете?')
    await rezume.vacansiya.set()
    @dp.message_handler(state=rezume.vacansiya)
    async def vacansiya(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(vacansiya=answer)

    await call.message.answer('Введите ваш контактный номер телефона')
    await rezume.phone.set()
    @dp.message_handler(state=rezume.phone)
    async def phone(message: types.Message, state: FSMContext):
        answer = message.text
        await state.update_data(vacansiya=answer)
        phone = await state.get_data('phone')
        fio = await state.get_data('fio')
        vacansiya = await state.get_data('vacansiya')
        opit = await state.get_data('opit')
        obrazovanie = await state.get_data('obrazovanie')
        age = await state.get_data('age')

        await bot.send_message(
            channel_id, f'Новая заявка! \nФИО: {fio}\nВозраст: {age}\nОбразование: {obrazovanie}\nОпыт работы: {opit}\n'
                        f'Претендует на вакансию: {vacansiya}\nНомер телефона: {phone}', parse_mode='None')
        await state.finish()
        await bot.send_message(message.from_user.id, 'Отлично! Ваше заявление отправлено, ожидайте обратной связи!', parse_mode='None')


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 1031 просмотр
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Потому что плохо читаем документацию. Потому что копипастим куски кода без понимания как они работают.

message_handler принимает один аргумент - Message.

callback_query_handler принимает один аргумент - CallbackQuery.

Тут зачем-то в callback_query_handler два аргумента - call и message. Но бот-то вызывает его так, как и требуется по документации - с одним аргументом. И python обоснованно жалуется, что второй аргумент (message) не передавался.

До кучи, никогда (НИКОГДА!) нельзя объявлять новые handler'ы внутри имеющихся. Это работает не так, как ты думаешь, и может вызвать очень забавные глюки. Вообще, я не знаю, где люди такому учатся, но на этом сайте с таким приходят регулярно.

Например...
Если есть в двух разных функциях-обработчиках "верхнего уровня" есть обработчики с одинаковым фильтром в декораторе (вариант: обработчики могут покрывать общее подмножество случаев), то бот зарегистрирует первым тот "суб-обработчик", для которого "верхнеуровневый обработчик" вызвался первым. В итоге другой обработчик не будет вызываться вообще никогда, а поведение бота может быть весьма неожиданным.


Далее, в обработчике надо ответить пользователю, установить следующее состояние и сразу же завершить работу этого обработчика. Всю дальнейшую обработку следует выполнять в следующих обработчиках. А сейчас в этом коде все вопросы задаются подряд в одной и той же функции по имени rezume подряд, безо всякого ожидания ответа от пользователя. Короче, сейчас в коде полная лажа, так работать не будет вообще никак.

PS: Слово "резюме" по-английски пишется совсем не так.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы