Skip to content

Commit ff87bde

Browse files
authored
Merge pull request #260 from klassik2k16/master
Add new button types
2 parents 106101f + 5dc165e commit ff87bde

3 files changed

Lines changed: 179 additions & 11 deletions

File tree

examples/callback_bot.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# -*- coding: utf-8 -*-
2+
from flask import Flask
3+
import vk_api
4+
5+
"""
6+
Пример бота для группы ВКонтакте использующего
7+
callback-api для получения сообщений.
8+
9+
Подробнее: https://vk.com/dev/callback_api
10+
11+
"""
12+
13+
app = Flask(__name__)
14+
vk_session = vk_api.VkApi(token='your_group_token')
15+
vk = vk_session.get_api()
16+
17+
access_code = "smthing code"
18+
19+
@app.route('/my_bot', methods=['POST'])
20+
def bot():
21+
# получаем данные из запроса
22+
data = json.loads(request.data)
23+
# ВКонтакте в своих запросах всегда отправляет поле type:
24+
if 'type' not in data.keys():
25+
return 'not ok'
26+
27+
# проверяем тип пришедшего события
28+
if data['type'] == 'confirmation':
29+
# если это запрос защитного кода
30+
# отправляем его
31+
return access_code
32+
# если же это сообщение, отвечаем пользователю
33+
elif data['type'] == 'message_new':
34+
# получаем ID пользователя
35+
from_id = data['object']['from_id']
36+
# отправляем сообщение
37+
vk.messages.send(message='Hello World!', random_id=0, peer_id=from_id)
38+
# возвращаем серверу VK "ok" и код 200
39+
return 'ok'
40+
41+
# точка входа приложения
42+
if __name__ == '__main__':
43+
# запускаем веб-сервер
44+
app.run()

examples/keyboard.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ def main():
1616
keyboard.add_button('Зелёная кнопка', color=VkKeyboardColor.POSITIVE)
1717

1818
keyboard.add_line() # Переход на вторую строку
19-
keyboard.add_button('Красная кнопка', color=VkKeyboardColor.NEGATIVE)
20-
19+
keyboard.add_location_button()
20+
21+
keyboard.add_line()
22+
keyboard.add_vkpay_button(hash="action=transfer-to-group&group_id=74030368&aid=6222115")
23+
2124
keyboard.add_line()
22-
keyboard.add_button('Синяя кнопка', color=VkKeyboardColor.PRIMARY)
25+
keyboard.add_vkapps_button(app_id=6979558,
26+
owner_id=-181108510,
27+
label="Отправить клавиатуру",
28+
hash="sendKeyboard")
29+
2330

2431
vk.messages.send(
2532
peer_id=123456,

vk_api/keyboard.py

Lines changed: 125 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# -*- coding: utf-8 -*-
22
"""
3-
:authors: python273, Helow19274
3+
:authors: python273, Helow19274, klassik2k16
44
:license: Apache License, Version 2.0, see LICENSE file
5-
65
:copyright: (c) 2019 python273
76
"""
87

@@ -13,6 +12,9 @@
1312
from .utils import sjson_dumps
1413

1514

15+
16+
17+
1618
class VkKeyboardColor(Enum):
1719
""" Возможные цвета кнопок """
1820

@@ -28,10 +30,25 @@ class VkKeyboardColor(Enum):
2830
#: Зелёная
2931
POSITIVE = 'positive'
3032

33+
class VkKeyboardButton(Enum):
34+
""" Возможные типы кнопки """
35+
36+
#: Кнопка с текстом
37+
TEXT = "text"
38+
39+
#: Кнопка с местоположением
40+
LOCATION = "location"
41+
42+
#: Кнопка с оплатой через VKPay
43+
VKPAY = "vkpay"
44+
45+
#: Кнопка с приложением VK Apps
46+
VKAPPS = "open_app"
47+
48+
3149

3250
class VkKeyboard(object):
3351
""" Класс для создания клавиатуры для бота (https://vk.com/dev/bots_docs_3)
34-
3552
:param one_time: Если True, клавиатура исчезнет после нажатия на кнопку
3653
:type one_time: bool
3754
"""
@@ -61,14 +78,13 @@ def get_empty_keyboard(cls):
6178
return keyboard.get_keyboard()
6279

6380
def add_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
64-
""" Добавить кнопку. Максимальное количество кнопок на строке - 4
81+
""" Добавить кнопку с текстом.
82+
Максимальное количество кнопок на строке - 4
6583
6684
:param label: Надпись на кнопке и текст, отправляющийся при её нажатии.
6785
:type label: str
68-
6986
:param color: цвет кнопки.
7087
:type color: VkKeyboardColor or str
71-
7288
:param payload: Параметр для callback api
7389
:type payload: str or list or dict
7490
"""
@@ -86,17 +102,118 @@ def add_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
86102
if payload is not None and not isinstance(payload, six.string_types):
87103
payload = sjson_dumps(payload)
88104

105+
button_type = VkKeyboardButton.TEXT.value
106+
89107
current_line.append({
90108
'color': color_value,
91109
'action': {
92-
'type': 'text',
110+
'type': button_type,
93111
'payload': payload,
94112
'label': label,
95113
}
96114
})
97115

116+
def add_location_button(self, payload=None):
117+
""" Добавить кнопку с местоположением.
118+
Всегда занимает всю ширину линии.
119+
120+
:param payload: Параметр для callback api
121+
:type payload: str or list or dict
122+
"""
123+
124+
current_line = self.lines[-1]
125+
126+
if len(current_line) != 0:
127+
raise ValueError(
128+
'This type of button takes the entire width of the line'
129+
)
130+
131+
if payload is not None and not isinstance(payload, six.string_types):
132+
payload = sjson_dumps(payload)
133+
134+
button_type = VkKeyboardButton.LOCATION.value
135+
136+
current_line.append({
137+
'action': {
138+
'type': button_type,
139+
'payload': payload
140+
}
141+
})
142+
143+
def add_vkpay_button(self, hash, payload=None):
144+
""" Добавить кнопку с оплатой с помощью VKPay.
145+
Всегда занимает всю ширину линии.
146+
147+
:param hash: Параметры платежа VKPay и ID приложения
148+
(в поле aid) разделённые &
149+
:type hash: str
150+
:param payload: Параметр для совместимости со старыми клиентами
151+
:type payload: str or list or dict
152+
"""
153+
154+
current_line = self.lines[-1]
155+
156+
if len(current_line) != 0:
157+
raise ValueError(
158+
'This type of button takes the entire width of the line'
159+
)
160+
161+
if payload is not None and not isinstance(payload, six.string_types):
162+
payload = sjson_dumps(payload)
163+
164+
button_type = VkKeyboardButton.VKPAY.value
165+
166+
current_line.append({
167+
'action': {
168+
'type': button_type,
169+
'payload': payload,
170+
'hash': hash
171+
}
172+
})
173+
174+
def add_vkapps_button(self, app_id, owner_id, label, hash, payload=None):
175+
""" Добавить кнопку с приложением VK Apps.
176+
Всегда занимает всю ширину линии.
177+
178+
:param app_id: Идентификатор вызываемого приложения с типом VK Apps
179+
:type app_id: int
180+
:param owner_id: Идентификатор сообщества, в котором установлено
181+
приложение, если требуется открыть в контексте сообщества
182+
:type owner_id: int
183+
:param label: Название приложения, указанное на кнопке
184+
:type label: str
185+
:param hash: хэш для навигации в приложении, будет передан в строке
186+
параметров запуска после символа #
187+
:type hash: str
188+
:param payload: Параметр для совместимости со старыми клиентами
189+
:type payload: str or list or dict
190+
"""
191+
192+
current_line = self.lines[-1]
193+
194+
if len(current_line) != 0:
195+
raise ValueError(
196+
'This type of button takes the entire width of the line'
197+
)
198+
199+
if payload is not None and not isinstance(payload, six.string_types):
200+
payload = sjson_dumps(payload)
201+
202+
button_type = VkKeyboardButton.VKAPPS.value
203+
204+
current_line.append({
205+
'action': {
206+
'type': button_type,
207+
'app_id': app_id,
208+
'owner_id': owner_id,
209+
'label': label,
210+
'payload': payload,
211+
'hash': hash
212+
}
213+
})
214+
98215
def add_line(self):
99-
""" Создаёт новую строчку, на которой можно размещать кнопки.
216+
""" Создаёт новую строку, на которой можно размещать кнопки.
100217
Максимальное количество строк - 10.
101218
"""
102219

0 commit comments

Comments
 (0)