Skip to content
This repository was archived by the owner on Oct 4, 2019. It is now read-only.

Commit d44736b

Browse files
committedJan 11, 2019
Better logging & some updates
1 parent 4d40ee9 commit d44736b

17 files changed

+100
-167
lines changed
 

‎README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@
44
* [Примеры использования](./examples) (python3)
55
## Hello world
66
```python
7+
# Можно использовать другие обертки для API.
8+
# Например vk_api.
79
import vk_requests
810

911
from vbio import VkBot
10-
from vbio.servers import FlaskServer
11-
12+
from vbio.servers import LongPoolClient
13+
1214
api = vk_requests.create_api(service_token='<токен группы>')
13-
bot = VkBot(secret='<секретный ключ>',
14-
confirmation='<строка, которую должен вернуть сервер>',
15-
api=api)
16-
server = FlaskServer(bot, port=80)
17-
18-
15+
bot = VkBot(api)
16+
server = LongPoolClient(bot)
17+
18+
1919
@bot.callback_message_handler()
2020
def hello_world(m):
2121
m.answer(message='Привет мир!')
22-
23-
22+
23+
2424
if __name__ == '__main__':
2525
server.run()
2626
```

‎docs/index.rst

+9-8
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,27 @@ Hello world!
2121

2222
.. code-block:: python
2323
24-
import vk_requests # Можно использовать другие обертки для API,
25-
# например vk_api.
24+
# Можно использовать другие обертки для API.
25+
# Например vk_api.
26+
import vk_requests
27+
2628
from vbio import VkBot
27-
from vbio.servers import FlaskServer
29+
from vbio.servers import LongPoolClient
2830
2931
api = vk_requests.create_api(service_token='<токен группы>')
30-
bot = VkBot(secret='<секретный ключ>',
31-
confirmation='<строка, которую должен вернуть сервер>',
32-
api=api)
33-
server = FlaskServer(bot, port=80)
32+
bot = VkBot(api)
33+
server = LongPoolClient(bot)
3434
3535
3636
@bot.callback_message_handler()
3737
def hello_world(m):
38-
m.answer(message='Привет мир!')
38+
m.answer(message='Привет мир!')
3939
4040
4141
if __name__ == '__main__':
4242
server.run()
4343
44+
4445
.. toctree::
4546
:maxdepth: 2
4647
:caption: Содержание:

‎examples/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
* [Структура вложения](./attachment.py)
88
* [Клавиатуры ботов](./keyboard.py)
99
* [Получение сообщений и фильтры](./filters.py)
10-
* [Работа c Bots LongPool](./longpool.py)
10+
* [Работа c Callback](./callback.py)

‎examples/attachment.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import vk_requests
44

55
from vbio import VkBot
6-
from vbio.servers import FlaskServer
6+
from vbio.servers import LongPoolClient
77

88
api = vk_requests.create_api(service_token='<токен группы>')
9-
bot = VkBot(secret='<секретный ключ>',
10-
confirmation='<строка, которую должен вернуть сервер>',
11-
api=api)
12-
server = FlaskServer(bot, port=80)
9+
bot = VkBot(api=api)
10+
server = LongPoolClient(bot)
1311

1412

1513
@bot.callback_message_handler()

‎examples/longpool.py ‎examples/callback.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
import vk_requests
44

55
from vbio import VkBot
6-
from vbio.servers import LongPoolClient
6+
from vbio.servers import FlaskServer
77

8-
# Токен должен иметь доступ к управлению группой!
98
api = vk_requests.create_api(service_token='<токен группы>')
10-
119
bot = VkBot(api=api)
12-
long_pool = LongPoolClient(bot)
10+
server = FlaskServer(bot, secret='<секретный ключ>',
11+
confirmation='<строка, которую должен вернуть сервер>')
1312

1413

1514
@bot.callback_message_handler()
@@ -18,4 +17,4 @@ def hello_world(m):
1817

1918

2019
if __name__ == '__main__':
21-
long_pool.run()
20+
server.run(port=80)

‎examples/filters.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import vk_requests
44

55
from vbio import VkBot
6-
from vbio.servers import FlaskServer
6+
from vbio.servers import LongPoolClient
77

88
api = vk_requests.create_api(service_token='<токен группы>')
9-
bot = VkBot(secret='<секретный ключ>',
10-
confirmation='<строка, которую должен вернуть сервер>',
11-
api=api)
12-
server = FlaskServer(bot, port=80)
9+
bot = VkBot(api=api)
10+
server = LongPoolClient(bot)
1311

1412

1513
# Будет вызываться только если текст сообщения подходит

‎examples/hello_world.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@
55
import vk_requests
66

77
from vbio import VkBot
8-
from vbio.servers import FlaskServer
8+
from vbio.servers import LongPoolClient
99

1010
# Получаем обертку на API
1111
api = vk_requests.create_api(service_token='<токен группы>')
1212

13-
bot = VkBot(secret='<секретный ключ>',
14-
confirmation='<строка, которую должен вернуть сервер>',
15-
api=api)
13+
bot = VkBot(api=api)
1614

17-
# Сервер, который будет обрабатывать запросы
18-
server = FlaskServer(bot, port=80)
15+
# LongPool клиент
16+
server = LongPoolClient(bot)
1917

2018

2119
# Задаем функцию которая будет получать сообщения.

‎examples/keyboard.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33
import vk_requests
44

55
from vbio import VkBot
6-
from vbio.servers import FlaskServer
6+
from vbio.servers import LongPoolClient
77
from vbio.types import VkKeyboardMarkup, VkKeyboardButton, VkColor
88

99
api = vk_requests.create_api(service_token='<токен группы>')
10-
bot = VkBot(secret='<секретный ключ>',
11-
confirmation='<строка, которую должен вернуть сервер>',
12-
api=api)
13-
server = FlaskServer(bot, port=80)
10+
bot = VkBot(api=api)
11+
server = LongPoolClient(bot)
1412

1513

1614
@bot.callback_message_handler()

‎examples/message.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import vk_requests
44

55
from vbio import VkBot
6-
from vbio.servers import FlaskServer
6+
from vbio.servers import LongPoolClient
77

88
api = vk_requests.create_api(service_token='<токен группы>')
9-
bot = VkBot(secret='<секретный ключ>',
10-
confirmation='<строка, которую должен вернуть сервер>',
11-
api=api)
12-
server = FlaskServer(bot, port=80)
9+
bot = VkBot(api=api)
10+
server = LongPoolClient(bot)
1311

1412

1513
@bot.callback_message_handler()
@@ -65,5 +63,6 @@ def new_message(m):
6563
)
6664
)
6765

66+
6867
if __name__ == '__main__':
6968
server.run()

‎requirements.txt

-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
Flask
2-
CherryPy
31
requests

‎setup.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
packages=['vbio', 'vbio.servers'],
2424
install_requires=['requests'],
2525
extras_require={
26-
'flask_webhook': ['flask'],
27-
'cherrypy_webhook': ['cherrypy'],
26+
'webhook': ['Flask'],
27+
'color': ['colorama']
2828
},
2929

30-
3130
classifiers=[
3231
'License :: OSI Approved :: Apache Software License',
3332
'Operating System :: OS Independent',

‎vbio/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
from vbio.logging import *
34
from vbio.bot import *
45
from vbio.types import *
56
from vbio.servers import *

‎vbio/bot.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,15 @@
44
import re
55

66
from vbio.types import CONTENT_TYPES, VkMessage, VkCallbackRequest
7+
from vbio.logging import init_logger
78
from typing import Callable
89

910
__all__ = ('VkBot',)
1011

1112

1213
class VkBot:
1314

14-
def __init__(self, api, secret: str = None, confirmation: str = None,
15-
ignore_errors: bool = True, logger: logging.Logger = None):
16-
17-
self.secret = secret
18-
self.confirmation = confirmation
15+
def __init__(self, api, ignore_errors: bool = True):
1916
self.ignore_errors = ignore_errors
2017
self.api = api
2118

@@ -24,7 +21,7 @@ def __init__(self, api, secret: str = None, confirmation: str = None,
2421

2522
self.message_register_next_step = {}
2623

27-
self.logger = logger
24+
self.logger = init_logger()
2825

2926
@staticmethod
3027
def _build_handler_dict(f: Callable, **filters) -> dict:

‎vbio/servers/__init__.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- encoding: utf-8 -*-
22

3-
from vbio.servers.flask import FlaskServer
4-
from vbio.servers.cherrypy import CherryPyServer
53
from vbio.servers.longpool import LongPoolClient
6-
7-
__all__ = ('FlaskServer', 'CherryPyServer', 'LongPoolClient')
4+
try:
5+
from vbio.servers.flask import FlaskServer
6+
except ImportError:
7+
pass

‎vbio/servers/flask.py

+39-53
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,61 @@
11
# -*- encoding: utf-8 -*-
22

3-
import traceback
3+
import sys
4+
import logging
45

56
from flask import Flask, request, abort
67
from vbio.bot import VkBot
78
from vbio.types import VkBotServer
8-
from datetime import datetime
99

1010
__all__ = ('FlaskServer',)
1111

1212

1313
class FlaskServer(VkBotServer):
1414

15-
def __init__(self, bot: VkBot, host: str = '0.0.0.0', port: int = 5000):
15+
def __init__(self, bot: VkBot, secret: str, confirmation: str, app: Flask = None):
16+
1617
self.bot = bot
17-
self.host = host
18-
self.port = port
19-
self.app = None
18+
self.secret = secret
19+
self.confirmation = confirmation
2020

21-
def run(self):
22-
self.app = Flask(__name__)
21+
self.app = app or Flask(__name__)
2322

24-
@self.app.route('/', methods=['POST'])
25-
def message_handler():
26-
data = request.json
23+
def message_handler(self):
24+
data = request.json
2725

28-
if data is None:
29-
return abort(400)
26+
if data is None:
27+
return abort(400)
3028

31-
if data.get('secret', '') != self.bot.secret:
32-
return abort(403)
29+
if data.get('secret', '') != self.secret:
30+
self.bot.logger.warning('Invalid secret passed!')
31+
return abort(403)
3332

34-
if data.get('type') == 'confirmation':
35-
return self.bot.confirmation
33+
if data.get('type') == 'confirmation':
34+
self.bot.logger.info('Confirmation sent')
35+
return self.confirmation
3636

37-
elif data.get('type') == 'message_new':
38-
try:
39-
self.bot.process_message(data['object'])
37+
try:
38+
if data.get('type') == 'message_new':
39+
self.bot.process_message(data['object'])
40+
self.bot.logger.info('Processed message from {}: {}'.format(data['object'].get('from_id'),
41+
data['object'].get('text')[:40]))
4042

41-
except Exception as e:
42-
if self.bot.logger is not None:
43-
self.bot.logger.error(
44-
'[X] {} Error \n{}\ncaused during handling request: '
45-
'\n{}\n-------------'.format(
46-
datetime.now().strftime("%d/%m/%y %H:%M:%S"),
47-
traceback.format_exc(),
48-
data
49-
)
50-
)
43+
else:
44+
self.bot.process_request(data)
45+
self.bot.logger.info('Processed request: {}'.format(data.get('type')))
5146

52-
if not self.bot.ignore_errors:
53-
raise e
47+
except Exception as ex:
48+
self.bot.logger.error('From {}'.format(data.get('type')), exc_info=sys.exc_info())
49+
if not self.bot.ignore_errors:
50+
raise ex
5451

55-
else:
56-
try:
57-
self.bot.process_request(data)
58-
59-
except Exception as e:
60-
if self.bot.logger is not None:
61-
self.bot.logger.error(
62-
'[X] {} Error \n{}\ncaused during handling request: '
63-
'\n{}\n-------------'.format(
64-
datetime.now().strftime("%d/%m/%y %H:%M:%S"),
65-
traceback.format_exc(),
66-
data
67-
)
68-
)
69-
70-
if not self.bot.ignore_errors:
71-
raise e
72-
73-
return 'ok'
74-
75-
self.app.run(self.host, self.port, debug=False)
52+
return 'ok'
53+
54+
def run(self, path: str = '/', *args, **kwargs):
55+
self.app.route(path, methods=['POST'])(
56+
self.message_handler
57+
)
58+
59+
logging.getLogger('werkzeug').setLevel(logging.FATAL)
60+
self.bot.logger.info('starting webhook')
61+
self.app.run(*args, **kwargs)

0 commit comments

Comments
 (0)
This repository has been archived.