Removed VK module from repo. Install it via pip. Custom modules has been moved to mysc

This commit is contained in:
2018-09-02 08:38:49 -05:00
parent c7743fccb9
commit d1fd6d1861
14 changed files with 14 additions and 593 deletions

152
src/mysc/longpoll.py Normal file
View File

@@ -0,0 +1,152 @@
# encoding: utf-8
import requests
class LongPoll(object):
def __init__(self, vk, wait=25, use_ssl=True, mode=34):
self.vk = vk
self.wait = wait
self.use_ssl = use_ssl
self.mode = mode
self.get_longpoll_server()
self.url = 'https' if use_ssl else 'http'
self.url += '://' + self.server
def get_longpoll_server(self, update_ts=True):
values = {
'use_ssl': '1' if self.use_ssl else '0',
'need_pts': '1'
}
response = self.vk.messages.getLongPollServer(**values)
self.key = response['key']
self.server = response['server']
if update_ts:
self.ts = response['ts']
self.pts = response['pts']
def check(self):
values = {
'act': 'a_check',
'key': self.key,
'ts': self.ts,
'wait': self.wait,
'mode': self.mode
}
response = requests.get(self.url, params=values,
timeout=self.wait + 10).json()
events = []
if 'failed' not in response:
self.ts = response['ts']
self.pts = response['pts']
for raw_event in response['updates']:
events.append(Event(raw_event))
# http://vk.com/dev/using_longpoll
else:
self.get_longpoll_server(update_ts=False)
return events
CHAT_START_ID = int(2E9)
EVENT_TYPES = {
0: 'message_delete',
1: 'message_flags_replace',
2: 'message_flags_put',
3: 'message_flags_reset',
4: 'message_new',
8: 'user_online',
9: 'user_offline',
51: 'chat_new',
61: 'user_typing',
62: 'user_typing_in_chat',
70: 'user_call',
}
ASSOCIATIVES = {
0: ['message_id'],
1: ['message_id', 'flags'],
2: ['message_id', 'mask', 'user_id'],
3: ['message_id', 'mask', 'user_id', 'timestamp', 'subject',
'text', 'attachments'],
4: ['message_id', 'flags', 'from_id', 'timestamp', 'subject',
'text', 'attachments'],
8: ['user_id', 'flags'],
9: ['user_id', 'flags'],
51: ['chat_id', 'byself'],
61: ['user_id', 'flags'],
62: ['user_id', 'chat_id'],
70: ['user_id', 'call_id'],
}
MESSAGE_FLAGS = [
'unread', 'outbox', 'replied', 'important', 'chat', 'friends', 'spam',
'deleted', 'fixed', 'media'
]
class Event(object):
def __init__(self, raw):
self.raw = raw
self.message_id = None
self.flags = None
self.mask = None
self.user_id = None
self.from_id = None
self.timestamp = None
self.subject = None
self.text = None
self.attachments = None
self.call_id = None
self.chat_id = None
self.byself = None
cmd = raw[0]
self.message_flags = {}
self.type = EVENT_TYPES.get(cmd)
self._list_to_attr(raw[1:], ASSOCIATIVES.get(cmd))
if cmd == 4:
self._parse_message_flags()
self.text = self.text.replace('<br>', '\n')
if self.from_id > CHAT_START_ID:
self.chat_id = self.from_id - CHAT_START_ID
self.from_id = self.attachments['from']
elif cmd in [2, 3]:
if self.user_id > CHAT_START_ID:
self.chat_id = self.user_id - CHAT_START_ID
self.user_id = None
elif cmd in [8, 9]:
self.user_id = abs(self.user_id)
def _parse_message_flags(self):
x = 1
for i in MESSAGE_FLAGS:
if self.flags & x:
self.message_flags.update({i: True})
x *= 2
def _list_to_attr(self, l, associative):
if not associative:
return
for i in range(len(l)):
try:
name = associative[i]
except IndexError:
return True
value = l[i]
self.__setattr__(name, value)

144
src/mysc/upload.py Normal file
View File

@@ -0,0 +1,144 @@
# -*- coding: utf-8 -*-
import requests
class VkUpload(object):
def __init__(self, vk):
"""
:param vk: объект VkApi
"""
self.vk = vk
# https://vk.com/dev/upload_files
self.session = requests.session()
def photo(self, photos, album_id,
latitude=None, longitude=None, caption=None, description=None,
group_id=None):
""" Загрузка изображений в альбом пользователя
:param photos: список путей к изображениям, либо путь к изображению
:param album_id: идентификатор альбома
:param latitude: географическая широта, заданная в градусах
(от -90 до 90)
:param longitude: географическая долгота, заданная в градусах
(от -180 до 180)
:param caption: текст описания изображения
:param description: текст описания альбома
:param group_id: идентификатор сообщества (если загрузка идет в группу)
"""
values = {'album_id': album_id}
if group_id:
values['group_id'] = group_id
# Получаем ссылку для загрузки
url = self.vk.photos.getUploadServer(**values)['upload_url']
# Загружаем
photos_files = open_photos(photos)
response = self.session.post(url, files=photos_files).json()
close_photos(photos_files)
# Олег Илларионов:
# это не могу к сожалению просто пофиксить
if 'album_id' not in response:
response['album_id'] = response['aid']
response.update({
'latitude': latitude,
'longitude': longitude,
'caption': caption,
'description': description
})
values.update(response)
# Сохраняем фото в альбоме
response = self.vk.photos.save(values)
return response
def photo_messages(self, photos):
""" Загрузка изображений в сообщения
:param photos: список путей к изображениям, либо путь к изображению
"""
url = self.vk.method('photos.getMessagesUploadServer')
url = url['upload_url']
photos_files = open_photos(photos)
response = self.vk.http.post(url, files=photos_files)
close_photos(photos_files)
response = self.vk.method('photos.saveMessagesPhoto', response.json())
return response
def photo_wall(self, photos, user_id=None, group_id=None, caption="No description"):
""" Загрузка изображений на стену пользователя или в группу
:param photos: список путей к изображениям, либо путь к изображению
:param user_id: идентификатор пользователя
:param group_id: идентификатор сообщества (если загрузка идет в группу)
"""
values = {}
if user_id:
values['user_id'] = user_id
elif group_id:
values['group_id'] = group_id
response = self.vk.photos.getWallUploadServer(**values)
url = response['upload_url']
photos_files = open_photos(photos)
response = self.session.post(url, files=photos_files)
close_photos(photos_files)
values.update(response.json())
response = self.vk.photos.saveWallPhoto(**values)
return response
def document(self, file_path, title=None, tags=None, group_id=None):
""" Загрузка документа
:param file_path: путь к документу
:param title: название документа
:param tags: метки для поиска
:param group_id: идентификатор сообщества (если загрузка идет в группу)
"""
values = {'group_id': group_id}
url = self.vk.docs.getUploadServer(values)['upload_url']
with open(file_path, 'rb') as file:
response = self.session.post(url, files={'file': file}).json()
response.update({
'title': title,
'tags': tags
})
response = self.vk.method('docs.save', response)
return response
def open_photos(photos_paths):
if not isinstance(photos_paths, list):
photos_paths = [photos_paths]
photos = []
for x, filename in enumerate(photos_paths):
filetype = filename.split('.')[-1]
photos.append(
('file%s' % x, ('pic.' + filetype, open(filename, 'rb')))
)
return photos
def close_photos(photos):
for photo in photos:
photo[1][1].close()