From 82afba28a2d41a5101b6bd2d5c3fb8eb1e3b2685 Mon Sep 17 00:00:00 2001 From: Kylmakalle Date: Wed, 7 Feb 2018 22:11:21 +0300 Subject: [PATCH] https://vk.com/dev/version_update --- bot.py | 161 ++++++++++++++++++++++++++----------------------- vk_messages.py | 19 +++--- 2 files changed, 97 insertions(+), 83 deletions(-) diff --git a/bot.py b/bot.py index a41030c..8d2a778 100644 --- a/bot.py +++ b/bot.py @@ -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']) diff --git a/vk_messages.py b/vk_messages.py index 53e9d7c..27183b6 100644 --- a/vk_messages.py +++ b/vk_messages.py @@ -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('
', '\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']