commit
1c5866b88d
103
bot.py
103
bot.py
@ -70,6 +70,8 @@ def replace_shields(text):
|
|||||||
def request_user_dialogs(session, userid):
|
def request_user_dialogs(session, userid):
|
||||||
order = []
|
order = []
|
||||||
users_ids = []
|
users_ids = []
|
||||||
|
group_ids = []
|
||||||
|
positive_group_ids = []
|
||||||
dialogs = vk.API(session).messages.getDialogs(count=200)
|
dialogs = vk.API(session).messages.getDialogs(count=200)
|
||||||
for chat in dialogs[1:]:
|
for chat in dialogs[1:]:
|
||||||
if 'chat_id' in chat:
|
if 'chat_id' in chat:
|
||||||
@ -80,14 +82,28 @@ def request_user_dialogs(session, userid):
|
|||||||
elif chat['uid'] > 0:
|
elif chat['uid'] > 0:
|
||||||
order.append({'title': None, 'id': chat['uid']})
|
order.append({'title': None, 'id': chat['uid']})
|
||||||
users_ids.append(chat['uid'])
|
users_ids.append(chat['uid'])
|
||||||
|
elif chat['uid'] < 0:
|
||||||
|
order.append({'title': None, 'id': chat['uid']})
|
||||||
|
group_ids.append(chat['uid'])
|
||||||
|
|
||||||
|
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'])
|
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=[])
|
||||||
for output in order:
|
for output in order:
|
||||||
if output['title'] == ' ... ' or not output['title']:
|
if output['title'] == ' ... ' or not output['title']:
|
||||||
for x in users:
|
if output['id'] > 0:
|
||||||
if x['uid'] == output['id']:
|
for x in users:
|
||||||
current_user = x
|
if x['uid'] == output['id']:
|
||||||
break
|
output['title'] = '{} {}'.format(x['first_name'], x['last_name'])
|
||||||
output['title'] = '{} {}'.format(current_user['first_name'], current_user['last_name'])
|
break
|
||||||
|
|
||||||
|
else:
|
||||||
|
for f in groups:
|
||||||
|
if str(f['gid']) == str(output['id'])[1:]:
|
||||||
|
output['title'] = '{}'.format(f['name'])
|
||||||
|
break
|
||||||
for button in range(len(order)):
|
for button in range(len(order)):
|
||||||
order[button] = types.InlineKeyboardButton(order[button]['title'], callback_data=str(order[button]['id']))
|
order[button] = types.InlineKeyboardButton(order[button]['title'], callback_data=str(order[button]['id']))
|
||||||
rows = [order[x:x + 2] for x in range(0, len(order), 2)]
|
rows = [order[x:x + 2] for x in range(0, len(order), 2)]
|
||||||
@ -139,8 +155,13 @@ def search_users(message, text):
|
|||||||
def callback_buttons(call):
|
def callback_buttons(call):
|
||||||
if call.message:
|
if call.message:
|
||||||
if 'page' in call.data:
|
if 'page' in call.data:
|
||||||
|
try:
|
||||||
|
create_markup(call.message, call.from_user.id, int(call.data.split('page')[1]), True)
|
||||||
|
except:
|
||||||
|
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
|
||||||
|
request_user_dialogs(session, call.from_user.id)
|
||||||
|
create_markup(call.message, call.from_user.id, int(call.data.split('page')[1]), True)
|
||||||
bot.answer_callback_query(call.id).wait()
|
bot.answer_callback_query(call.id).wait()
|
||||||
create_markup(call.message, call.from_user.id, int(call.data.split('page')[1]), True)
|
|
||||||
elif 'search' in call.data:
|
elif 'search' in call.data:
|
||||||
markup = types.ForceReply(selective=False)
|
markup = types.ForceReply(selective=False)
|
||||||
bot.answer_callback_query(call.id, 'Поиск беседы 🔍').wait()
|
bot.answer_callback_query(call.id, 'Поиск беседы 🔍').wait()
|
||||||
@ -157,15 +178,20 @@ def callback_buttons(call):
|
|||||||
'<i>Вы в беседе {}</i>'.format(chat['title']),
|
'<i>Вы в беседе {}</i>'.format(chat['title']),
|
||||||
parse_mode='HTML').wait()
|
parse_mode='HTML').wait()
|
||||||
currentchat[str(call.from_user.id)] = call.data
|
currentchat[str(call.from_user.id)] = call.data
|
||||||
elif call.data.isdigit():
|
elif call.data.lstrip('-').isdigit():
|
||||||
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
|
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
|
||||||
user = vk.API(session).users.get(user_ids=call.data, fields=[])[0]
|
if '-' in call.data:
|
||||||
|
user = vk.API(session).groups.getById(group_id=call.data.lstrip('-'), fields=[])[0]
|
||||||
|
user = {'first_name': user['name'], 'last_name': ''}
|
||||||
|
else:
|
||||||
|
user = vk.API(session).users.get(user_ids=call.data, fields=[])[0]
|
||||||
bot.answer_callback_query(call.id,
|
bot.answer_callback_query(call.id,
|
||||||
'Вы в чате с {} {}'.format(user['first_name'], user['last_name'])).wait()
|
'Вы в чате с {} {}'.format(user['first_name'], user['last_name'])).wait()
|
||||||
bot.send_message(call.from_user.id,
|
bot.send_message(call.from_user.id,
|
||||||
'<i>Вы в чате с {} {}</i>'.format(user['first_name'], user['last_name']),
|
'<i>Вы в чате с {} {}</i>'.format(user['first_name'], user['last_name']),
|
||||||
parse_mode='HTML').wait()
|
parse_mode='HTML').wait()
|
||||||
currentchat[str(call.from_user.id)] = call.data
|
currentchat[str(call.from_user.id)] = {'title': user['first_name'] + ' ' + user['last_name'],
|
||||||
|
'id': call.data}
|
||||||
|
|
||||||
|
|
||||||
def create_thread(uid, vk_token):
|
def create_thread(uid, vk_token):
|
||||||
@ -190,13 +216,20 @@ def check_thread(uid):
|
|||||||
def thread_supervisor():
|
def thread_supervisor():
|
||||||
while True:
|
while True:
|
||||||
for uid in vk_tokens.scan_iter():
|
for uid in vk_tokens.scan_iter():
|
||||||
if check_thread(uid.decode("utf-8")):
|
tries = 0
|
||||||
try:
|
while check_thread(uid.decode("utf-8")):
|
||||||
create_thread(uid.decode("utf-8"), vk_tokens.get(uid))
|
if tries < 6:
|
||||||
request_user_dialogs(VkMessage(vk_tokens.get(uid.decode("utf-8"))).session, uid.decode("utf-8"))
|
try:
|
||||||
except requests.exceptions.ReadTimeout as e:
|
create_thread(uid.decode("utf-8"), vk_tokens.get(uid))
|
||||||
time.sleep(10)
|
except:
|
||||||
time.sleep(120)
|
tries = tries + 1
|
||||||
|
else:
|
||||||
|
mark = types.InlineKeyboardMarkup()
|
||||||
|
login = types.InlineKeyboardButton('ВХОД', url=link)
|
||||||
|
mark.add(login)
|
||||||
|
bot.send_message(uid.decode("utf-8"), '<b>Непредвиденная ошибка, требуется повторный логин ВК!</b>',
|
||||||
|
parse_mode='HTML', reply_markup=mark)
|
||||||
|
time.sleep(60)
|
||||||
|
|
||||||
|
|
||||||
supervisor = threading.Thread(name='supervisor', target=thread_supervisor)
|
supervisor = threading.Thread(name='supervisor', target=thread_supervisor)
|
||||||
@ -238,21 +271,17 @@ def info_extractor(info):
|
|||||||
def chat_command(message):
|
def chat_command(message):
|
||||||
if logged(message):
|
if logged(message):
|
||||||
if str(message.from_user.id) in currentchat:
|
if str(message.from_user.id) in currentchat:
|
||||||
if 'group' in currentchat[str(message.from_user.id)]:
|
if 'group' in currentchat[str(message.from_user.id)]['id']:
|
||||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
chat = currentchat[str(message.from_user.id)]
|
||||||
chat = vk.API(session).messages.getChat(
|
|
||||||
chat_id=currentchat[str(message.from_user.id)].split('group')[1],
|
|
||||||
fields=[])
|
|
||||||
if chat['title'].replace('\\', ''):
|
if chat['title'].replace('\\', ''):
|
||||||
chat['title'] = chat['title'].replace('\\', '')
|
chat['title'] = chat['title'].replace('\\', '')
|
||||||
bot.send_message(message.from_user.id,
|
bot.send_message(message.from_user.id,
|
||||||
'<i>Вы в беседе {}</i>'.format(chat['title']),
|
'<i>Вы в беседе {}</i>'.format(chat['title']),
|
||||||
parse_mode='HTML').wait()
|
parse_mode='HTML').wait()
|
||||||
else:
|
else:
|
||||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
chat = currentchat[str(message.from_user.id)]
|
||||||
user = vk.API(session).users.get(user_ids=currentchat[str(message.from_user.id)], fields=[])[0]
|
|
||||||
bot.send_message(message.from_user.id,
|
bot.send_message(message.from_user.id,
|
||||||
'<i>Вы в чате с {} {}</i>'.format(user['first_name'], user['last_name']),
|
'<i>Вы в чате с {}</i>'.format(chat['title']),
|
||||||
parse_mode='HTML').wait()
|
parse_mode='HTML').wait()
|
||||||
else:
|
else:
|
||||||
bot.send_message(message.from_user.id,
|
bot.send_message(message.from_user.id,
|
||||||
@ -368,12 +397,12 @@ def vk_sender(message, method):
|
|||||||
|
|
||||||
elif str(message.from_user.id) in currentchat:
|
elif str(message.from_user.id) in currentchat:
|
||||||
info = []
|
info = []
|
||||||
if 'group' in currentchat[str(message.from_user.id)]:
|
if 'group' in currentchat[str(message.from_user.id)]['id']:
|
||||||
info.append('0')
|
info.append('0')
|
||||||
info.append(currentchat[str(message.from_user.id)].split('group')[1])
|
info.append(currentchat[str(message.from_user.id)]['id'].split('group')[1])
|
||||||
info.append('1')
|
info.append('1')
|
||||||
else:
|
else:
|
||||||
info.append(currentchat[str(message.from_user.id)])
|
info.append(currentchat[str(message.from_user.id)]['id'])
|
||||||
info.append('0')
|
info.append('0')
|
||||||
info.append('0')
|
info.append('0')
|
||||||
form_request(message, method, info)
|
form_request(message, method, info)
|
||||||
@ -397,9 +426,9 @@ def send_text(message, userid, group, forward_messages=None):
|
|||||||
def send_doc(message, userid, group, forward_messages=None):
|
def send_doc(message, userid, group, forward_messages=None):
|
||||||
filetype = message.content_type
|
filetype = message.content_type
|
||||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||||
file = wget.download(
|
if filetype == 'document' and 'video' not in message.document.mime_type:
|
||||||
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
file = wget.download(
|
||||||
if filetype == 'document':
|
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||||
openedfile = open(file, 'rb')
|
openedfile = open(file, 'rb')
|
||||||
files = {'file': openedfile}
|
files = {'file': openedfile}
|
||||||
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
|
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
|
||||||
@ -411,6 +440,8 @@ def send_doc(message, userid, group, forward_messages=None):
|
|||||||
os.remove(file)
|
os.remove(file)
|
||||||
|
|
||||||
elif filetype == 'voice':
|
elif filetype == 'voice':
|
||||||
|
file = wget.download(
|
||||||
|
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||||
openedfile = open(file, 'rb')
|
openedfile = open(file, 'rb')
|
||||||
files = {'file': openedfile}
|
files = {'file': openedfile}
|
||||||
fileonserver = ujson.loads(
|
fileonserver = ujson.loads(
|
||||||
@ -421,7 +452,13 @@ def send_doc(message, userid, group, forward_messages=None):
|
|||||||
openedfile.close()
|
openedfile.close()
|
||||||
os.remove(file)
|
os.remove(file)
|
||||||
|
|
||||||
|
elif filetype == 'document' and 'video' in message.document.mime_type:
|
||||||
|
vk_sender(message, send_video)
|
||||||
|
return
|
||||||
|
|
||||||
else: # filetype == 'audio':
|
else: # filetype == 'audio':
|
||||||
|
file = wget.download(
|
||||||
|
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||||
newfile = file.split('.')[0] + '.aac'
|
newfile = file.split('.')[0] + '.aac'
|
||||||
os.rename(file, newfile)
|
os.rename(file, newfile)
|
||||||
openedfile = open(newfile, 'rb')
|
openedfile = open(newfile, 'rb')
|
||||||
@ -582,7 +619,7 @@ def reply_sticker(message):
|
|||||||
except Exception:
|
except Exception:
|
||||||
bot.reply_to(message, '*Произошла неизвестная ошибка при отправке*',
|
bot.reply_to(message, '*Произошла неизвестная ошибка при отправке*',
|
||||||
parse_mode='Markdown').wait() # TODO?: Bugreport system
|
parse_mode='Markdown').wait() # TODO?: Bugreport system
|
||||||
logging.exception('Error: {}'.format(traceback.format_exc()))
|
print('Error: {}'.format(traceback.format_exc()))
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(content_types=['photo'])
|
@bot.message_handler(content_types=['photo'])
|
||||||
@ -610,7 +647,7 @@ def reply_contact(message):
|
|||||||
except Exception:
|
except Exception:
|
||||||
bot.reply_to(message, '*Произошла неизвестная ошибка при отправке*',
|
bot.reply_to(message, '*Произошла неизвестная ошибка при отправке*',
|
||||||
parse_mode='Markdown').wait()
|
parse_mode='Markdown').wait()
|
||||||
logging.exception('Error: {}'.format(traceback.format_exc()))
|
print('Error: {}'.format(traceback.format_exc()))
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(content_types=['text'])
|
@bot.message_handler(content_types=['text'])
|
||||||
@ -641,7 +678,7 @@ def reply_text(message):
|
|||||||
except Exception:
|
except Exception:
|
||||||
bot.reply_to(message, 'Произошла неизвестная ошибка при отправке',
|
bot.reply_to(message, 'Произошла неизвестная ошибка при отправке',
|
||||||
parse_mode='Markdown').wait()
|
parse_mode='Markdown').wait()
|
||||||
logging.exception('Error: {}'.format(traceback.format_exc()))
|
print('Error: {}'.format(traceback.format_exc()))
|
||||||
|
|
||||||
|
|
||||||
# bot.polling(none_stop=True)
|
# bot.polling(none_stop=True)
|
||||||
|
@ -4,6 +4,7 @@ import redis
|
|||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
import vk
|
import vk
|
||||||
|
import ujson
|
||||||
import wget
|
import wget
|
||||||
|
|
||||||
logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log')
|
logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log')
|
||||||
@ -20,14 +21,14 @@ class VkPolling:
|
|||||||
|
|
||||||
def run(self, vk_user, bot, chat_id):
|
def run(self, vk_user, bot, chat_id):
|
||||||
while self._running:
|
while self._running:
|
||||||
timeout = 50
|
timeout = 30
|
||||||
try:
|
try:
|
||||||
updates = vk_user.get_new_messages()
|
updates = vk_user.get_new_messages()
|
||||||
if updates:
|
if updates:
|
||||||
handle_updates(vk_user, bot, chat_id, updates)
|
handle_updates(vk_user, bot, chat_id, updates)
|
||||||
except requests.exceptions.ReadTimeout:
|
except requests.exceptions.ReadTimeout:
|
||||||
timeout *= 2
|
logging.warning('Retrying VK Polling.')
|
||||||
logging.warning('Retrying VK Polling in {} seconds.'.format(int(timeout / 10)))
|
timeout = 0
|
||||||
for i in range(timeout):
|
for i in range(timeout):
|
||||||
if self._running:
|
if self._running:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
@ -36,7 +37,12 @@ class VkPolling:
|
|||||||
|
|
||||||
|
|
||||||
def handle_messages(m, vk_user, bot, chat_id, mainmessage=None):
|
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 m['uid'] > 0:
|
||||||
|
user = vk.API(vk_user.session).users.get(user_ids=m["uid"], fields=[])[0]
|
||||||
|
else:
|
||||||
|
group = vk.API(vk_user.session).groups.getById(group_ids=str(m['uid'])[1:])[0]
|
||||||
|
user = {'first_name': group['name'], 'last_name': None}
|
||||||
|
|
||||||
if 'body' in m and not 'attachment' in m and not 'geo' in m and not 'fwd_messages' in m:
|
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)
|
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,
|
bot.send_message(chat_id, data, parse_mode='HTML', disable_web_page_preview=False,
|
||||||
@ -244,15 +250,29 @@ def add_reply_info(m):
|
|||||||
|
|
||||||
def add_user_info(m, first_name, last_name):
|
def add_user_info(m, first_name, last_name):
|
||||||
if 'body' in m and m['body']:
|
if 'body' in m and m['body']:
|
||||||
if 'chat_id' in m:
|
if last_name:
|
||||||
return '<b>{} {} @ {}:</b>\n{}\n'.format(first_name, last_name, m['title'], m['body'].replace('<br>', '\n'))
|
if 'chat_id' in m:
|
||||||
|
return '<b>{} {} @ {}:</b>\n{}\n'.format(first_name, last_name, m['title'],
|
||||||
|
m['body'].replace('<br>', '\n'))
|
||||||
|
else:
|
||||||
|
return '<b>{} {}:</b>\n{}\n'.format(first_name, last_name, m['body'].replace('<br>', '\n'))
|
||||||
else:
|
else:
|
||||||
return '<b>{} {}:</b>\n{}\n'.format(first_name, last_name, m['body'].replace('<br>', '\n'))
|
if 'chat_id' in m:
|
||||||
|
return '<b>{} @ {}:</b>\n{}\n'.format(first_name, m['title'],
|
||||||
|
m['body'].replace('<br>', '\n'))
|
||||||
|
else:
|
||||||
|
return '<b>{}:</b>\n{}\n'.format(first_name, m['body'].replace('<br>', '\n'))
|
||||||
else:
|
else:
|
||||||
if 'chat_id' in m:
|
if last_name:
|
||||||
return '<b>{} {} @ {}:</b>\n'.format(first_name, last_name, m['title'])
|
if 'chat_id' in m:
|
||||||
|
return '<b>{} {} @ {}:</b>\n'.format(first_name, last_name, m['title'])
|
||||||
|
else:
|
||||||
|
return '<b>{} {}:</b>\n'.format(first_name, last_name)
|
||||||
else:
|
else:
|
||||||
return '<b>{} {}:</b>\n'.format(first_name, last_name)
|
if 'chat_id' in m:
|
||||||
|
return '<b>{} @ {}:</b>\n'.format(first_name, m['title'])
|
||||||
|
else:
|
||||||
|
return '<b>{}:</b>\n'.format(first_name)
|
||||||
|
|
||||||
|
|
||||||
def check_notification(value):
|
def check_notification(value):
|
||||||
@ -282,13 +302,15 @@ class VkMessage:
|
|||||||
|
|
||||||
api = vk.API(self.session)
|
api = vk.API(self.session)
|
||||||
try:
|
try:
|
||||||
new = api.messages.getLongPollHistory(ts=self.ts, pts=self.pts)
|
ts_pts = ujson.dumps({"ts": self.ts, "pts": self.pts})
|
||||||
except:
|
new = api.execute(code='return API.messages.getLongPollHistory({});'.format(ts_pts))
|
||||||
|
except vk.api.VkAPIError:
|
||||||
timeout = 3
|
timeout = 3
|
||||||
logging.warning('Retrying getLongPollHistory in {} seconds'.format(timeout))
|
logging.warning('Retrying getLongPollHistory in {} seconds'.format(timeout))
|
||||||
time.sleep(timeout)
|
time.sleep(timeout)
|
||||||
self.ts, self.pts = get_tses(self.session)
|
self.ts, self.pts = get_tses(self.session)
|
||||||
new = api.messages.getLongPollHistory(ts=self.ts, pts=self.pts)
|
ts_pts = ujson.dumps({"ts": self.ts, "pts": self.pts})
|
||||||
|
new = api.execute(code='return API.messages.getLongPollHistory({});'.format(ts_pts))
|
||||||
|
|
||||||
msgs = new['messages']
|
msgs = new['messages']
|
||||||
self.pts = new["new_pts"]
|
self.pts = new["new_pts"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user