Просмотр полной версии : Как нажать на кнопку VK на python?
У некоторых ботов в вк есть такие кнопки для управления ими:
https://forum.antichat.xyz/attachments/28347418/img_3b41daadc7.png
При нажатии на одну из них, отправляется сообщение с текстом, который написан в этой кнопке. Мне нужно нажать на неё, я пробовал с просто написать сообщение с тем, что написано в кнопке, но бот как-то понимает, что я написал это, а не нажал на кнопку:
код:
import
vk_api
#часть кода с токеном удалил
vk
=
vk_session
.
get_api
(
)
vk_session
.
method
(
"messages.send"
,
{
"random_id"
:
0
,
"message"
:
"выход"
,
"peer_id"
:
id
}
)
Как можно нормально сделать такое нажатие на кнопку?
Mamashin
23.07.2023, 08:44
Могу предложить свою версию на
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
(
)
Бот отвечает только на нажатия клавиатуры, если скопировать и вставить текст - бот нечего не ответит.
мне и надо нажать на кнопку, мне не нужно их создавать
неактуал, я смог сделать что хотел
SoberBuddy
08.02.2025, 10:56
мне и надо нажать на кнопку, мне не нужно их создавать
неактуал, я смог сделать что хотел
Можете, пожалуйста, поделиться решением?
Можете, пожалуйста, поделиться решением?
Привет, сам код для нажатия кнопки примерно такой:
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
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot