Добавление начальной логики
This commit is contained in:
parent
109cf0ca87
commit
220e3a95c1
135
main.py
135
main.py
@ -0,0 +1,135 @@
|
||||
import json
|
||||
import os
|
||||
import traceback
|
||||
|
||||
import vk_api
|
||||
from vk_api.longpoll import VkLongPoll, VkEventType, VkLongpollMode
|
||||
from datetime import datetime
|
||||
import time
|
||||
import dotenv
|
||||
|
||||
dotenv.load_dotenv()
|
||||
|
||||
vk_session = vk_api.VkApi(token=os.getenv('VK_ACCESS_TOKEN'), api_version='5.131')
|
||||
vk = vk_session.get_api()
|
||||
|
||||
|
||||
class Logger:
|
||||
def __init__(self, filename=None):
|
||||
self.filename = filename
|
||||
|
||||
def log(self, message):
|
||||
if self.filename is not None:
|
||||
with open(self.filename, 'a') as f:
|
||||
f.write(f"[{datetime.now().strftime('%d %b %Y %H:%M:%S')}] {message}\n")
|
||||
|
||||
|
||||
msg_logger = Logger('messages-log.log')
|
||||
|
||||
|
||||
class StickersCache:
|
||||
__cache = {}
|
||||
|
||||
@staticmethod
|
||||
def get_keywords(sticker_id: int):
|
||||
global vk
|
||||
if sticker_id in StickersCache.__cache:
|
||||
return StickersCache.__cache[sticker_id]
|
||||
try:
|
||||
res = vk.store.getStickersKeywords(stickers_ids=sticker_id)
|
||||
words = res['dictionary'][0]['words']
|
||||
if type(words) == list:
|
||||
words = words[:3]
|
||||
StickersCache.__cache[sticker_id] = words
|
||||
return words
|
||||
except Exception:
|
||||
return "<sticker get error>"
|
||||
|
||||
|
||||
def __create_msg_string(event):
|
||||
peer_id = event.peer_id
|
||||
user_id = event.user_id
|
||||
|
||||
if event.from_me:
|
||||
user_id = 0
|
||||
|
||||
text = event.text.replace('\n', '<br>')
|
||||
if 'attachments' in event.attachments:
|
||||
attachments = json.loads(event.attachments['attachments'])
|
||||
else:
|
||||
attachments = event.attachments
|
||||
|
||||
if type(attachments) == list and len(attachments) == 1:
|
||||
if attachments[0]['type'] == "sticker":
|
||||
# узнаем текст для ID стикера
|
||||
text = f"sticker keyword: {StickersCache.get_keywords(attachments[0]['sticker']['sticker_id'])}"
|
||||
attachments = [{
|
||||
"type": "sticker",
|
||||
"sticker": {
|
||||
"product_id": attachments[0]['sticker']['product_id'],
|
||||
"sticker_id": attachments[0]['sticker']['sticker_id']
|
||||
}
|
||||
}]
|
||||
|
||||
return f"id={event.message_id} peer={peer_id} user_id={user_id} text=\"{text}\" attachments={attachments}"
|
||||
|
||||
|
||||
def log_new_message(event):
|
||||
msg_logger.log(f"message_new {__create_msg_string(event)}")
|
||||
|
||||
|
||||
def log_message_edit(event):
|
||||
msg_logger.log(f"message_edit {__create_msg_string(event)}")
|
||||
|
||||
|
||||
def log_message_delete(event):
|
||||
peer_id = event.peer_id
|
||||
user_id = event.user_id
|
||||
|
||||
if event.from_me:
|
||||
user_id = 0
|
||||
|
||||
msg_logger.log(f"message_del id={event.message_id} peer={peer_id} user_id={user_id}")
|
||||
|
||||
|
||||
def log_message_recovery(event):
|
||||
msg_logger.log(f"message_rec {__create_msg_string(event)}")
|
||||
|
||||
|
||||
def lp_loop():
|
||||
mode = VkLongpollMode.GET_ATTACHMENTS | VkLongpollMode.GET_EXTENDED | VkLongpollMode.GET_PTS |\
|
||||
VkLongpollMode.GET_EXTRA_ONLINE | VkLongpollMode.GET_RANDOM_ID
|
||||
lp = VkLongPoll(vk_session, mode=mode)
|
||||
vk.account.setOnline(voip=0)
|
||||
|
||||
while True:
|
||||
try:
|
||||
for event in lp.listen():
|
||||
if event.type == VkEventType.MESSAGE_NEW:
|
||||
log_new_message(event)
|
||||
elif event.type == VkEventType.MESSAGE_EDIT:
|
||||
log_message_edit(event)
|
||||
elif event.type == VkEventType.MESSAGE_FLAGS_SET:
|
||||
if (event.mask & 128) != 0:
|
||||
log_message_delete(event)
|
||||
elif event.type == VkEventType.MESSAGE_FLAGS_RESET:
|
||||
if (event.mask & 128) != 0:
|
||||
log_message_recovery(event)
|
||||
|
||||
# elif event.type == VkEventType.USER_ONLINE:
|
||||
# print('Пользователь', event.user_id, 'онлайн', event.platform)
|
||||
#
|
||||
# elif event.type == VkEventType.USER_OFFLINE:
|
||||
# print('Пользователь', event.user_id, 'оффлайн', event.offline_type)
|
||||
|
||||
elif event.type == VkEventType.MESSAGES_COUNTER_UPDATE:
|
||||
pass # не принимаем такие события
|
||||
else:
|
||||
print(event.type, event.raw[1:])
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
lp_loop()
|
@ -1,3 +1,4 @@
|
||||
beautifulsoup4
|
||||
requests
|
||||
websocket-client
|
||||
python-dotenv
|
||||
|
Loading…
x
Reference in New Issue
Block a user