V
V
Valakasochkov212022-04-13 01:53:08
Python
Valakasochkov21, 2022-04-13 01:53:08

How to fix an error when clicking on a callback button?

I write on the VKBOTLE framework. I wanted to click on the callback button, but an error pops up:

ERROR:vkbottle:1 validation error for MessageEvent
object -> conversation_message_id
  field required (type=value_error.missing)
Traceback (most recent call last):
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/vkbottle/dispatch/base.py", line 22, in route
    await view.handle_event(event, ctx_api, self.state_dispenser)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/vkbottle/dispatch/views/abc/raw.py", line 46, in handle_event
    event_model = self.get_event_model(handler_basement, event)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/vkbottle/dispatch/views/bot/raw.py", line 33, in get_event_model
    return handler_basement.dataclass(**event)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/pydantic/main.py", line 331, in __init__
    raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for MessageEvent
object -> conversation_message_id
  field required (type=value_error.missing)


The code:
from vkbottle import *
from vkbottle.bot import *
from vkbottle import BaseStateGroup
from scripts.sendmail import send_code
import sqlite3
import random
import hashlib
import re
import json
import logging


class RegDataUser(BaseStateGroup):
    NICK = 0
    ID = 1
    PASSWORD = 2


class LoginDataUser(BaseStateGroup):
    LOGIN = 0
    PASSWORD = 1
    TOKEN = 2
    EMAIL = 3
    CODE = 4


bot = Bot("undefined")
logging.basicConfig(level=logging.INFO)
bot.labeler.vbml_ignore_case = True
ctx = CtxStorage()
connector = sqlite3.connect("data/users.db")
cursor = connector.cursor()

isUserInAcc = 0
tokenUser: str = None
clicks = 0

def md5sum(text: str) -> str:
    return hashlib.md5(text.encode("utf-8")).hexdigest()


@bot.on.private_message(text=["Начать", "Меню"])
async def start_handler(message: Message):
    if isUserInAcc == 0 and tokenUser == None:
        await message.answer("Тебя нет в списке! Напиши /reg для регистрации или /login для входа в аккаунт.")
    else:
        keyboard = (Keyboard(one_time=True)
                            .add(Callback(" Заработок", {"cmd": "moneymake"}), KeyboardButtonColor.POSITIVE)
                            .add(Callback(" Бонуска", {"cmd": "bonus"}), KeyboardButtonColor.POSITIVE)
                            .row()
                            .add(Callback("⛏ ️Майнинг", {"cmd": "moneymining"}), KeyboardButtonColor.NEGATIVE)
                            .add(Callback(" Игры", {"cmd": "games"}), KeyboardButtonColor.NEGATIVE)
                            .row()
                            .add(Callback(" Профиль", {"cmd": "profile"}), KeyboardButtonColor.PRIMARY)
                            .add(Callback(" Настройки", {"cmd": "settings"}), KeyboardButtonColor.PRIMARY)
                            .row()
                            .add(Callback("️ Магазин", {"cmd": "Магазин"}))
                            .get_json()
                             )
        await message.answer("Привет!", keyboard=keyboard)


@bot.on.private_message(lev="/reg")
async def regestr_handler_nick(message: Message):
    global isUserInAcc
    cursor.execute(
        f"""
        SELECT * FROM users
        WHERE vkid = {int(message.from_id)}
        """)
    vkid = cursor.fetchall()
    print(vkid, message.from_id)
    if vkid != [] or None:
        await message.answer("Ваш аккаунт уже зарегестрирован! Для того чтобы войти, напиши /login")
    else:
        await bot.state_dispenser.set(message.peer_id, RegDataUser.NICK)
        return "Введите ваш ник."


@bot.on.private_message(state=RegDataUser.NICK)
async def regestr_handler_id(message: Message):
    ctx.set("nick", message.text)
    await bot.state_dispenser.set(message.peer_id, RegDataUser.ID)
    return "Введите ваш ID."


@bot.on.private_message(state=RegDataUser.ID)
async def regestr_handler_password(message: Message):
    ctx.set("id", message.text)
    await bot.state_dispenser.set(message.peer_id, RegDataUser.PASSWORD)
    return "Введите пароль."


@bot.on.private_message(state=RegDataUser.PASSWORD)
async def regestr_handler_end(message: Message):
    global isUserInAcc
    token = ""
    for this in range(36):
        token = token + random.choice(list('1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ'))
    player = [int(message.from_id), ctx.get("id"), ctx.get("nick"), None, token, md5sum(message.text)]
    cursor.execute(
        """
        INSERT INTO users
        VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL)
        """, player)
    connector.commit()
    isUserInAcc = 1
    await bot.state_dispenser.delete(message.peer_id)
    del token, this
    return "Данные были сохранены! Удачной игры!"


@bot.on.private_message(lev="/login")
async def login_handler_nick(message: Message):
    global isUserInAcc
    if isUserInAcc == 1 and tokenUser != None:
        await bot.state_dispenser.delete(message.peer_id)
        await message.answer("Вы уже в аккаунте!")
    else:
        await bot.state_dispenser.set(message.peer_id, LoginDataUser.LOGIN)
        return "Введите ваш логин (ник)."


@bot.on.private_message(state=LoginDataUser.LOGIN)
async def login_handler_password(message: Message):
    ctx.set("lognick", message.text)
    await bot.state_dispenser.set(message.peer_id, LoginDataUser.PASSWORD)
    return "Введите пароль."


@bot.on.private_message(state=LoginDataUser.PASSWORD)
async def login_handler_token(message: Message):
    global checktck
    ctx.set("logpass", message.text)
    logindata = [ctx.get("lognick"), md5sum(ctx.get("logpass"))]
    print(logindata)
    cursor.execute(
        """
        SELECT * FROM users
        WHERE nick = ? AND password = ?
        """, logindata)
    data = cursor.fetchall()
    try:
        checktck = data[0][4]
    except:
        pass
    del logindata
    if data != [] or None:
        await bot.state_dispenser.set(message.peer_id, LoginDataUser.TOKEN)
        return "Введите токен от аккаунта. Если вы его потеряли или забыли, то напишите losttoken"
    else:
        await bot.state_dispenser.delete(message.peer_id)
        return "Ничего не удалось найти. Попробуйте ещё раз."
    del data


@bot.on.private_message(state=LoginDataUser.TOKEN)
async def login_handler_end(message: Message):
    global tokenUser, isUserInAcc
    msgtck = message.text
    if msgtck == "losttoken":
        await bot.state_dispenser.set(message.peer_id, LoginDataUser.EMAIL)
        return "Введите ваш электронный адрес почты, чтобы мы могли вам отправить код для захода в аккаунт."
    else:
        if checktck == msgtck:
            tokenUser = checktck
            isUserInAcc = 1
            return "Вы успешно вошли в аккаунт!"
        else:
            return "Вход в аккаунт не выполнен. Попробуйте ещё раз."
        await bot.state_dispenser.delete(message.peer_id)
        del msgtck


@bot.on.private_message(state=LoginDataUser.EMAIL)
async def login_handler_losttoken(message: Message):
    global code
    email = message.text
    pattern = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9][email protected][A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
    if re.fullmatch(pattern, email):
        code = str(random.randint(100000000, 999999999))
        send_code(code, email)
        await bot.state_dispenser.set(message.peer_id, LoginDataUser.CODE)
        await message.answer("Письмо с кодом отправлено! Напишите код для захода в аккаунт.")
    else:
        await bot.state_dispenser.delete(message.peer_id)
        await message.answer("Письмо с кодом не отправлено, проверьте написание своего адреса и повторите попытку.")
    del email, pattern


@bot.on.private_message(state=LoginDataUser.CODE)
async def login_handler_losttoken_end(message: Message):
    global tokenUser, isUserInAcc
    msgcode = message.text
    if msgcode == code:
        tokenUser = checktck
        isUserInAcc = 1
        await message.answer("Вы успешно вошли в аккаунт!")
    else:
        await message.answer("Повторите попытку. Войти в аккаунт не удалось.")
    await bot.state_dispenser.delete(message.peer_id)
    

@bot.on.raw_event(GroupEventType.MESSAGE_EVENT, dataclass=GroupTypes.MessageEvent)
async def event_handler(event: GroupTypes.MessageEvent):
    if event.object.payload["cmd"] == "moneymake":
        await bot.api.messages.send_message_event_answer(
            event_id=event.object.event_id,
            peer_id=event.object.peer_id,
            user_id=event.object.user_id,
            event_data=ShowSnackbarEvent(text=str(clicks)).json()
        )


bot.run_forever()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
K
Kadabrov, 2022-04-13
@Kadabrov

https://qna.habr.com/q/1133222

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question