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 f014708..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 = {}
@@ -75,8 +79,6 @@ def request_user_dialogs(session, userid):
dialogs = vk.API(session).messages.getDialogs(count=200)
for chat in dialogs[1:]:
if 'chat_id' in chat:
- if chat['title'].replace('\\', ''):
- chat['title'] = chat['title'].replace('\\', '')
chat['title'] = replace_shields(chat['title'])
order.append({'title': chat['title'], 'id': 'group' + str(chat['chat_id'])})
elif chat['uid'] > 0:
@@ -89,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:
@@ -136,8 +146,6 @@ def search_users(message, text):
markup.add(types.InlineKeyboardButton('{} {}'.format(chat['first_name'], chat['last_name']),
callback_data=str(chat['uid'])))
elif chat['type'] == 'chat':
- if chat['title'].replace('\\', ''):
- chat['title'] = chat['title'].replace('\\', '')
markup.add(
types.InlineKeyboardButton(replace_shields(chat['title']),
callback_data='group' + str(chat['chat_id'])))
@@ -172,8 +180,6 @@ def callback_buttons(call):
chat = vk.API(session).messages.getChat(chat_id=call.data.split('group')[1], fields=[])
bot.answer_callback_query(call.id,
'Вы в беседе {}'.format(replace_shields(chat['title']))).wait()
- if chat['title'].replace('\\', ''):
- chat['title'] = chat['title'].replace('\\', '')
bot.send_message(call.from_user.id,
'Вы в беседе {}'.format(chat['title']),
parse_mode='HTML').wait()
@@ -213,22 +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 < 6:
- try:
- create_thread(uid.decode("utf-8"), vk_tokens.get(uid))
- except:
- 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)
+ 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)
@@ -273,8 +288,6 @@ def chat_command(message):
if str(message.from_user.id) in currentchat:
if 'group' in currentchat[str(message.from_user.id)]['id']:
chat = currentchat[str(message.from_user.id)]
- if chat['title'].replace('\\', ''):
- chat['title'] = chat['title'].replace('\\', '')
bot.send_message(message.from_user.id,
'Вы в беседе {}'.format(chat['title']),
parse_mode='HTML').wait()
@@ -683,6 +696,7 @@ def reply_text(message):
# bot.polling(none_stop=True)
class WebhookServer(object):
+
# index равнозначно /, т.к. отсутствию части после ip-адреса (грубо говоря)
@cherrypy.expose
def index(self):
diff --git a/vk_messages.py b/vk_messages.py
index 4755be0..53e9d7c 100644
--- a/vk_messages.py
+++ b/vk_messages.py
@@ -102,7 +102,7 @@ def attachment_handler(m, user, bot, chat_id, mainmessage=None):
elif attach['type'] == 'audio':
data = add_user_info(m, user['first_name'], user[
- 'last_name']) + '🎵 {} - {}'.format(
+ 'last_name']) + '🎧 {} - {}'.format(
attach['audio']['artist'].replace(' ', '%20'),
attach['audio']['title'].replace(' ', '%20'), attach['audio']['artist'],
attach['audio']['title']) + add_reply_info(m)