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
- 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 Client(object):
- def __init__(self, access_token=None, api_version=API_VERSION,
- api_delay=API_DELAY, user_agent=USER_AGENT):
- self.access_token = access_token
- self.api_version = api_version
- self.api_delay = api_delay
- self.session = requests.session()
- self.session.headers['User-Agent'] = user_agent
- def request(self, method, url, **kwargs):
- u"""Отправляет запрос и возвращает результат парсинга JSON."""
- return self.session.request(method, url, **kwargs).json()
- def api(self, method, params={}):
- u"""Отправялет запрос к API."""
- 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 = ApiError(response['error'])
- if error.code == 14:
- return self.captchaHandler(error)
- elif error.code == 17:
- return self.validationHandler(error)
- raise error
- return response['response']
- # Позволяет обращаться к методам Вконтакте 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 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('POST', server_url, files=files)
- return response
- def __str__(self):
- return "[{}] {}".format(self.code, self.message)
- 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)
- class ApiError(Exception):
- def __init__(self, details):
- self.code = details['error_code']
- self.message = details['error_msg']
- self.captcha_sid = details.get('captcha_sid')
- self.captcha_img = details.get('captcha_img')
- self.redirect_uri = 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)
- if __name__ == '__main__':
- client = Client()
- r = client.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