Не работает кнопка у бота в вк
Пишу бота для группы в контакте. Начал добавлять кнопки, но они не появляются в сообщениях с ботом. При этом ошибки программа не выдает.
import vk_api from vk_api import VkUpload from vk_api.longpoll import VkLongPoll, VkEventType from vk_api.utils import get_random_id from vk_api.keyboard import VkKeyboard, VkKeyboardColor keyboard = VkKeyboard(one_time=False) keyboard.add_button(label="Кнопка 1", color=VkKeyboardColor.POSITIVE) token = 'token' image = '' vk_session = vk_api.VkApi(token = token) session_api = vk_session.get_api() longpull = VkLongPoll(vk_session) upload = VkUpload(vk_session) def send_msg(id, msg): vk_session.method('messages.send', ) def send_loud_photo(id): vk_session.method('messages.send', ) def send_photo(id, url): vk_session.method('messages.send', ) for event in longpull.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text: msg = event.text.lower() attachments = [] upload_image = upload.photo_messages(photos=image)[0] attachments.append('photo<>_<>'.format(upload_image['owner_id'], upload_image['id'])) if msg == 'привет': send_msg(id, 'Привет') elif msg == 'фото1': send_photo(id, 'url') elif msg == 'фото2': send_loud_photo(id) elif msg == 'ссылка': send_msg(id, r'https://vk.com/id'+str(id)) else: send_msg(id, 'неизвестное собщение')
Отслеживать
задан 12 дек 2020 в 21:04
данила соловьев данила соловьев
97 1 1 серебряный знак 12 12 бронзовых знаков
Как нажать на кнопку VK на python?
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
kyurew
Участник
Автор темы
У некоторых ботов в вк есть такие кнопки для управления ими:
Спойлер: скрин
При нажатии на одну из них, отправляется сообщение с текстом, который написан в этой кнопке. Мне нужно нажать на неё, я пробовал с просто написать сообщение с тем, что написано в кнопке, но бот как-то понимает, что я написал это, а не нажал на кнопку:
import vk_api #часть кода с токеном удалил vk = vk_session.get_api() vk_session.method("messages.send", < "random_id": 0, "message": "выход", "peer_id": id >)
Как можно нормально сделать такое нажатие на кнопку?
Mamashin
Известный
Могу предложить свою версию на 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=), color=KeyboardButtonColor.POSITIVE) .add(Text(btn_bh, payload=), color=KeyboardButtonColor.POSITIVE) .row() .add(Text(btn_primary, payload=), color=KeyboardButtonColor.PRIMARY) .add(Text(btn_red, payload=), color=KeyboardButtonColor.NEGATIVE) ).get_json() ) @bh.on.private_message(payload=) async def hello(bh: Message): await bh.answer(btn_hello) @bh.on.private_message(payload=) async def cmd_bh(bh: Message): await bh.answer(btn_bh) @bh.on.private_message(payload=) async def cmd_primary(bh: Message): await bh.answer(btn_primary) @bh.on.private_message(payload=) async def cmd_negative(bh: Message): await bh.answer(btn_red) bh.run_forever()
Создание кнопок
Здравствуйте! Возникла такая проблема, я создаю бота в вк для сообщества, после того как участник написал привет, должно выходить сообщение с приветствием и кнопка для дальнейших действий, подскажите как это сделать, кнопки у меня не появляются. Еще хотелось бы сделать приветствие с обращением по имени, но я не знаю как. Вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
import vk_api,random, json from vk_api import VkUpload from vk_api.bot_longpoll import VkBotLongPoll from vk_api.bot_longpoll import VkBotEventType token = "**************" vk=vk_api.VkApi(token=token) vk._auth_token() upload=VkUpload(vk) def get_button (label,color,payload=""): return { "action": { "type": "text", "payload": json.dumps(payload), "label": label }, "color": color } keyboard = { "one_time": True, "buttons": [ [ get_button(label="Кнопка 1", color = "Positive"), get_button(label="Кнопка 2", color = "Negative"), get_button(label="Кнопка 3", color = "Primary"), get_button(label="Кнопка 4", color = "default") ] ] } keyboard = json.dumps(keyboard, ensure_ascii=False).encode('utf-8') keyboard = str(keyboard.decode('utf-8')) while True: messages = vk.method("messages.getConversations", {"offset": 0, "count": 20, "filter": "unanswered"}) if messages["count"]>=1: text= messages['items'][0]['last_message']['text'] user_id = messages ['items'][0]['last_message']['from_id'] if text.lower() =='Привет' or text.lower()=='привет': vk.method("messages.send", {"user_id":user_id,"message":"Привет друг! Ты вступил в сообщество Смотри фильм с неЗ(н)айками, с чем мы тебя поздравляем! НеЗ(н)аки уверены, что помогут подобрать тебе фильм и ты классно проведёшь время!", "random_id": random.randint (1,1000)}) vk.method("message.send", {"user_id":user_id, "message": "Выберите кнопку","keyboard": keyboard}) if body=="Кнопка 1": vk.method("message.send", {"peer_id": id, "message": body})
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Создание кнопок из базы данных SQL3
Хочу реализовать создание кнопок тг бота из базы данных, вот запрос на пучение данных: В таблице.
Создание кнопок в рантайме по клику мыши. Как прекратить создание?
Здравствуйте форумчане. Столкнулся со следующей проблемой. В поле Edit1 я ввожу число(например 5) и.
LinearLayout, не получается программное создание создание кнопок
Ребят, рисую на LinearLayout. Почему получается программно создать только одну кнопку? Как сделать.
Создание кнопок
Здравствуйте. Недавно начал изучать Флеш. Возникли проблемы: 1) Ставлю баттон взяв его из.
В VK добавили Callback кнопки для ботов

Мой первый пост. Будет кратко, емко и надеюсь актуально.
9го июля ВК выкатил callback кнопки для чат-ботов. Телеграм напрягся сделал это в 199. давно. Самая популярная библиотека для разработки чат-ботов под ВК на Python — vk_api (от разработчика python273). Ввиду того, что свежие правки в нее вносятся медленно, я взял на себя смелость сделать форк, дополнить его и описать небольшой пример использования.
Что сделано относительно исходной v11.80?
- Обновлены ограничения по клавиатуре (в соответствии с изменениями в API):
- не более 5 кнопок в строке (было 4);
- не более 10 и 6 строк для стандартного и inline представления соответственно (было 10 и там, и там);
- Default кнопка переименована в Secondary.
- Добавлены callback-кнопки:
- новый тип события «message_event» (клик по кнопке);
- новый метод «создать callback кнопку»;
- добавлен example (анимация работы и код будут приведены ниже).
Виды callback кнопок
У сallback кнопок 3 встроенных действия по клику (+ редактирование сообщения):
- show_snackbar — показать всплывающее сообщение (исчезает через 10 сек);
- open_link — открыть URL ссылку;
- open_app — открыть ВК приложение;
- можно настроить редактирование текущего сообщения, дабы по клику можно было изменять клавиатуру + текст в текущем сообщении.
Как установить модифицированную библиотеку?
pip install git+https://github.com/chebotarevmichael/vk_api
Инструкция по настройке группы

Если вы никогда не создавали свой бот, то это будет полезно. Все остальные могут пропустить этот раздел.
Код примера по частям
Импорты. Думаю, с ними все понятно.
from vk_api import VkApi from vk_api.utils import get_random_id from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from vk_api.keyboard import VkKeyboard, VkKeyboardColor import json
Настройка и запуск бота. Указываем идентификатор и longpoll-токен группы.
Для использования кнопки «открыть ВК приложение» указываем идентификатор приложения и его владельца.
# Общие GROUP_ID = '100. 500' GROUP_TOKEN = 'df2148cc7c664. токен_группы. df2148cc7c6642242531fad399' API_VERSION = '5.120' # для callback-кнопки "открыть приложение" APP_ID = 100500 # id IFrame приложения OWNER_ID = 123456 # id владельца приложения # виды callback-кнопок CALLBACK_TYPES = ('show_snackbar', 'open_link', 'open_app') # Запускаем бот vk_session = VkApi(token=GROUP_TOKEN, api_version=API_VERSION) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, group_id=GROUP_ID)
Создаем два меню
В первом меню — все 4 упомянутых выше действия кнопок.
Во втором — только кнопка «назад», возвращающая предыдущее меню.

.
# Настройки для обоих клавиатур settings = dict(one_time=False, inline=True) # №1. Клавиатура с 3 кнопками: "показать всплывающее сообщение", "открыть URL" и изменить меню (свой собственный тип) keyboard_1 = VkKeyboard(**settings) # pop-up кнопка keyboard_1.add_callback_button(label='Покажи pop-up сообщение', color=VkKeyboardColor.SECONDARY, payload=) keyboard_1.add_line() # кнопка с URL keyboard_1.add_callback_button(label='Откртыть Url', color=VkKeyboardColor.POSITIVE, payload=) keyboard_1.add_line() # кнопка по открытию ВК-приложения keyboard_1.add_callback_button(label='Открыть приложение', color=VkKeyboardColor.NEGATIVE, payload=) keyboard_1.add_line() # кнопка переключения на 2ое меню keyboard_1.add_callback_button(label='Добавить красного ', color=VkKeyboardColor.PRIMARY, payload=) # №2. Клавиатура с одной красной callback-кнопкой. Нажатие изменяет меню на предыдущее. keyboard_2 = VkKeyboard(**settings) # кнопка переключения назад, на 1ое меню. keyboard_2.add_callback_button('Назад', color=VkKeyboardColor.NEGATIVE, payload=)
Запускаем long poll
Запускаем действо. Если пользователь присылает текстовое сообщение — выдаем первое меню. Если это событие «клик по callback кнопке» — выполняем определенное действие (одно из 3+1 действий, упомянутых выше).
f_toggle: bool = False for event in longpoll.listen(): # отправляем меню 1го вида на любое текстовое сообщение от пользователя if event.type == VkBotEventType.MESSAGE_NEW: if event.obj.message['text'] != '': if event.from_user: # Если клиент пользователя не поддерживает callback-кнопки, # нажатие на них будет отправлять текстовые # сообщения. Т.е. они будут работать как обычные inline кнопки. if 'callback' not in event.obj.client_info['button_actions']: print(f'Клиент не поддерж. callback') vk.messages.send( user_id=event.obj.message['from_id'], random_id=get_random_id(), peer_id=event.obj.message['from_id'], keyboard=keyboard_1.get_keyboard(), message=event.obj.message['text']) # обрабатываем клики по callback кнопкам elif event.type == VkBotEventType.MESSAGE_EVENT: # если это одно из 3х встроенных действий: if event.object.payload.get('type') in CALLBACK_TYPES: # отправляем серверу указания как какую из кнопок обработать. Это заложено в # payload каждой callback-кнопки при ее создании. # Но можно сделать иначе: в payload положить свои собственные # идентификаторы кнопок, а здесь по ним определить # какой запрос надо послать. Реализован первый вариант. r = vk.messages.sendMessageEventAnswer( event_id=event.object.event_id, user_id=event.object.user_id, peer_id=event.object.peer_id, event_data=json.dumps(event.object.payload)) # если это наша "кастомная" (т.е. без встроенного действия) кнопка, то мы можем # выполнить edit сообщения и изменить его меню. Но при желании мы могли бы # на этот клик открыть ссылку/приложение или показать pop-up. (см.анимацию ниже) elif event.object.payload.get('type') == 'my_own_100500_type_edit': last_id = vk.messages.edit( peer_id=event.obj.peer_id, message='ola', conversation_message_id=event.obj.conversation_message_id, keyboard=(keyboard_1 if f_toggle else keyboard_2).get_keyboard()) f_toggle = not f_toggle if __name__ == '__main__': print()
Как выглядит процесс
Заключение
Тот факт, что callback-кнопки наконец-то появились в ВК — радует. И пусть пока они работают только под мобильными приложениями, а в браузере — не поддерживают. Пусть в браузере inline-кнопки все еще не выравнивается по ширине. Все же их наличие хоть в каком-то виде — искренне радует меня, как разработчика коммерческого телеграмм-бота.
Теперь появилась возможность реализовать ВК-интерфейс для своего телеграм-бота, где в разы больше жителей РФ, т.е целевой аудитории. Этот факт заставляет мириться со всеми перечисленными неудобствами и минусами, и идти к горе, раз она не хочет идти к Магомеду. На скриншоте ниже реализация одного и того же интерфейса через callback-кнопки: справа в Телеграм, и слева — ВКонтакте.

.
Надеюсь, кому-то этот краткий обзор поможет начать использовать callback кнопки в своих ботах. Pull-request автору библиотеки отправлен.
p.s. изменения влиты основной код.