Skip to content

Commit 4d4eaa7

Browse files
Igorpython273
authored andcommitted
VkKeyboard (#148)
* VkKeyboard + api version 5.80 * Refactor; Use six module
1 parent a9e425c commit 4d4eaa7

13 files changed

Lines changed: 158 additions & 21 deletions

docs/keyboard.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
VkKeyboard
2+
=======
3+
4+
Модуль для удобного создания клавиатур для ботов
5+
6+
.. module:: vk_api.keyboard
7+
.. autoclass:: VkKeyboard
8+
:members:
9+
.. autoclass:: KeyboardColor
10+
:members:

examples/keyboard.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# -*- coding: utf-8 -*-
2+
import vk_api
3+
from vk_api.keyboard import KeyboardColor
4+
5+
6+
def main():
7+
""" Пример создания клавиатуры для отправки ботом """
8+
9+
vk_session = vk_api.VkApi(token='bot_api_token')
10+
vk = vk_session.get_api()
11+
12+
keyboard = vk_api.VkKeyboard(one_time=True)
13+
14+
keyboard.add_button('Белая кнопка', color=KeyboardColor.DEFAULT)
15+
keyboard.add_button('Зелёная кнопка', color=KeyboardColor.POSITIVE)
16+
17+
keyboard.add_line() # Переход на вторую строку
18+
keyboard.add_button('Красная кнопка', color=KeyboardColor.NEGATIVE)
19+
20+
keyboard.add_line()
21+
keyboard.add_button('Синяя кнопка', color=KeyboardColor.PRIMARY)
22+
23+
vk.messages.send(
24+
peer_id=123456,
25+
message='Пример клавиатуры',
26+
keyboard=keyboard.get_keyboard()
27+
)
28+
29+
30+
if __name__ == '__main__':
31+
main()

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
beautifulsoup4
22
requests
33
enum34
4+
six

vk_api/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .exceptions import *
44
from .requests_pool import VkRequestsPool, vk_request_one_param_pool
55
from .tools import VkTools
6+
from .keyboard import VkKeyboard
67
from .upload import VkUpload
78
from .vk_api import VkApi
89

vk_api/audio_url_decoder.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# -*- coding: utf-8 -*-
2+
from six.moves import range
3+
24
from .exceptions import VkAudioUrlDecodeError
35

46
VK_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/="

vk_api/execute.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
:copyright: (c) 2018 python273
88
"""
99

10+
import six
11+
1012
from .utils import sjson_dumps
1113
from .vk_api import VkApi, VkApiMethod
1214

@@ -35,7 +37,7 @@ def __init__(self, code, args=None, clean_args=None, return_raw=False):
3537
def compile(self, args):
3638
compiled_args = {}
3739

38-
for key, value in args.items():
40+
for key, value in six.iteritems(args):
3941
if key in self.clean_args:
4042
compiled_args[key] = str(value)
4143
else:
@@ -74,7 +76,7 @@ def minify(code):
7476
def parse_args(function_args, args, kwargs):
7577
parsed_args = {}
7678

77-
for arg_name in kwargs.keys():
79+
for arg_name in six.iterkeys(kwargs):
7880
if arg_name in function_args:
7981
parsed_args[arg_name] = kwargs[arg_name]
8082
else:

vk_api/keyboard.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from enum import Enum
2+
3+
import six
4+
5+
from .utils import sjson_dumps
6+
7+
8+
class KeyboardColor(Enum):
9+
""" Возможные цвета кнопок """
10+
PRIMARY = 'primary' # синяя
11+
DEFAULT = 'default' # белая
12+
NEGATIVE = 'negative' # красная
13+
POSITIVE = 'positive' # зелёная
14+
15+
16+
class VkKeyboard(object):
17+
""" Класс для создания клавиатуры для бота (https://vk.com/dev/bots_docs_3)
18+
19+
:param one_time: Если True, клавиатура исчезнет после нажатия на кнопку
20+
:type one_time: bool
21+
"""
22+
23+
__slots__ = ('one_time', 'lines', 'keyboard')
24+
25+
def __init__(self, one_time=False):
26+
self.one_time = one_time
27+
self.lines = [[]]
28+
29+
self.keyboard = {
30+
'one_time': self.one_time,
31+
'buttons': self.lines
32+
}
33+
34+
def get_keyboard(self):
35+
""" Получить json клавиатуры """
36+
return sjson_dumps(self.keyboard)
37+
38+
@classmethod
39+
def get_empty_keyboard(cls):
40+
""" Получить json пустой клавиатуры.
41+
Если отправить пустую клавиатуру, текущая у пользователя исчезнет.
42+
"""
43+
keyboard = cls()
44+
keyboard.keyboard['buttons'] = []
45+
return keyboard.get_keyboard()
46+
47+
def add_button(self, label, color=KeyboardColor.DEFAULT, payload=None):
48+
""" Добавить кнопку. Максимальное количество кнопок на строке - 4
49+
50+
:param label: Надпись на кнопке и текст, отправляющийся при её нажатии.
51+
:type: str
52+
53+
:param color: цвет кнопки.
54+
:type color: KeyboardColor or str
55+
56+
:param payload: Параметр для callback api
57+
:type payload: str or list or dict
58+
"""
59+
60+
current_line = self.lines[-1]
61+
62+
if len(current_line) >= 4:
63+
raise ValueError('Max 4 buttons on a line')
64+
65+
color_value = color
66+
67+
if isinstance(color, KeyboardColor):
68+
color_value = color_value.value
69+
70+
if payload is not None and not isinstance(payload, six.string_types):
71+
payload = sjson_dumps(payload)
72+
73+
current_line.append({
74+
'color': color_value,
75+
'action': {
76+
'type': 'text',
77+
'payload': payload,
78+
'label': label,
79+
}
80+
})
81+
82+
def add_line(self):
83+
""" Создаёт новую строчку, на которой можно размещать кнопки.
84+
Максимальное количество строк - 10
85+
"""
86+
87+
if len(self.lines) >= 10:
88+
raise ValueError('Max 10 lines')
89+
90+
self.lines.append([])

vk_api/longpoll.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
from collections import defaultdict
1111
from datetime import datetime
12-
from enum import Enum, IntEnum
12+
from enum import IntEnum
1313

1414
import requests
15+
import six
16+
from six.moves import range
1517

1618
CHAT_START_ID = int(2E9) # id с которого начинаются беседы
1719

@@ -228,7 +230,7 @@ class VkPeerFlag(IntEnum):
228230
def get_all_event_attrs():
229231
keys = set()
230232

231-
for l in EVENT_ATTRS_MAPPING.values():
233+
for l in six.itervalues(EVENT_ATTRS_MAPPING):
232234
keys.update(l)
233235

234236
return tuple(keys)
@@ -237,7 +239,7 @@ def get_all_event_attrs():
237239
ALL_EVENT_ATTRS = get_all_event_attrs()
238240

239241
PARSE_PEER_ID_EVENTS = [
240-
k for k, v in EVENT_ATTRS_MAPPING.items() if 'peer_id' in v
242+
k for k, v in six.iteritems(EVENT_ATTRS_MAPPING) if 'peer_id' in v
241243
]
242244
PARSE_MESSAGE_FLAGS_EVENTS = [
243245
VkEventType.MESSAGE_FLAGS_REPLACE,

vk_api/requests_pool.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@
77
:copyright: (c) 2018 python273
88
"""
99

10-
import sys
1110
from collections import namedtuple
1211

12+
from six.moves import range
13+
1314
from .exceptions import VkRequestsPoolException
1415
from .execute import VkFunction
1516
from .utils import sjson_dumps
1617

17-
if sys.version_info.major == 2:
18-
range = xrange
19-
20-
2118
PoolRequest = namedtuple('PoolRequest', ['method', 'values', 'result'])
2219

2320

vk_api/tools.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
from .exceptions import ApiError, VkToolsException
1313
from .execute import VkFunction
1414

15-
if sys.version_info.major == 2:
16-
range = xrange
15+
from six.moves import range
1716

1817

1918
class VkTools(object):

0 commit comments

Comments
 (0)