Support for message forwarding and handling forwared messages

This commit is contained in:
Kylmakalle 2017-06-25 02:00:56 +03:00
parent a909ca55d9
commit 125baec439
2 changed files with 121 additions and 64 deletions

99
bot.py
View File

@ -96,6 +96,7 @@ def stop_command(message):
@bot.message_handler(commands=['start'])
def start_command(message):
# TODO: Dialogs Menu
if check_thread(message.from_user.id):
bot.send_message(message.chat.id,
'Привет, этот бот поможет тебе общаться ВКонтакте, войди по кнопке ниже'
@ -105,15 +106,35 @@ def start_command(message):
bot.send_message(message.chat.id, 'Вход уже выполнен!\n/stop для выхода.').wait()
def form_request(message, method, info):
if int(info[2]):
if message.text.startswith('!'):
if len(message.text) - 1:
message.text = message.text[1:]
if info[1] != 'None':
method(message, info[1], group=True, forward_messages=info[1])
else:
method(message, info[1], group=True)
else:
method(message, info[1], group=True)
else:
if message.text.startswith('!'):
if len(message.text) - 1:
message.text = message.text[1:]
if info[1] != 'None':
method(message, info[0], group=False, forward_messages=info[1])
else:
method(message, info[1], group=True)
else:
method(message, info[0], group=False)
def vk_sender(message, method):
if message.reply_to_message:
if vk_tokens.get(str(message.from_user.id)):
info = info_extractor(message.reply_to_message.entities)
if info is not None:
if int(info[1]):
method(message, info[1], group=True)
else:
method(message, info[0], group=False)
form_request(message, method, info)
else:
bot.send_message(message.chat.id, 'Вход не выполнен! /start для входа').wait()
@ -125,15 +146,15 @@ def audio_title_creator(message, performer=None, title=None):
return '{} - {}'.format(performer, title)
def send_text(message, userid, group):
def send_text(message, userid, group, forward_messages=None):
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
if group:
vk.API(session).messages.send(chat_id=userid, message=message.text)
vk.API(session).messages.send(chat_id=userid, message=message.text, forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, message=message.text)
vk.API(session).messages.send(user_id=userid, message=message.text, forward_messages=forward_messages)
def send_doc(message, userid, group):
def send_doc(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
file = wget.download(
@ -177,23 +198,27 @@ def send_doc(message, userid, group):
vk.API(session).messages.send(chat_id=userid, message=message.caption,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']))
attachment[0]['did']),
forward_messages=forward_messages)
else:
vk.API(session).messages.send(chat_id=userid,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']))
attachment[0]['did']),
forward_messages=forward_messages)
else:
if message.caption:
vk.API(session).messages.send(user_id=userid, message=message.caption,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']))
attachment[0]['did']),
forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']))
attachment[0]['did']),
forward_messages=forward_messages)
def send_photo(message, userid, group):
def send_photo(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
file = wget.download(
@ -206,19 +231,23 @@ def send_photo(message, userid, group):
hash=fileonserver['hash'])
if group:
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'])
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'])
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
if message.caption:
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'])
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'])
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
openedfile.close()
os.remove(file)
def send_sticker(message, userid, group):
def send_sticker(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
file = wget.download(
@ -232,20 +261,24 @@ def send_sticker(message, userid, group):
hash=fileonserver['hash'])
if group:
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'])
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'])
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
if message.caption:
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'])
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'])
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
openedfile.close()
os.remove('{}.png'.format(file))
os.remove(file)
def send_video(message, userid, group):
def send_video(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
@ -260,34 +293,36 @@ def send_video(message, userid, group):
files=files).text)
video = 'video{}_{}'.format(attachment['owner_id'], attachment['owner_id']['video_id'])
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=video)
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=video,
forward_messages=forward_messages)
else:
vk.API(session).messages.send(chat_id=userid, attachment=video)
vk.API(session).messages.send(chat_id=userid, attachment=video, forward_messages=forward_messages)
else:
attachment = vk.API(session).video.save(is_private=1)
fileonserver = ujson.loads(requests.post(attachment['upload_url'],
files=files).text)
video = 'video{}_{}'.format(attachment['owner_id'], attachment['vid'])
if message.caption:
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=video)
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=video,
forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, attachment=video)
vk.API(session).messages.send(user_id=userid, attachment=video, forward_messages=forward_messages)
openedfile.close()
os.remove(file)
def send_contact(message, userid, group):
def send_contact(message, userid, group, forward_messages=None):
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
if message.contact.last_name:
text = 'Контакт: {} {}'.format(message.contact.first_name, message.contact.last_name)
else:
text = 'Контакт: {}'.format(message.contact.first_name)
if group:
vk.API(session).messages.send(chat_id=userid, message=text)
vk.API(session).messages.send(chat_id=userid, message=message.contact)
vk.API(session).messages.send(chat_id=userid, message=text, forward_messages=forward_messages)
vk.API(session).messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, message=text)
vk.API(session).messages.send(chat_id=userid, message=message.contact)
vk.API(session).messages.send(user_id=userid, message=text, forward_messages=forward_messages)
vk.API(session).messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
@bot.message_handler(content_types=['document', 'voice', 'audio'])

View File

@ -3,6 +3,7 @@ import time
import requests
import wget
import os
import ujson
class VkPolling:
@ -28,22 +29,29 @@ class VkPolling:
break
def handle_messages(m, vk_user, bot, chat_id):
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:
if 'body' in m and not 'attachment' in m and not 'geo' in m and not 'fwd_messages' in m:
data = add_reply_info(m, user["first_name"], user["last_name"])
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
if 'attachment' in m:
attachment_handler(m, user, bot, chat_id)
attachment_handler(m, user, bot, chat_id, mainmessage)
if 'geo' in m:
data = add_reply_info(m, user["first_name"], user["last_name"])
geo = bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
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()
if 'fwd_messages' in m:
data = add_reply_info(m, user["first_name"], user["last_name"]) + '<i>Пересланные сообщения</i>'
reply = bot.send_message(chat_id, data, parse_mode='HTML',
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):
@ -52,27 +60,27 @@ def handle_updates(vk_user, bot, chat_id, updates):
handle_messages(m, vk_user, bot, chat_id)
def attachment_handler(m, user, bot, chat_id):
def attachment_handler(m, user, bot, chat_id, mainmessage=None):
if m['attachment']['type'] == 'photo':
for photo in m['attachments']:
data = add_reply_info(m, user['first_name'], user['last_name']) + '<a href="{}">Фото</a>'.format(
get_max_src(photo['photo']))
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
if m['attachment']['type'] == 'video':
for vid in m['attachments']:
link = 'https://vk.com/video{}_{}'.format(vid['video']['owner_id'],
vid['video']['vid'])
data = add_reply_info(m, user['first_name'], user['last_name']) + '<a href="{}">Видео</a>'.format(link)
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
if m['attachment']['type'] == 'audio':
for audio in m['attachments']:
data = add_reply_info(m, user['first_name'], user['last_name']) + '🎵 <code>{} - {}</code>'.format(
audio['audio']['artist'],
audio['audio']['title'])
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
if m['attachment']['type'] == 'doc':
for doc in m['attachments']:
if doc['doc']['ext'] == 'gif':
@ -81,9 +89,9 @@ def attachment_handler(m, user, bot, chat_id):
data = add_reply_info(m, user["first_name"], user["last_name"]) + '<a href="{}">GIF</a>'.format(
link)
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
except:
send_doc_link(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
elif doc['doc']['ext'] == 'pdf' or doc['doc']['ext'] == 'zip':
try:
@ -92,22 +100,23 @@ def attachment_handler(m, user, bot, chat_id):
user["last_name"], ) + '<a href="{}">Документ</a>'.format(
link)
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
except:
send_doc_link(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
elif doc['doc']['ext'] == 'jpg' or doc['doc']['ext'] == 'png':
try:
link = doc['doc']['url']
data = add_reply_info(m, user["first_name"], user["last_name"], ) + '<i>Документ</i>'
notification = bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
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(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
elif doc['doc']['ext'] == 'ogg':
try:
@ -115,15 +124,16 @@ def attachment_handler(m, user, bot, chat_id):
data = add_reply_info(m, user["first_name"], user["last_name"], ) + \
'<a href="{}">Аудио</a>'.format(link)
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
except:
send_doc_link(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
elif doc['doc']['ext'] == 'doc' or doc['doc']['ext'] == 'docx':
try:
data = add_reply_info(m, user["first_name"], user["last_name"], ) + '<i>Документ</i>'
notification = bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
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(doc['doc']['url']).url)
bot.send_document(chat_id, open(file, 'rb'),
@ -133,44 +143,56 @@ def attachment_handler(m, user, bot, chat_id):
file.close()
os.remove(file)
except:
send_doc_link(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
else:
send_doc_link(doc, m, user, bot, chat_id)
send_doc_link(doc, m, user, bot, chat_id, mainmessage)
if m['attachment']['type'] == 'sticker':
link = m['attachment']['sticker']['photo_512']
data = add_reply_info(m, user["first_name"], user["last_name"], ) + '<a href="{}">Стикер</a>'.format(link)
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
disable_notification=check_notification(m), reply_to_message_id=mainmessage).wait()
# TODO: Wall Posts and comments
def send_doc_link(doc, m, user, bot, chat_id):
def send_doc_link(doc, m, user, bot, chat_id, mainmessage=None):
link = doc['doc']['url']
data = add_reply_info(m, user["first_name"], user["last_name"]) + \
'<i>Документ</i>\n<a href="{}">{}</a>'.format(link,
doc['doc']['title'] + '.' + doc['doc']['ext'])
bot.send_message(chat_id, data, parse_mode='HTML',
disable_notification=check_notification(m)).wait()
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, first_name, last_name):
if m['body']:
if 'chat_id' in m:
# TODO: Handle forwared messages
return '<a href="x{}.{}">&#8203;</a><b>{} {} @ {}:</b>\n{}\n'.format(m['uid'], m['chat_id'], first_name,
last_name, m['title'],
m['body'].replace('<br>', '\n'))
return '<a href="x{}.{}.{}">&#8203;</a><b>{} {} @ {}:</b>\n{}\n'.format(m['uid'], m['chat_id'],
check_forward_id(m),
first_name,
last_name, m['title'],
m['body'].replace('<br>', '\n'))
else:
return '<a href="x{}.0">&#8203;</a><b>{} {}:</b>\n{}\n'.format(m['uid'], first_name, last_name,
m['body'].replace('<br>', '\n'))
return '<a href="x{}.{}.0">&#8203;</a><b>{} {}:</b>\n{}\n'.format(m['uid'], check_forward_id(m), first_name,
last_name,
m['body'].replace('<br>', '\n'))
else:
if 'chat_id' in m:
return '<a href="x{}.{}">&#8203;</a><b>{} {} @ {}:</b>\n'.format(m['uid'], m['chat_id'], first_name,
last_name, m['title'])
return '<a href="x{}.{}.{}">&#8203;</a><b>{} {} @ {}:</b>\n'.format(m['uid'], m['chat_id'],
check_forward_id(m),
first_name,
last_name, m['title'])
else:
return '<a href="x{}.0">&#8203;</a><b>{} {}:</b>\n'.format(m['uid'], first_name, last_name)
return '<a href="x{}.{}.0">&#8203;</a><b>{} {}:</b>\n'.format(m['uid'], check_forward_id(m), first_name,
last_name)
def check_notification(value):