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 sys import api_version
- DEFAULT_API_VERSION = 5.27
- # Для приложений есть лимиты обращения к API (https://vk.com/dev/api_requests).
- # Чтобы избежать возникновения ошибки в результате частого обращения к API,
- # мы будем задерживать возвращение ответа от сервера.
- DEFAULT_API_DELAY = 0.34
- DEFAULT_USER_AGENT = "Mozilla/5.0"
- class Client(object):
- def __init__(self, access_token=None, api_version=None,\
- api_delay=None, timeout=None):
- self.accessToken = access_token
- if api_version is None:
- api_version = DEFAULT_API_VERSION
- self.apiVersion = api_version
- if api_delay is None:
- api_delay = DEFAULT_API_DELAY
- self.apiDelay = api_delay
- self.timeout = timeout
- self.session = requests.session()
- self.session.headers['User-Agent'] = DEFAULT_USER_AGENT
- def request(self, url, params=None, files=None):
- u"""Отправляет запрос и возвращает ответ в виде результата парсинга
- JSON либо строки."""
- method = 'POST' if params or files else 'GET'
- response = self.session.request(method, url, data=params, files=files,
- timeout=self.timeout)
- try:
- return response.json()
- except ValueError:
- return response.text
- def api(self, method, params={}):
- u"""Отправляет запрос к API.
- :param method: Имя метода.
- :param params: (optional) Параметры запроса.
- :return: Значение поля ``response``.
- """
- params = dict(params)
- if self.accessToken and not 'access_token' in params:
- params['access_token'] = self.accessToken
- if self.apiVersion and not 'v' in params:
- params['v'] = self.apiVersion
- url = 'https://api.vk.com/method/{}'.format(method)
- response = self.request(url, params)
- if self.apiDelay:
- time.sleep(self.apiDelay)
- if 'error' in response:
- error = ApiError(response['error'])
- if error.code == 14:
- return self.captchaHandler(error)
- elif error.code == 17:
- return self.validationHandler(error)
- raise error
- return response['response']
- def __getattr__(self, name):
- return ApiMethod(self, name)
- def captchaHandler(self, error):
- 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
- # http://example.com/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(server_url, files=files)
- return response
- class ApiMethod(object):
- def __init__(self, client, method):
- print method
- self.client = client
- self.method = method
- def __call__(self, *args, **kwargs):
- if len(args):
- kwargs.update(args[0])
- return self.client.api(self.method, kwargs)
- def __getattr__(self, name):
- return ApiMethod(self.client, self.method + '.' + name)
- class ApiError(Exception):
- def __init__(self, details):
- self.code = details['error_code']
- self.message = details['error_msg']
- self.captchaSid = details.get('captcha_sid')
- self.captchaImg = details.get('captcha_img')
- self.redirectUri = details.get('redirect_uri')
- params = {param['key']: param['value']
- for param in details['request_params']}
- self.oauth = params.pop('oauth')
- self.method = params.pop('method')
- self.params = params
- def __str__(self):
- return "[{}] {}".format(self.code, self.message)
Advertisement
Add Comment
Please, Sign In to add comment