Botões de retorno de chamada para bots adicionados ao VK

Use callback


Bom dia, queridos moradores de Habr.



Minha primeira postagem. Será breve, sucinto e esperançosamente relevante.



Em 9 de julho, a VK lançou botões de retorno de chamada para bots de bate-papo. Telegramatenso fez isso em 199 ...longo. A biblioteca mais popular para o desenvolvimento de bots de bate-papo para VK em Python é vk_api (do desenvolvedorpython273) Devido ao fato de que novas edições estão sendo feitas lentamente, tomei a liberdade de fazer um fork, complementando-o e descrevendo um pequeno caso de uso.



O que foi feito em relação à versão 11.80 original?



  1. ( API):



    • 5 ( 4);
    • 10 6 inline ( 10 , );
    • Default Secondary.


  2. callback-:



    • "message_event" ( );
    • " callback ";
    • example ( ).




callback



allback 3 (+ ):



  1. show_snackbar — ( 10 );
  2. open_link — URL ;
  3. open_app — ;
  4. , + .


?



pip install git+https://github.com/chebotarevmichael/vk_api




, . .

imagem





. , .



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={"type": "show_snackbar", "text": "  "})
keyboard_1.add_line()
#   URL
keyboard_1.add_callback_button(label=' Url', color=VkKeyboardColor.POSITIVE, payload={"type": "open_link", "link": "https://vk.com/dev/bots_docs_5"})
keyboard_1.add_line()
#    -
keyboard_1.add_callback_button(label=' ', color=VkKeyboardColor.NEGATIVE, payload={"type": "open_app", "app_id": APP_ID, "owner_id": OWNER_ID, "hash": "anything_data_100500"})
keyboard_1.add_line()
#    2 
keyboard_1.add_callback_button(label='  ', color=VkKeyboardColor.PRIMARY, payload={"type": "my_own_100500_type_edit"})

# №2.     callback-.     .
keyboard_2 = VkKeyboard(**settings)
#   ,  1 .
keyboard_2.add_callback_button('', color=VkKeyboardColor.NEGATIVE, payload={"type": "my_own_100500_type_edit"})


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' {event.obj.message["from_id"]}  . 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()




Use callback.





, callback- - — . , — . inline- . - — , -.



- -, , . . , , . callback-: , — .



.



Esperamos que esta visão geral rápida ajude alguém a começar a usar botões de retorno de chamada em seus bots. A solicitação pull foi enviada ao autor da biblioteca.



alterações no ps injetando o código principal;




All Articles