def oauth2_authorization(self): """ OAuth2 """ auth_data = { 'client_id': self.app_id, 'display': 'mobile', 'response_type': 'token', 'scope': self.scope, 'v': '5.28', 'redirect_uri': self.redirect_uri, } response = self.auth_session.post(self.AUTHORIZE_URL, auth_data) response_url_query = get_url_query(response.url) if 'access_token' in response_url_query: return response_url_query # Permissions is needed logger.info('Getting permissions') form_action = get_form_action(response.text) logger.debug('Response form action: %s', form_action) if form_action: response = self.auth_session.get(form_action) response_url_query = get_url_query(response.url) return response_url_query try: response_json = response.json() except ValueError: # not JSON in response error_message = 'OAuth2 grant access error' else: error_message = 'VK error: [{}] {}'.format(response_json['error'], response_json['error_description']) logger.error('Permissions obtained') raise VkAuthError(error_message)
def login(self): """ Login """ response = self.auth_session.get(self.LOGIN_URL) login_form_action = get_form_action(response.text) if not login_form_action: raise VKAuthError('VK changed login flow') login_form_data = { 'email': self.user_login, 'pass': self.user_password, } response = self.auth_session.post(login_form_action, login_form_data) logger.debug('Cookies: %s', self.auth_session.cookies) response_url_query = get_url_query(response.url) if 'remixsid' in self.auth_session.cookies or 'remixsid6' in self.auth_session.cookies: return if 'sid' in response_url_query: self.auth_captcha_is_needed(response, login_form_data) elif response_url_query.get('act') == 'authcheck': self.auth_check_is_needed(response.text) elif 'security_check' in response_url_query: self.phone_number_is_needed(response.text) else: message = 'Authorization error (incorrect password)' logger.error(message) raise VKAuthError(message)
def oauth2_authorization(self): """ OAuth2 """ auth_data = { 'client_id': self.app_id, 'display': 'mobile', 'response_type': 'token', 'scope': self.scope, 'v': '5.28', } response = self.auth_session.post(self.AUTHORIZE_URL, auth_data) response_url_query = get_url_query(response.url) if 'access_token' in response_url_query: return response_url_query # Permissions is needed logger.info('Getting permissions') # form_action = re.findall(r'<form method="post" action="(.+?)">', auth_response.text)[0] form_action = get_form_action(response.text) logger.debug('Response form action: %s', form_action) if form_action: response = self.auth_session.get(form_action) response_url_query = get_url_query(response.url) return response_url_query try: response_json = response.json() except ValueError: # not JSON in response error_message = 'OAuth2 grant access error' else: error_message = 'VK error: [{}] {}'.format(response_json['error'], response_json['error_description']) logger.error('Permissions obtained') raise VKAuthError(error_message)
def login(self): """ Login """ response = self.auth_session.get(self.LOGIN_URL) login_form_action = get_form_action(response.text) if not login_form_action: raise VkAuthError('VK changed login flow') login_form_data = { 'email': self.user_login, 'pass': self.user_password, } response = self.auth_session.post(login_form_action, login_form_data) logger.debug('Cookies: %s', self.auth_session.cookies) response_url_query = get_url_query(response.url) if 'remixsid' in self.auth_session.cookies or 'remixsid6' in self.auth_session.cookies: return if 'sid' in response_url_query: self.auth_captcha_is_needed(response, login_form_data) elif response_url_query.get('act') == 'authcheck': self.auth_check_is_needed(response.text) elif 'security_check' in response_url_query: self.phone_number_is_needed(response.text) else: message = 'Authorization error (incorrect password)' logger.error(message) raise VkAuthError(message)
def auth_check_is_needed(self, html): logger.info('User enabled 2 factors authorization. Auth check code is needed') auth_check_form_action = get_form_action(html) auth_check_code = self.get_auth_check_code() auth_check_data = { 'code': auth_check_code, '_ajax': '1', 'remember': '1' } response = self.auth_session.post(auth_check_form_action, data=auth_check_data)
def auth_check_is_needed(self, html): logger.info('User enabled 2 factors authorization. Auth check code is needed') auth_check_form_action = get_form_action(html) auth_check_code = self.get_auth_check_code() auth_check_data = { 'code': auth_check_code, '_ajax': '1', 'remember': '1' } self.auth_session.post(auth_check_form_action, data=auth_check_data)
def auth_captcha_is_needed(self, response, login_form_data): logger.info('Captcha is needed') response_url_dict = get_url_query(response.url) captcha_form_action = get_form_action(response.text) logger.debug('form_url %s', captcha_form_action) if not captcha_form_action: raise VkAuthError('Cannot find form url') # todo Are we sure that `response_url_dict` doesn't contain CAPTCHA image url? captcha_url = '%s?s=%s&sid=%s' % (self.CAPTCHA_URI, response_url_dict['s'], response_url_dict['sid']) login_form_data['captcha_sid'] = response_url_dict['sid'] login_form_data['captcha_key'] = self.get_captcha_key(captcha_url) self.auth_session.post(captcha_form_action, login_form_data)
def auth_captcha_is_needed(self, response, login_form_data): logger.info('Captcha is needed') response_url_dict = get_url_query(response.url) captcha_form_action = get_form_action(response.text) logger.debug('form_url %s', captcha_form_action) if not captcha_form_action: raise VkAuthError('Cannot find form url') captcha_url = '%s?s=%s&sid=%s' % ( self.CAPTCHA_URI, response_url_dict['s'], response_url_dict['sid']) login_form_data['captcha_sid'] = response_url_dict['sid'] login_form_data['captcha_key'] = self.get_captcha_key(captcha_url) response = self.auth_session.post(captcha_form_action, login_form_data)
def auth_captcha_is_needed(self, response, login_form_data): logger.info('Captcha is needed') response_url_dict = get_url_query(response.url) # form_url = re.findall(r'<form method="post" action="(.+)" novalidate>', response.text) captcha_form_action = get_form_action(response.text) logger.debug('form_url %s', captcha_form_action) if not captcha_form_action: raise VkAuthError('Cannot find form url') captcha_url = '%s?s=%s&sid=%s' % (self.CAPTCHA_URI, response_url_dict['s'], response_url_dict['sid']) # logger.debug('Captcha url %s', captcha_url) login_form_data['captcha_sid'] = response_url_dict['sid'] login_form_data['captcha_key'] = self.on_captcha_is_needed(captcha_url) response = self.auth_session.post(captcha_form_action, login_form_data)