Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import os
- import re
- import time
- import mimetypes
- import requests
- import urlparse
- from errors import *
- API_VERSION = 5.27
- # Для приложений есть лимиты обращения к API (https://vk.com/dev/api_requests).
- # Чтобы избежать возникновения ошибки в результате частого обращения к API,
- # мы будем задерживать возвращение ответа от сервера.
- API_DELAY = 0.34
- # Ставим что-нибудь менее палевное чем "python-requests/2.5.0 CPython/2.7.9
- # Windows/8"
- USER_AGENT = "Mozilla 5.0"
- class Api(object):
- def __init__(self, access_token=None, api_version=API_VERSION,
- api_delay=API_DELAY, session=None):
- self.access_token = access_token
- self.api_version = api_version
- self.api_delay = api_delay
- if session is None:
- session = requests.session()
- session.headers['User-Agent'] = USER_AGENT
- self.session = session
- def request(self, method, url, **kwargs):
- u"""Отправляет запрос и возвращает результат парсинга JSON."""
- response = self.session.request(method, url, **kwargs)
- try:
- return response.json()
- except ValueError:
- return False
- # Позволяет обращаться к методам Вконтакте API как к методам класса.
- # Например, <object Api>.users.get(**params), что аналогично вызову
- # <object Api>.api('users.get', params). Список методов Вконтакте API
- # см. здесь (https://vk.com/dev/methods).
- def __getattr__(self, name):
- return ApiMethod(self, name)
- def api(self, method, params={}):
- u"""Отправялет запрос."""
- params = dict(params)
- if self.access_token and not 'access_token' in params:
- params['access_token'] = self.access_token
- if self.api_version and not 'v' in params:
- params['v'] = self.api_version
- url = 'https://api.vk.com/method/{}'.format(method)
- response = self.request('POST', url, data=params)
- if self.api_delay:
- time.sleep(self.api_delay)
- if 'error' in response:
- error = response['error']
- code = error['error_code']
- if code == 5:
- error = AuthorizationFailed(error)
- elif code == 6:
- error = TooManyRequests(error)
- elif code == 9:
- error = FloodControl(error)
- elif code == 10:
- error = InternalError(error)
- elif code == 14:
- error = CaptchaNeeded(error)
- return self.captchaHandler(error)
- elif code == 15:
- error = AccessDenied(error)
- elif code == 17:
- error = ValidationRequired(error)
- return self.validationHandler(error)
- elif code == 113:
- error = InvalidUserId(error)
- elif code == 200:
- error = AlbumAccessDenied(error)
- elif code == 201:
- error = AudioAccessDenied(error)
- elif code == 203:
- error = GroupAccessDenied(error)
- elif code == 300:
- error = AlbumFull(error)
- else:
- error = ApiError(error)
- raise error
- return response['response']
- def captchaHandler(self, error):
- # params = error.params
- # captcha_key = self.solveCaptcha(error.captcha_img)
- # params['captcha_key'] = captcha_key
- # params['captcha_sid'] = error.captcha_sid
- # return self.api(error.method, params)
- raise error
- def validationHandler(self, error):
- raise error
- def upload(self, server_url, files):
- u"""
- Загружает файлы на сервер.
- :param url: Адрес сервера для загрузки файлов.
- :param files: Словарь, где "имя поля" => "путь до файла"(может быть
- ссылкой).
- """
- files = dict(files)
- for fieldname, filename in files.items():
- content_type, encoding = mimetypes.guess_type(filename)
- if re.match('(?i)https?://', filename):
- r = self.session.get(filename)
- content = r.content
- # path/to/file?query -> path/to/file
- filename = urlparse.urlparse(filename).path
- else:
- fp = open(filename, 'rb')
- content = fp.read()
- fp.close()
- # path/to/file -> file
- filename = os.path.basename(filename)
- files[fieldname] = (filename, content,
- content_type or 'application/octeat-stream')
- response = self.request('POST', server_url, files=files)
- return response
- class ApiMethod(object):
- def __init__(self, client, name):
- self.client = client
- self.name = name
- def __call__(self, *args, **kwargs):
- if len(args):
- kwargs.update(args[0])
- return self.client.api(self.name, kwargs)
- def __getattr__(self, name):
- return ApiMethod(self.client, self.name + '.' + name)
- if __name__ == '__main__':
- a = Api()
- r = a.users.get(user_id = 1)
- print u"ID {id}: {first_name} {last_name}".format(**r[0])
- raw_input("Press Enter to exit.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement