ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Как нажать на кнопку VK на python? (https://forum.antichat.xyz/showthread.php?t=1483796)

kyurew 22.07.2023 15:06

У некоторых ботов в вк есть такие кнопки для управления ими:

Цитата:

Сообщение от Спойлер

При нажатии на одну из них, отправляется сообщение с текстом, который написан в этой кнопке. Мне нужно нажать на неё, я пробовал с просто написать сообщение с тем, что написано в кнопке, но бот как-то понимает, что я написал это, а не нажал на кнопку:

код:





Код:

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
(
)


kyurew 05.08.2023 14:23

Цитата:

Сообщение от Mamashin

Бот отвечает только на нажатия клавиатуры, если скопировать и вставить текст - бот нечего не ответит.

мне и надо нажать на кнопку, мне не нужно их создавать

неактуал, я смог сделать что хотел

SoberBuddy 08.02.2025 10:56

Цитата:

Сообщение от kyurew

мне и надо нажать на кнопку, мне не нужно их создавать

неактуал, я смог сделать что хотел

Можете, пожалуйста, поделиться решением?

kyurew 17.02.2025 20:40

Цитата:

Сообщение от SoberBuddy

Можете, пожалуйста, поделиться решением?

Привет, сам код для нажатия кнопки примерно такой:

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


Время: 19:06