From 220e3a95c1377d3b78e057a846fd87a0bfa2c131 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Wed, 22 Mar 2023 10:20:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 135 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 136 insertions(+) diff --git a/main.py b/main.py index e69de29..31a489b 100644 --- a/main.py +++ b/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 "" + + +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', '
') + 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() diff --git a/requirements.txt b/requirements.txt index 941a976..8df6edb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ beautifulsoup4 requests websocket-client +python-dotenv