Advertisement
stuppid_bot

Untitled

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