diff --git a/vk_messages.py b/vk_messages.py deleted file mode 100644 index 363b0d8..0000000 --- a/vk_messages.py +++ /dev/null @@ -1,303 +0,0 @@ -import os -import redis -import requests -import time -import vk -import wget - -vk_tokens = redis.from_url(os.environ.get("REDIS_URL")) - - -class VkPolling: - def __init__(self): - self._running = True - - def terminate(self): - self._running = False - - def run(self, vk_user, bot, chat_id): - while self._running: - updates = [] - try: - updates = vk_user.get_new_messages() - except requests.exceptions.ReadTimeout as e: - print('Error: {}'.format(e)) - if updates: - handle_updates(vk_user, bot, chat_id, updates) - for i in range(50): - if self._running: - time.sleep(0.1) - else: - break - - -def handle_messages(m, vk_user, bot, chat_id, mainmessage=None): - user = vk.API(vk_user.session).users.get(user_ids=m["uid"], fields=[])[0] - if 'body' in m and not 'attachment' in m and not 'geo' in m and not 'fwd_messages' in m: - data = add_user_info(m, user["first_name"], user["last_name"])[:-1] + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - if 'attachment' in m: - attachment_handler(m, user, bot, chat_id, mainmessage) - if 'geo' in m: - data = add_user_info(m, user["first_name"], user["last_name"]) + 'Местоположение' + add_reply_info(m) - geo = bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - if 'place' in m['geo'] and 'city' in m['geo']['place'] and 'title' in m[geo]['place']: - bot.send_venue(chat_id, m['geo']['coordinates'].split(' ')[0], m['geo']['coordinates'].split(' ')[1], - m['geo']['place']['title'], m['geo']['place']['city'], - disable_notification=check_notification(m), - reply_to_message_id=geo.message_id).wait() - else: - bot.send_location(chat_id, m['geo']['coordinates'].split(' ')[0], m['geo']['coordinates'].split(' ')[1], - disable_notification=check_notification(m), - reply_to_message_id=geo.message_id).wait() - if 'fwd_messages' in m: - data = add_user_info(m, user["first_name"], - user["last_name"]) + 'Пересланные сообщения' + add_reply_info(m) - reply = bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait().message_id - for forwared in m['fwd_messages']: - handle_messages(forwared, vk_user, bot, chat_id, reply) - - -def handle_updates(vk_user, bot, chat_id, updates): - for m in updates: - if not m['out']: - handle_messages(m, vk_user, bot, chat_id) - - -def attachment_handler(m, user, bot, chat_id, mainmessage=None): - for attach in m['attachments']: - if attach['type'] == 'photo': - try: - data = add_user_info(m, user['first_name'], user['last_name']) + 'Фото'.format( - get_max_src(attach['photo'])) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['type'] == 'video': - try: - link = 'https://vk.com/video{}_{}'.format(attach['video']['owner_id'], - attach['video']['vid']) - data = add_user_info(m, user['first_name'], user['last_name']) + 'Видео'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['type'] == 'audio': - data = add_user_info(m, user['first_name'], user[ - 'last_name']) + '🎵 {} - {}'.format( - attach['audio']['artist'].replace(' ', '%20'), - attach['audio']['title'].replace(' ', '%20'), attach['audio']['artist'], - attach['audio']['title']) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - - elif attach['type'] == 'doc': - if attach['doc']['ext'] == 'gif': - try: - link = attach['doc']['url'] - data = add_user_info(m, user["first_name"], user["last_name"]) + 'GIF'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['doc']['ext'] == 'pdf' or attach['doc']['ext'] == 'zip': - try: - link = attach['doc']['url'] - data = add_user_info(m, user["first_name"], - user["last_name"]) + 'Документ'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['doc']['ext'] == 'jpg' or attach['doc']['ext'] == 'png': - try: - link = attach['doc']['url'] - data = add_user_info(m, user["first_name"], - user["last_name"], ) + 'Документ' + add_reply_info(m) - notification = bot.send_message(chat_id, data, parse_mode='HTML', - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - uploading = bot.send_chat_action(chat_id, 'upload_document') - bot.send_document(chat_id, link, reply_to_message_id=notification.message_id, - disable_notification=check_notification(m)).wait() - uploading.wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['doc']['ext'] == 'ogg': - try: - link = attach['doc']['url'] - data = add_user_info(m, user["first_name"], user["last_name"], ) + \ - 'Аудио'.format(link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['doc']['ext'] == 'doc' or attach['doc']['ext'] == 'docx': - try: - data = add_user_info(m, user["first_name"], - user["last_name"], ) + 'Документ' + add_reply_info(m) - notification = bot.send_message(chat_id, data, parse_mode='HTML', - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - uploading = bot.send_chat_action(chat_id, 'upload_document') - file = wget.download(requests.get(attach['doc']['url']).url) - openedfile = open(file, 'rb') - bot.send_document(chat_id, openedfile, - reply_to_message_id=notification.message_id, - disable_notification=check_notification(m)).wait() - uploading.wait() - openedfile.close() - os.remove(file) - except: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - else: - send_doc_link(attach, m, user, bot, chat_id, mainmessage) - - elif attach['type'] == 'sticker': - link = attach['sticker']['photo_512'] - data = add_user_info(m, user["first_name"], user["last_name"]) + 'Стикер'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - elif attach['type'] == 'wall': - link = 'https://vk.com/wall{}_{}'.format(attach['wall']['from_id'], attach['wall']['id']) - data = add_user_info(m, user["first_name"], user["last_name"]) + 'Запись на стене'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - elif attach['type'] == 'wall_reply': - data = add_user_info(m, user["first_name"], - user["last_name"]) + 'Комментарий на стене' + add_reply_info(m) - comment = bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=mainmessage).wait() - try: - user = vk.API(get_session(vk_tokens.get(str(chat_id)))).users.get(user_ids=attach['wall_reply']["uid"], - fields=[])[0] - if attach['wall_reply']['text']: - data = add_user_info(m, user["first_name"], user["last_name"]) + \ - attach['wall_reply']['text'].replace('
', '\n') + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=comment.message_id).wait() - if 'attachments' in attach['wall_reply']: - attachment_handler(attach['wall_reply'], user, bot, chat_id, mainmessage=comment.message_id) - except: - link = 'https://vk.com/wall{}_{}'.format(attach['wall']['owner_id'], attach['wall']['cid']) - data = add_user_info(m, user["first_name"], - user["last_name"]) + 'Комментарий'.format( - link) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), - reply_to_message_id=comment.message_id).wait() - - -def check_expansion(document): - if len(document['doc']['title'].split('.')) - 1: - return document['doc']['title'] - else: - return document['doc']['title'] + '.' + document['doc']['ext'] - - -def send_doc_link(doc, m, user, bot, chat_id, mainmessage=None): - link = doc['doc']['url'] - data = add_user_info(m, user["first_name"], user["last_name"]) + \ - 'Документ\n{}'.format(link, check_expansion(doc)) + add_reply_info(m) - bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False, - disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait() - - -def check_forward_id(msg): - if 'mid' in msg: - return msg['mid'] - else: - return None - - -def add_reply_info(m): - if 'chat_id' in m: - return ''.format(m['uid'], m['chat_id'], check_forward_id(m)) - else: - return ''.format(m['uid'], check_forward_id(m)) - - -def add_user_info(m, first_name, last_name): - if 'body' in m and m['body']: - if 'chat_id' in m: - return '{} {} @ {}:\n{}\n'.format(first_name, last_name, m['title'], m['body'].replace('
', '\n')) - else: - return '{} {}:\n{}\n'.format(first_name, last_name, m['body'].replace('
', '\n')) - else: - if 'chat_id' in m: - return '{} {} @ {}:\n'.format(first_name, last_name, m['title']) - else: - return '{} {}:\n'.format(first_name, last_name) - - -def check_notification(value): - if 'push_settings' in value: - return True - else: - return False - - -def get_max_src(attachment): - if 'src_xxbig' in attachment: - return attachment['src_xxbig'] - if 'src_xbig' in attachment: - return attachment['src_xbig'] - if 'src_big' in attachment: - return attachment['src_big'] - if 'src' in attachment: - return attachment['src'] - - -class VkMessage: - def __init__(self, token): - self.session = get_session(token) - self.ts, self.pts = get_tses(self.session) - - def get_new_messages(self): - - api = vk.API(self.session) - new = api.messages.getLongPollHistory(ts=self.ts, pts=self.pts) - msgs = new['messages'] - self.pts = new["new_pts"] - count = msgs[0] - - res = [] - if count == 0: - pass - else: - messages = msgs[1:] - for m in messages: - res.append(m) - return res - - -def get_session(token): - return vk.Session(access_token=token) - - -def get_tses(session): - api = vk.API(session) - - ts = api.messages.getLongPollServer(need_pts=1) - return ts['ts'], ts['pts']