Example #1
0
    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)')
Example #2
0
    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)')
Example #3
0
    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')
Example #4
0
    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')
Example #5
0
    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")