Как нажать на кнопку VK на python?

kyurew

Участник
Автор темы
84
55
У некоторых ботов в вк есть такие кнопки для управления ими:
1690023376706.png
При нажатии на одну из них, отправляется сообщение с текстом, который написан в этой кнопке. Мне нужно нажать на неё, я пробовал с просто написать сообщение с тем, что написано в кнопке, но бот как-то понимает, что я написал это, а не нажал на кнопку:
код:
import vk_api
#часть кода с токеном удалил
vk = vk_session.get_api()

vk_session.method("messages.send", {
    "random_id": 0,
    "message": "выход",
    "peer_id": id
})

Как можно нормально сделать такое нажатие на кнопку?
 

Mamashin

Известный
1,103
595
Могу предложить свою версию на vkbottle
Писал за 5 минут, поэтому говнокод, payload предоставляет задать некую команду, так называемый target для кнопки клавиатуры VK.
Бот отвечает только на нажатия клавиатуры, если скопировать и вставить текст - бот нечего не ответит.


keyboard.py:
from vkbottle.bot import Bot, Message
from vkbottle import Keyboard, KeyboardButtonColor, Text

token = "str"

bot_token = token
bot_group_id = 0 # int
bh = Bot(bot_token, bot_group_id)
bh.labeler.vbml_ignore_case = True

btn_hello = "Приветик!"
btn_bh = "BlastHack"
btn_primary = "Синий"
btn_red = "Красненький"

@bh.on.private_message(text=['/gk', 'Привет'])
async def get_keyboard(bh: Message):
    await bh.answer(
    message="Клавиатура:",
    keyboard=(
    Keyboard(one_time=False, inline=False)
    .add(Text(btn_hello, payload={'cmd' : 'hello'}), color=KeyboardButtonColor.POSITIVE)
    .add(Text(btn_bh, payload={'cmd' : 'bh'}), color=KeyboardButtonColor.POSITIVE)
    .row()
    .add(Text(btn_primary, payload={'cmd' : 'btn_p'}), color=KeyboardButtonColor.PRIMARY)
    .add(Text(btn_red, payload={'cmd' : 'btn_r'}), color=KeyboardButtonColor.NEGATIVE)
    ).get_json()
    )

@bh.on.private_message(payload={'cmd' : 'hello'})
async def hello(bh: Message):
    await bh.answer(btn_hello)

@bh.on.private_message(payload={'cmd' : 'bh'})
async def cmd_bh(bh: Message):
    await bh.answer(btn_bh)

@bh.on.private_message(payload={'cmd' : 'btn_p'})
async def cmd_primary(bh: Message):
    await bh.answer(btn_primary)

@bh.on.private_message(payload={'cmd' : 'btn_r'})
async def cmd_negative(bh: Message):
    await bh.answer(btn_red)



bh.run_forever()
 

kyurew

Участник
Автор темы
84
55
Бот отвечает только на нажатия клавиатуры, если скопировать и вставить текст - бот нечего не ответит.
мне и надо нажать на кнопку, мне не нужно их создавать

неактуал, я смог сделать что хотел
 
Последнее редактирование:

kyurew

Участник
Автор темы
84
55
Можете, пожалуйста, поделиться решением?
Привет, сам код для нажатия кнопки примерно такой:
code:
 mes = vk_session.method("messages.getHistory", {
    "peer_id": айди_группы,
    "count": 1 # количество сообщений
})
for i in mes["items"][0]["keyboard"]["buttons"][0]: # во всей хуйне, которую даёт getHistory, перебирает чисто кнопочки
    if "текст_кнопки" in i["action"]["label"]: # ищет кнопку с нужным текстом
        button = [i["action"]["label"], i["action"]["payload"]] # записывает текст и payload кнопки в отдельный массив
vk_session.method("messages.send", {
    "random_id": 0,
    "message": button[0], # текст, который отправляется при нажатии кнопки, обычно такой же как и текст на кнопке
    "peer_id": айди_группы,
    "payload": button[1] # некоторые боты добавляют эту хуйню, не ебу, но нужно, чтоб нажалась
})
получаешь последнее сообщение, если просто выведешь то, что тебе выдаст метод getHistory, то там будет много всякой хуйни, эти кнопки снизу, как бы привязаны к последнему сообщению и можешь так их получать. Кнопки, как на скрине в первом сообщении темы, могут быть на разных строках, т.к. хуй знает где какая может быть и, чтобы в случае их перемещения ничего не сломалось, я делал перебор этих кнопок через цикл, когда находит кнопку с нужной надписью, сохраняет её точный текст и payload, а потом уже отправляет ответ сообщение, которое имитирует нажатие самой кнопки.
этот перебор, конечно, можно было бы сделать и лучше и без лишнего массива, сразу отправлять ответ, но я давно не занимался этим и мне пох было особо. Можешь поразбираться в том, что тебе возвращает getHistory
 
  • Нравится
Реакции: SoberBuddy