Answer the question
In order to leave comments, you need to log in
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)
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
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question