Advertisement
stuppid_bot

Вконтакте Api Python

Dec 14th, 2014
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.18 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import re
  4. import time
  5. import mimetypes
  6. import requests
  7. import urlparse
  8.  
  9. API_VERSION = 5.27
  10. # Для приложений есть лимиты обращения к API (https://vk.com/dev/api_requests).
  11. # Чтобы избежать возникновения ошибки в результате частого обращения к API,
  12. # мы будем задерживать возвращение ответа от сервера.
  13. API_DELAY = 0.34
  14. # Ставим что-нибудь менее палевное чем "python-requests/2.5.0 CPython/2.7.9
  15. # Windows/8"
  16. USER_AGENT = "Mozilla 5.0"
  17.  
  18. class Client(object):
  19.     def __init__(self, access_token=None, api_version=API_VERSION,
  20.                  api_delay=API_DELAY, user_agent=USER_AGENT):
  21.         self.access_token = access_token
  22.         self.api_version = api_version
  23.         self.api_delay = api_delay
  24.         self.session = requests.session()
  25.         self.session.headers['User-Agent'] = user_agent
  26.        
  27.     def request(self, method, url, **kwargs):
  28.         u"""Отправляет запрос и возвращает результат парсинга JSON."""
  29.         return self.session.request(method, url, **kwargs).json()
  30.  
  31.     def api(self, method, params={}):
  32.         u"""Отправялет запрос к API."""
  33.         params = dict(params)
  34.  
  35.         if self.access_token and not 'access_token' in params:
  36.             params['access_token'] = self.access_token
  37.  
  38.         if self.api_version and not 'v' in params:
  39.             params['v'] = self.api_version
  40.            
  41.         url = 'https://api.vk.com/method/{}'.format(method)
  42.         response = self.request('POST', url, data=params)
  43.  
  44.         if self.api_delay:
  45.             time.sleep(self.api_delay)
  46.  
  47.         if 'error' in response:
  48.             error = ApiError(response['error'])
  49.            
  50.             if error.code == 14:
  51.                 return self.captchaHandler(error)
  52.             elif error.code == 17:
  53.                 return self.validationHandler(error)
  54.            
  55.             raise error
  56.  
  57.         return response['response']
  58.  
  59.     # Позволяет обращаться к методам Вконтакте API как к методам класса.
  60.     # Например, <object Api>.users.get(**params), что аналогично вызову
  61.     # <object Api>.api('users.get', params). Список методов Вконтакте API
  62.     # можно увидеть здесь (https://vk.com/dev/methods).
  63.     def __getattr__(self, name):
  64.         return ApiMethod(self, name)
  65.  
  66.     def captchaHandler(self, error):
  67.         raise error
  68.  
  69.     def validationHandler(self, error):
  70.         raise error
  71.  
  72.     def upload(self, server_url, files):
  73.         u"""
  74.        Загружает файлы на сервер.
  75.        
  76.        :param url: Адрес сервера для загрузки файлов.
  77.        :param files: Словарь, где "имя поля" => "путь до файла"(может быть
  78.            ссылкой).
  79.        """
  80.         files = dict(files)
  81.  
  82.         for fieldname, filename in files.items():
  83.             content_type, encoding = mimetypes.guess_type(filename)
  84.  
  85.             if re.match('(?i)https?://', filename):
  86.                 r = self.session.get(filename)
  87.                 content = r.content
  88.                 # http://example.com/path/to/file?query -> path/to/file
  89.                 filename = urlparse.urlparse(filename).path
  90.             else:
  91.                 fp = open(filename, 'rb')
  92.                 content = fp.read()
  93.                 fp.close()
  94.  
  95.             # path/to/file -> file
  96.             filename = os.path.basename(filename)
  97.             files[fieldname] = (filename, content,
  98.                                 content_type or 'application/octeat-stream')
  99.            
  100.         response = self.request('POST', server_url, files=files)    
  101.         return response
  102.  
  103.     def __str__(self):
  104.         return "[{}] {}".format(self.code, self.message)
  105.  
  106. class ApiMethod(object):
  107.     def __init__(self, client, name):
  108.         self.client = client
  109.         self.name = name
  110.  
  111.     def __call__(self, *args, **kwargs):
  112.         if len(args):
  113.             kwargs.update(args[0])
  114.  
  115.         return self.client.api(self.name, kwargs)
  116.  
  117.     def __getattr__(self, name):
  118.         return ApiMethod(self.client, self.name + '.' + name)
  119.    
  120. class ApiError(Exception):
  121.     def __init__(self, details):
  122.         self.code = details['error_code']
  123.         self.message = details['error_msg']
  124.         self.captcha_sid = details.get('captcha_sid')
  125.         self.captcha_img = details.get('captcha_img')
  126.         self.redirect_uri = details.get('redirect_uri')
  127.         params = {param['key']: param['value']
  128.                   for param in details['request_params']}
  129.         self.oauth = params.pop('oauth')
  130.         self.method = params.pop('method')
  131.         self.params = params
  132.    
  133.     def __str__(self):
  134.         return "[{}] {}".format(self.code, self.message)
  135.  
  136. if __name__ == '__main__':
  137.     client = Client()
  138.     r = client.users.get(user_id=1)
  139.     print u"ID {id}: {first_name} {last_name}".format(**r[0])
  140.     raw_input("Press Enter to exit.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement