Removed VK module from repo. Install it via pip. Custom modules has been moved to mysc
This commit is contained in:
152
src/mysc/longpoll.py
Normal file
152
src/mysc/longpoll.py
Normal 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
144
src/mysc/upload.py
Normal 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()
|
Reference in New Issue
Block a user