stuppid_bot

Untitled

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