This commit is contained in:
Kylmakalle 2018-02-07 22:11:21 +03:00
parent 8afba01113
commit 82afba28a2
2 changed files with 97 additions and 83 deletions

161
bot.py
View File

@ -21,6 +21,8 @@ vk_threads = {}
vk_dialogs = {}
VK_API_VERSION = '3.0'
FILE_URL = 'https://api.telegram.org/file/bot{0}/{1}'
tokens_pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
@ -33,7 +35,7 @@ bot.remove_webhook()
link = 'https://oauth.vk.com/authorize?client_id={}&' \
'display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,messages,offline,docs,photos,video' \
'&response_type=token&v=5.65'.format(vk_app_id)
'&response_type=token&v={}'.format(vk_app_id, VK_API_VERSION)
def get_pages_switcher(markup, page, pages):
@ -71,7 +73,8 @@ def request_user_dialogs(session, userid):
users_ids = []
group_ids = []
positive_group_ids = []
dialogs = vk.API(session).messages.getDialogs(count=200)
api = vk.API(session, v=VK_API_VERSION)
dialogs = api.messages.getDialogs(count=200)
for chat in dialogs[1:]:
if 'chat_id' in chat:
chat['title'] = replace_shields(chat['title'])
@ -87,12 +90,12 @@ def request_user_dialogs(session, userid):
positive_group_ids.append(str(g)[1:])
if users_ids:
users = vk.API(session).users.get(user_ids=users_ids, fields=['first_name', 'last_name', 'uid'])
users = api.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=[])
groups = api.groups.getById(group_ids=positive_group_ids, fields=[])
else:
groups = []
@ -134,8 +137,9 @@ def create_markup(message, user, page, edit=False):
def search_users(message, text):
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
markup = types.InlineKeyboardMarkup(row_width=1)
result = vk.API(session).messages.searchDialogs(q=text, limit=10, fields=[])
result = api.messages.searchDialogs(q=text, limit=10, fields=[])
for chat in result:
if chat['type'] == 'profile':
markup.add(types.InlineKeyboardButton('{} {}'.format(chat['first_name'], chat['last_name']),
@ -172,7 +176,8 @@ def callback_buttons(call):
parse_mode='HTML', reply_markup=markup).wait()
elif 'group' in call.data:
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
chat = vk.API(session).messages.getChat(chat_id=call.data.split('group')[1], fields=[])
api = vk.API(session, v=VK_API_VERSION)
chat = api.messages.getChat(chat_id=call.data.split('group')[1], fields=[])
bot.answer_callback_query(call.id,
'Вы в беседе {}'.format(replace_shields(chat['title']))).wait()
bot.send_message(call.from_user.id,
@ -181,11 +186,12 @@ def callback_buttons(call):
currentchat[str(call.from_user.id)] = {'title': chat['title'], 'id': 'group' + str(chat['chat_id'])}
elif call.data.lstrip('-').isdigit():
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
if '-' in call.data:
user = vk.API(session).groups.getById(group_id=call.data.lstrip('-'), fields=[])[0]
user = api.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]
user = api.users.get(user_ids=call.data, fields=[])[0]
bot.answer_callback_query(call.id,
'Вы в чате с {} {}'.format(user['first_name'], user['last_name'])).wait()
bot.send_message(call.from_user.id,
@ -203,7 +209,9 @@ def create_thread(uid, vk_token):
t.start()
vk_threads[str(uid)] = a
vk_tokens.set(str(uid), vk_token)
vk.API(longpoller.session).account.setOffline()
session = longpoller.session
api = vk.API(session, v=VK_API_VERSION)
api.account.setOffline()
def check_thread(uid):
@ -268,7 +276,7 @@ def extract_unique_code(text):
def verifycode(code):
session = vk.Session(access_token=code)
api = vk.API(session)
api = vk.API(session, v=VK_API_VERSION)
return dict(api.account.getProfileInfo(fields=[]))
@ -425,25 +433,27 @@ def audio_title_creator(message, performer=None, title=None):
def send_text(message, userid, group, forward_messages=None):
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
if group:
vk.API(session).messages.send(chat_id=userid, message=message.text, forward_messages=forward_messages)
api.messages.send(chat_id=userid, message=message.text, forward_messages=forward_messages)
else:
vk.API(session).messages.send(user_id=userid, message=message.text, forward_messages=forward_messages)
api.messages.send(user_id=userid, message=message.text, forward_messages=forward_messages)
def send_doc(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
if filetype == 'document' and 'video' not in message.document.mime_type:
file = wget.download(
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
openedfile = open(file, 'rb')
files = {'file': openedfile}
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
fileonserver = ujson.loads(requests.post(api.docs.getUploadServer()['upload_url'],
files=files).text)
attachment = vk.API(session).docs.save(file=fileonserver['file'],
title=getattr(message, filetype).file_name,
tags='')
attachment = api.docs.save(file=fileonserver['file'],
title=getattr(message, filetype).file_name,
tags='')
openedfile.close()
os.remove(file)
@ -453,10 +463,10 @@ def send_doc(message, userid, group, forward_messages=None):
openedfile = open(file, 'rb')
files = {'file': openedfile}
fileonserver = ujson.loads(
requests.post(vk.API(session).docs.getUploadServer(type='audio_message')['upload_url'],
requests.post(api.docs.getUploadServer(type='audio_message')['upload_url'],
files=files).text)
attachment = vk.API(session).docs.save(file=fileonserver['file'], title='Аудиосообщение',
tags='')
attachment = api.docs.save(file=fileonserver['file'], title='Аудиосообщение',
tags='')
openedfile.close()
os.remove(file)
@ -471,64 +481,65 @@ def send_doc(message, userid, group, forward_messages=None):
os.rename(file, newfile)
openedfile = open(newfile, 'rb')
files = {'file': openedfile}
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
fileonserver = ujson.loads(requests.post(api.docs.getUploadServer()['upload_url'],
files=files).text)
attachment = vk.API(session).docs.save(file=fileonserver['file'],
title=audio_title_creator(message, message.audio.performer,
message.audio.title), tags='')
attachment = api.docs.save(file=fileonserver['file'],
title=audio_title_creator(message, message.audio.performer,
message.audio.title), tags='')
openedfile.close()
os.remove(newfile)
if group:
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']),
forward_messages=forward_messages)
api.messages.send(chat_id=userid, message=message.caption,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
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']),
forward_messages=forward_messages)
api.messages.send(chat_id=userid,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
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']),
forward_messages=forward_messages)
api.messages.send(user_id=userid, message=message.caption,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
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']),
forward_messages=forward_messages)
api.messages.send(user_id=userid,
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
attachment[0]['did']),
forward_messages=forward_messages)
def send_photo(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
file = wget.download(
FILE_URL.format(token, bot.get_file(getattr(message, filetype)[-1].file_id).wait().file_path))
openedfile = open(file, 'rb')
files = {'file': openedfile}
fileonserver = ujson.loads(requests.post(vk.API(session).photos.getMessagesUploadServer()['upload_url'],
fileonserver = ujson.loads(requests.post(api.photos.getMessagesUploadServer()['upload_url'],
files=files).text)
attachment = vk.API(session).photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
hash=fileonserver['hash'])
attachment = api.photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
hash=fileonserver['hash'])
if group:
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.messages.send(user_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
openedfile.close()
os.remove(file)
@ -536,29 +547,30 @@ def send_photo(message, userid, group, forward_messages=None):
def send_sticker(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
file = wget.download(
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
Image.open(file).save("{}.png".format(file))
openedfile = open('{}.png'.format(file), 'rb')
files = {'file': openedfile}
fileonserver = ujson.loads(requests.post(vk.API(session).photos.getMessagesUploadServer()['upload_url'],
fileonserver = ujson.loads(requests.post(api.photos.getMessagesUploadServer()['upload_url'],
files=files).text)
attachment = vk.API(session).photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
hash=fileonserver['hash'])
attachment = api.photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
hash=fileonserver['hash'])
if group:
if message.caption:
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.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'],
forward_messages=forward_messages)
api.messages.send(user_id=userid, attachment=attachment[0]['id'],
forward_messages=forward_messages)
openedfile.close()
os.remove('{}.png'.format(file))
os.remove(file)
@ -567,48 +579,49 @@ def send_sticker(message, userid, group, forward_messages=None):
def send_video(message, userid, group, forward_messages=None):
filetype = message.content_type
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
file = wget.download(
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
openedfile = open(file, 'rb')
files = {'video_file': openedfile}
if group:
attachment = vk.API(session).video.save(is_private=1)
attachment = api.video.save(is_private=1)
fileonserver = ujson.loads(requests.post(attachment['upload_url'],
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,
forward_messages=forward_messages)
api.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, forward_messages=forward_messages)
api.messages.send(chat_id=userid, attachment=video, forward_messages=forward_messages)
else:
attachment = vk.API(session).video.save(is_private=1)
attachment = api.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,
forward_messages=forward_messages)
api.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, forward_messages=forward_messages)
api.messages.send(user_id=userid, attachment=video, forward_messages=forward_messages)
openedfile.close()
os.remove(file)
def send_contact(message, userid, group, forward_messages=None):
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
api = vk.API(session, v=VK_API_VERSION)
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, forward_messages=forward_messages)
vk.API(session).messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
api.messages.send(chat_id=userid, message=text, forward_messages=forward_messages)
api.messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
else:
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)
api.messages.send(user_id=userid, message=text, forward_messages=forward_messages)
api.messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
@bot.message_handler(content_types=['document', 'voice', 'audio'])

View File

@ -7,6 +7,8 @@ import vk
import ujson
import wget
VK_POLLING_VERSION = '3.0'
logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log')
tokens_pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
vk_tokens = redis.StrictRedis(connection_pool=tokens_pool)
@ -37,10 +39,11 @@ class VkPolling:
def handle_messages(m, vk_user, bot, chat_id, mainmessage=None):
api = vk.API(vk_user.session, v=VK_POLLING_VERSION)
if m['uid'] > 0:
user = vk.API(vk_user.session).users.get(user_ids=m["uid"], fields=[])[0]
user = api.users.get(user_ids=m["uid"], fields=[])[0]
else:
group = vk.API(vk_user.session).groups.getById(group_ids=str(m['uid'])[1:])[0]
group = api.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:
@ -199,8 +202,8 @@ def attachment_handler(m, user, bot, chat_id, mainmessage=None):
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]
api = vk.API(get_session(vk_tokens.get(str(chat_id))), v=VK_POLLING_VERSION)
user = api.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('<br>', '\n') + add_reply_info(m)
@ -300,7 +303,7 @@ class VkMessage:
def get_new_messages(self):
api = vk.API(self.session)
api = vk.API(self.session, v=VK_POLLING_VERSION)
try:
ts_pts = ujson.dumps({"ts": self.ts, "pts": self.pts})
new = api.execute(code='return API.messages.getLongPollHistory({});'.format(ts_pts))
@ -320,9 +323,7 @@ class VkMessage:
if count == 0:
pass
else:
messages = msgs[1:]
for m in messages:
res.append(m)
res = msgs[1:]
return res
@ -331,7 +332,7 @@ def get_session(token):
def get_tses(session):
api = vk.API(session)
api = vk.API(session, v=VK_POLLING_VERSION)
ts = api.messages.getLongPollServer(need_pts=1)
return ts['ts'], ts['pts']