def auth_captcha_is_needed(self, response, login_form_data, session): logger.info('Captcha is needed') logger.debug('Response url %s', response.url) parsed_url = urlparse(response.url) response_url_dict = dict(parse_qsl(parsed_url.query)) logger.debug('response_url_dict %s', response_url_dict) form_url = re.findall(r'<form method="post" action="(.+)" novalidate>', response.text) logger.debug('form_url %s', form_url) if not form_url: raise VkAuthorizationError('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.get_captcha_key(captcha_url) logger.debug('POST %s data %s', form_url[0], login_form_data) response = session.post(form_url[0], login_form_data) logger.debug('%s - %s', form_url[0], response.status_code) logger.debug('Cookies %s', session.cookies) if 'remixsid' not in session.cookies and 'remixsid6' not in session.cookies: raise VkAuthorizationError('Authorization error (Bad password or captcha key)')
def auth_captcha_is_needed(self, response, login_form_data, session): logger.info('Captcha is needed') logger.debug('Response url %s', response.url) parsed_url = urlparse(response.url) response_url_dict = dict(parse_qsl(parsed_url.query)) logger.debug('response_url_dict %s', response_url_dict) form_url = re.findall(r'<form method="post" action="(.+)" novalidate>', response.text) logger.debug('form_url %s', form_url) if not form_url: raise VkAuthorizationError('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.get_captcha_key(captcha_url) logger.debug('POST %s data %s', form_url[0], login_form_data) response = session.post(form_url[0], login_form_data) logger.debug('%s - %s', form_url[0], response.status_code) logger.debug('Cookies %s', session.cookies) if 'remixsid' not in session.cookies and 'remixsid6' not in session.cookies: raise VkAuthorizationError( 'Authorization error (Bad password or captcha key)')
def get_access_token(self): """ Get access token using user_login and user_password """ logger.info('Try to get access token via OAuth') if self.user_login and not self.user_password: # Need user password pass if not self.user_login and self.user_password: # Need user login pass auth_session = requests.Session() login_form_response = auth_session.get(self.LOGIN_URL) login_form_action = re.findall(r'<form ?.* action="(.+)"', login_form_response.text) if not login_form_action: raise VkAuthorizationError('vk.com changed login flow') # Login login_form_data = { 'email': self.user_login, 'pass': self.user_password, } response = auth_session.post(login_form_action[0], login_form_data) logger.info('Cookies %s', auth_session.cookies) logger.info('Login response url %s', response.url) if 'remixsid' in auth_session.cookies or 'remixsid6' in auth_session.cookies: pass elif 'sid=' in response.url: self.auth_captcha_is_needed(response.content, auth_session) elif 'act=authcheck' in response.url: self.auth_code_is_needed(response.content, auth_session) elif 'security_check' in response.url: self.phone_number_is_needed(response.content, auth_session) else: raise VkAuthorizationError('Authorization error (bad password)') # OAuth2 oauth_data = { 'response_type': 'token', 'client_id': self.app_id, 'scope': self.scope, 'display': 'mobile', } response = auth_session.post('https://oauth.vk.com/authorize', oauth_data) logger.info('OAuth URL: %s %s', response.request.url, oauth_data) if 'access_token' not in response.url: form_action = re.findall(u'<form method="post" action="(.+?)">', response.text) if form_action: response = auth_session.get(form_action[0]) else: try: json_data = response.json() except ValueError: # not json in response error_message = 'OAuth2 grant access error' else: error_message = 'VK error: [{0}] {1}'.format( json_data['error'], json_data['error_description'] ) auth_session.close() raise VkAuthorizationError(error_message) auth_session.close() parsed_url = urlparse(response.url) logger.info('Parsed URL: %s', parsed_url) token_dict = dict(parse_qsl(parsed_url.fragment)) if 'access_token' in token_dict: self.access_token = token_dict['access_token'] self.access_token_expires_in = token_dict['expires_in'] else: raise VkAuthorizationError('OAuth2 authorization error')
def get_access_token(self): """ Get access token using user_login and user_password """ logger.info('Try to get access token via OAuth') logger.info('%s', self.user_login) if self.user_login and not self.user_password: # Need user password pass if not self.user_login and self.user_password: # Need user login pass auth_session = requests.Session() login_form_response = auth_session.get(self.LOGIN_URL) login_form_action = re.findall(r'<form ?.* action="(.+)"', login_form_response.text) if not login_form_action: raise VkAuthorizationError('vk.com changed login flow') # Login login_form_data = { 'email': self.user_login, 'pass': self.user_password, } response = auth_session.post(login_form_action[0], login_form_data) logger.info('Cookies %s', auth_session.cookies) logger.info('Login response url %s', response.url) if 'remixsid' in auth_session.cookies or 'remixsid6' in auth_session.cookies: pass elif 'sid=' in response.url: self.auth_captcha_is_needed(response.content, auth_session) elif 'act=authcheck' in response.url: self.auth_code_is_needed(response.content, auth_session) elif 'security_check' in response.url: self.phone_number_is_needed(response.content, auth_session) else: raise VkAuthorizationError('Authorization error (bad password)') # OAuth2 oauth_data = { 'response_type': 'token', 'client_id': self.app_id, 'scope': self.scope, 'display': 'mobile', } response = auth_session.post('https://oauth.vk.com/authorize', oauth_data) logger.info('OAuth URL: %s %s', response.request.url, oauth_data) if 'access_token' not in response.url: form_action = re.findall(u'<form method="post" action="(.+?)">', response.text) if form_action: response = auth_session.get(form_action[0]) else: try: json_data = response.json() except ValueError: # not json in response error_message = 'OAuth2 grant access error' else: error_message = 'VK error: [{0}] {1}'.format( json_data['error'], json_data['error_description'] ) auth_session.close() raise VkAuthorizationError(error_message) auth_session.close() parsed_url = urlparse(response.url) logger.info('Parsed URL: %s', parsed_url) token_dict = dict(parse_qsl(parsed_url.fragment)) if 'access_token' in token_dict: self.access_token = token_dict['access_token'] self.access_token_expires_in = token_dict['expires_in'] else: raise VkAuthorizationError('OAuth2 authorization error')
def get_access_token(self): """ Get access token using user_login and user_password """ logger.info("Try to get access token via OAuth") if self.user_login and not self.user_password: # Need user password pass if not self.user_login and self.user_password: # Need user login pass auth_session = requests.Session() login_form_response = auth_session.get(self.LOGIN_URL) login_form_action = re.findall(r'<form ?.* action="(.+)"', login_form_response.text) if not login_form_action: raise VkAuthorizationError("vk.com changed login flow") # Login login_form_data = {"email": self.user_login, "pass": self.user_password} response = auth_session.post(login_form_action[0], login_form_data) logger.info("Cookies %s", auth_session.cookies) logger.info("Login response url %s", response.url) if "remixsid" in auth_session.cookies or "remixsid6" in auth_session.cookies: pass elif "sid=" in response.url: self.auth_captcha_is_needed(response.content, auth_session) elif "act=authcheck" in response.url: self.auth_code_is_needed(response.content, auth_session) elif "security_check" in response.url: self.phone_number_is_needed(response.content, auth_session) else: raise VkAuthorizationError("Authorization error (bad password)") # OAuth2 oauth_data = {"response_type": "token", "client_id": self.app_id, "scope": self.scope, "display": "mobile"} response = auth_session.post("https://oauth.vk.com/authorize", oauth_data) logger.info("OAuth URL: %s %s", response.request.url, oauth_data) if "access_token" not in response.url: form_action = re.findall(u'<form method="post" action="(.+?)">', response.text) if form_action: response = auth_session.get(form_action[0]) else: try: json_data = response.json() except ValueError: # not json in response error_message = "OAuth2 grant access error" else: error_message = "VK error: [{0}] {1}".format(json_data["error"], json_data["error_description"]) auth_session.close() raise VkAuthorizationError(error_message) auth_session.close() parsed_url = urlparse(response.url) logger.info("Parsed URL: %s", parsed_url) token_dict = dict(parse_qsl(parsed_url.fragment)) if "access_token" in token_dict: self.access_token = token_dict["access_token"] self.access_token_expires_in = token_dict["expires_in"] else: raise VkAuthorizationError("OAuth2 authorization error")