diff --git a/README.md b/README.md index b0fdc09..6ca404a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ # tgvkbot Бот позволяет получать и отправлять сообщения VK находясь в Telegram + Поддерживаются вебхуки и лонгполлинг, закомментируйте и раскомментируйте нужные строки + Настройка вебхуков по гайду от [@Groosha](https://www.gitbook.com/book/groosha/telegram-bot-lessons) + [Использование](https://www.asergey.me/tgvkbot/usage) + diff --git a/bot.py b/bot.py index dcdd8fc..1c18e64 100644 --- a/bot.py +++ b/bot.py @@ -1,21 +1,25 @@ import logging import os import re -import redis import requests import telebot import threading +import time import traceback import ujson +from telebot import types + +import redis import vk import wget -import time from PIL import Image + from telebot import types import cherrypy from credentials import token, vk_app_id, bot_url, local_port + from vk_messages import VkMessage, VkPolling vk_threads = {} @@ -87,8 +91,16 @@ def request_user_dialogs(session, userid): for g in group_ids: positive_group_ids.append(str(g)[1:]) - users = vk.API(session).users.get(user_ids=users_ids, fields=['first_name', 'last_name', 'uid']) - groups = vk.API(session).groups.getById(group_ids=positive_group_ids, fields=[]) + if users_ids: + users = vk.API(session).users.get(user_ids=users_ids, fields=['first_name', 'last_name', 'uid']) + else: + users = [] + + if positive_group_ids: + groups = vk.API(session).groups.getById(group_ids=positive_group_ids, fields=[]) + else: + groups = [] + for output in order: if output['title'] == ' ... ' or not output['title']: if output['id'] > 0: @@ -207,24 +219,31 @@ def check_thread(uid): # Creating VkPolling threads and dialogs info after bot's reboot/exception using existing tokens +def thread_reviver(uid): + tries = 0 + while check_thread(uid.decode("utf-8")): + if tries < 4: + try: + create_thread(uid.decode("utf-8"), vk_tokens.get(uid)) + except: + time.sleep(10) + tries = tries + 1 + else: + mark = types.InlineKeyboardMarkup() + login = types.InlineKeyboardButton('ВХОД', url=link) + mark.add(login) + bot.send_message(uid.decode("utf-8"), 'Непредвиденная ошибка, требуется повторный логин ВК!', + parse_mode='HTML', reply_markup=mark).wait() + break + + def thread_supervisor(): while True: for uid in vk_tokens.scan_iter(): - tries = 0 - while check_thread(uid.decode("utf-8")): - if tries < 3: - try: - create_thread(uid.decode("utf-8"), vk_tokens.get(uid)) - except: - time.sleep(10) - tries = tries + 1 - else: - mark = types.InlineKeyboardMarkup() - login = types.InlineKeyboardButton('ВХОД', url=link) - mark.add(login) - bot.send_message(uid.decode("utf-8"), 'Непредвиденная ошибка, требуется повторный логин ВК!', - parse_mode='HTML', reply_markup=mark).wait() - break + reviver_thread = threading.Thread(name='reviver' + str(uid.decode('utf-8')), target=thread_reviver, + args=(uid,)) + reviver_thread.setDaemon(True) + reviver_thread.start() time.sleep(60) @@ -677,6 +696,7 @@ def reply_text(message): # bot.polling(none_stop=True) class WebhookServer(object): + # index равнозначно /, т.к. отсутствию части после ip-адреса (грубо говоря) @cherrypy.expose def index(self):