Advertisement
stuppid_bot

Untitled

Jan 19th, 2016
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.07 KB | None | 0 0
  1. from .access_token import AccessToken
  2. import logging
  3. import urllib.parse
  4.  
  5.  
  6. class Authorization:
  7.     """Осуществляет прямую авторизацию <https://vk.com/dev/auth_direct>"""
  8.     AUTH_HOST = "https://oauth.vk.com"
  9.     AUTH_PATH = "/token"
  10.     GRANT_TYPE = "password"
  11.  
  12.     def __init__(self,
  13.                  client,
  14.                  client_id,
  15.                  client_secret,
  16.                  scope=None,
  17.                  username=None,
  18.                  password=None,
  19.                  test_redirect_uri=None):
  20.         """Description goes here
  21.  
  22.        :param client,:
  23.        :type client,:
  24.  
  25.        :param client_id,:
  26.        :type client_id,:
  27.  
  28.        :param client_secret,:
  29.        :type client_secret,:
  30.  
  31.        :param scope:
  32.        :type scope:
  33.  
  34.        :param username:
  35.        :type username:
  36.  
  37.        :param password:
  38.        :type password:
  39.  
  40.        :param test_redirect_uri:
  41.        :type test_redirect_uri:
  42.        """
  43.         self.logger = logging.getLogger(
  44.             ".".join([self.__class__.__module__, self.__class__.__name__]))
  45.         self.client = client
  46.         self.client_id = client_id
  47.         self.client_secret = client_secret
  48.         self.scope = scope
  49.         self.username = username
  50.         self.password = password
  51.         self.test_redirect_uri = test_redirect_uri
  52.  
  53.     def authorize(self, username=None, password=None):
  54.         self.username = username or self.username
  55.         self.password = password or self.password
  56.         if self.username is None:
  57.             raise AttributeError("username is not set")
  58.         if self.password is None:
  59.             raise AttributeError("password is not set")
  60.         params = dict(
  61.             username=self.username,
  62.             password=self.password
  63.         )
  64.         if self.test_redirect_uri:
  65.             params['test_redirect_uri']
  66.         self.do_auth(params)
  67.  
  68.     @property
  69.     def auth_url(self):
  70.         return urllib.parse.urljoin(self.AUTH_HOST, self.AUTH_PATH)
  71.  
  72.     def do_auth(self, add_params={}):
  73.         params = self.get_auth_params(add_params)
  74.         response = self.client.get(self.auth_url, params)
  75.         if 'error' in response:
  76.             self.process_error_response(response, add_params)
  77.             return
  78.         self.logger.debug(response)
  79.         self.client.access_token = AccessToken(
  80.             token=response.access_token,
  81.             user_id=response.user_id,
  82.             secret=response.get('secret')
  83.         )
  84.         self.logger.info("Successfully authorized")
  85.  
  86.     def process_error_response(self, response, add_params):
  87.         """Можно переопределить в классах потомках, а можно что-то типа этого
  88.        сделать:
  89.  
  90.        def process_error_response(self, response, add_params):
  91.            if response.error == AuthError.NEED_CAPTCHA
  92.                # Получаем captcha_key
  93.                ...
  94.                add_params.update({
  95.                    "captcha_key": captcha_key,
  96.                    "captcha_sid": response.captcha_sid
  97.                })
  98.                self.do_auth(add_params)
  99.                return
  100.            super().process_error_response(response, add_params)
  101.  
  102.        """
  103.         raise AuthError(response)
  104.  
  105.     def get_auth_params(self, add_params={}):
  106.         params = dict(
  107.             grant_type=self.GRANT_TYPE,
  108.             v=self.client.api_version,
  109.             client_id=self.client_id,
  110.             client_secret=self.client_secret
  111.         )
  112.         if self.scope:
  113.             params['scope'] = self.scope
  114.         if add_params:
  115.             params.update(add_params)
  116.         return params
  117.  
  118.  
  119. class AuthError(Exception):
  120.     NEED_CAPTCHA = 'need_captcha'
  121.     NEED_VALIDATON = 'need_validation'
  122.  
  123.     def __init__(self, response):
  124.         self.error_type = response.error
  125.         self.error_description = response.get('error_description')
  126.  
  127.     def __str__(self):
  128.         return "{}: {}".format(self.error_type, self.error_description) \
  129.             if self.error_description else self.error_type
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement