Example #1
0
        /// <summary>
        /// Заполнить форму логин и пароль асинхронно
        /// </summary>
        /// <param name="email"> Логин </param>
        /// <param name="password"> Пароль </param>
        /// <param name="captchaSid"> ИД капчи </param>
        /// <param name="captchaKey"> Значение капчи </param>
        /// <param name="authorizeUrlResult"> </param>
        /// <returns> </returns>
        private async Task <WebCallResult> FilledLoginFormAsync(string email
                                                                , string password
                                                                , long?captchaSid
                                                                , string captchaKey
                                                                , WebCallResult authorizeUrlResult)
        {
            var loginForm = WebForm.From(result: authorizeUrlResult)
                            .WithField(name: "email")
                            .FilledWith(value: email)
                            .And()
                            .WithField(name: "pass")
                            .FilledWith(value: password);

            if (captchaSid.HasValue)
            {
                _logger?.Debug(message: "Шаг 2. Заполнение формы логина. Капча");

                loginForm.WithField(name: "captcha_sid")
                .FilledWith(value: captchaSid.Value.ToString())
                .WithField(name: "captcha_key")
                .FilledWith(value: captchaKey);
            }

            return(await WebCall.PostAsync(form : loginForm, webProxy : Proxy));
        }
Example #2
0
        /// <summary>
        /// Закончить авторизацию асинхронно
        /// </summary>
        /// <param name="result">Результат</param>
        /// <param name="webProxy">Настройки прокси</param>
        /// <returns></returns>
        /// <exception cref="CaptchaNeededException"></exception>
        private async Task <VkAuthorization> EndAuthorizeAsync(WebCallResult result, IWebProxy webProxy = null)
        {
            if (IsAuthSuccessfull(result))
            {
                var auth = GetTokenUri(result);
                return(VkAuthorization.From(auth.ToString()));
            }

            if (HasСonfirmationRights(result))
            {
                _logger?.Debug("Требуется подтверждение прав");
                var authorizationForm           = WebForm.From(result);
                var authorizationFormPostResult = await WebCall.PostAsync(authorizationForm, webProxy);

                if (!IsAuthSuccessfull(authorizationFormPostResult))
                {
                    throw new VkApiException("URI должен содержать токен!");
                }

                var tokenUri = GetTokenUri(authorizationFormPostResult);
                return(VkAuthorization.From(tokenUri.ToString()));
            }

            var captchaSid = HasCaptchaInput(result);

            if (!captchaSid.HasValue)
            {
                throw new VkApiException("Непредвиденная ошибка авторизации. Обратитесь к разработчику.");
            }

            _logger?.Debug("Требуется ввод капчи");
            throw new VkApiException("Требуется ввод капчи");
        }
Example #3
0
        /// <summary>
        /// Заполнить форму двухфакторной авторизации асинхронно
        /// </summary>
        /// <param name="code"> Функция возвращающая код двухфакторной авторизации </param>
        /// <param name="loginFormPostResult"> Ответ сервера vk </param>
        /// <returns> Ответ сервера vk </returns>
        private async Task <WebCallResult> FilledTwoFactorFormAsync(Func <string> code, WebCallResult loginFormPostResult)
        {
            var codeForm = WebForm.From(result: loginFormPostResult)
                           .WithField(name: "code")
                           .FilledWith(value: code.Invoke());

            return(await WebCall.PostAsync(form : codeForm, webProxy : Proxy));
        }
Example #4
0
        /// <summary>
        /// Заполнить форму двухфакторной авторизации асинхронно
        /// </summary>
        /// <param name="code">Функция возвращающая код двухфакторной авторизации</param>
        /// <param name="loginFormPostResult">Ответ сервера vk</param>
        /// <returns>Ответ сервера vk</returns>
        private async Task <WebCallResult> FilledTwoFactorFormAsync(Func <string> code, WebCallResult loginFormPostResult)
        {
            var codeForm = WebForm.From(loginFormPostResult)
                           .WithField("code")
                           .FilledWith(code.Invoke());

            return(await WebCall.PostAsync(codeForm, Proxy));
        }
Example #5
0
        /// <summary>
        /// Заполнить форму двухфакторной авторизации асинхронно
        /// </summary>
        /// <param name="code"> Функция возвращающая код двухфакторной авторизации </param>
        /// <param name="loginFormPostResult"> Ответ сервера vk </param>
        /// <returns> Ответ сервера vk </returns>
        private Task <WebCallResult> FilledTwoFactorFormAsync(Func <string> code, WebCallResult loginFormPostResult)
        {
            var codeForm = WebForm.From(result: loginFormPostResult)
                           .WithField(name: "code")
                           .FilledWith(value: code.Invoke());

            var task = WebCall.PostAsync(form: codeForm, webProxy: Proxy);

            task.ConfigureAwait(false);
            return(task);
        }
Example #6
0
        private async Task <VkAuthorization> ValidateInternalAsync(string validateUrl, string phoneNumber)
        {
            var validateUrlResult = await WebCall.MakeCallAsync(url : validateUrl, webProxy : Proxy).ConfigureAwait(false);

            var codeForm = WebForm.From(result: validateUrlResult)
                           .WithField(name: "code")
                           .FilledWith(value: phoneNumber.Substring(startIndex: 1, length: 8));

            var codeFormPostResult = await WebCall.PostAsync(form : codeForm, webProxy : Proxy).ConfigureAwait(false);

            return(await EndAuthorizeAsync(result : codeFormPostResult, webProxy : Proxy).ConfigureAwait(false));
        }
Example #7
0
        public async Task <VkAuthorization> AuthorizeAsync(IApiAuthParams authParams)
        {
            _logger?.Debug(message: "Шаг 1. Открытие диалога авторизации");

            var authorizeUrlResult = await OpenAuthDialogAsync(appId : authParams.ApplicationId, settings : authParams.Settings)
                                     .ConfigureAwait(false);

            if (IsAuthSuccessfull(webCallResult: authorizeUrlResult))
            {
                return(await EndAuthorizeAsync(result : authorizeUrlResult, webProxy : Proxy).ConfigureAwait(false));
            }

            _logger?.Debug(message: "Шаг 2. Заполнение формы логина");

            var loginFormPostResult = await FilledLoginFormAsync(email : authParams.Login,
                                                                 password : authParams.Password,
                                                                 captchaSid : authParams.CaptchaSid,
                                                                 captchaKey : authParams.CaptchaKey,
                                                                 authorizeUrlResult : authorizeUrlResult)
                                      .ConfigureAwait(false);

            if (IsAuthSuccessfull(webCallResult: loginFormPostResult))
            {
                return(await EndAuthorizeAsync(result : loginFormPostResult, webProxy : Proxy).ConfigureAwait(false));
            }

            if (HasNotTwoFactor(code: authParams.TwoFactorAuthorization, loginFormPostResult: loginFormPostResult))
            {
                return(await EndAuthorizeAsync(result : loginFormPostResult, webProxy : Proxy).ConfigureAwait(false));
            }

            _logger?.Debug(message: "Шаг 2.5.1. Заполнить код двухфакторной авторизации");

            var twoFactorFormResult =
                await FilledTwoFactorFormAsync(code : authParams.TwoFactorAuthorization, loginFormPostResult : loginFormPostResult);

            if (IsAuthSuccessfull(webCallResult: twoFactorFormResult))
            {
                return(await EndAuthorizeAsync(result : twoFactorFormResult, webProxy : Proxy).ConfigureAwait(false));
            }

            _logger?.Debug(message: "Шаг 2.5.2 Капча");
            var captchaForm = WebForm.From(result: twoFactorFormResult);

            var captcha = await WebCall.PostAsync(form : captchaForm, webProxy : Proxy).ConfigureAwait(false);

            // todo: Нужно обработать капчу

            return(await EndAuthorizeAsync(result : captcha, webProxy : Proxy).ConfigureAwait(false));
        }
Example #8
0
        /// <summary>
        /// Асинхронная авторизация на сервере ВК
        /// </summary>
        /// <param name="authParams">Параметры авторизации</param>
        /// <returns>Информация об авторизации приложения</returns>
        public async Task <VkAuthorization> AuthorizeAsync(IApiAuthParams authParams)
        {
            _logger?.Debug("Шаг 1. Открытие диалога авторизации");
            var authorizeUrlResult = await OpenAuthDialogAsync(authParams.ApplicationId, authParams.Settings);

            if (IsAuthSuccessfull(authorizeUrlResult))
            {
                return(await EndAuthorizeAsync(authorizeUrlResult, Proxy));
            }

            _logger?.Debug("Шаг 2. Заполнение формы логина");
            var loginFormPostResult = await FilledLoginFormAsync(authParams.Login, authParams.Password,
                                                                 authParams.CaptchaSid, authParams.CaptchaKey, authorizeUrlResult);

            if (IsAuthSuccessfull(loginFormPostResult))
            {
                return(await EndAuthorizeAsync(loginFormPostResult, Proxy));
            }

            if (HasNotTwoFactor(authParams.TwoFactorAuthorization, loginFormPostResult))
            {
                return(await EndAuthorizeAsync(loginFormPostResult, Proxy));
            }

            _logger?.Debug("Шаг 2.5.1. Заполнить код двухфакторной авторизации");
            var twoFactorFormResult = await FilledTwoFactorFormAsync(authParams.TwoFactorAuthorization, loginFormPostResult);

            if (IsAuthSuccessfull(twoFactorFormResult))
            {
                return(await EndAuthorizeAsync(twoFactorFormResult, Proxy));
            }

            _logger?.Debug("Шаг 2.5.2 Капча");
            var captchaForm = WebForm.From(twoFactorFormResult);

            var captcha = await WebCall.PostAsync(captchaForm, Proxy);

            // todo: Нужно обработать капчу

            return(await EndAuthorizeAsync(captcha, Proxy));
        }
Example #9
0
        /// <summary>
        /// Выполняет обход ошибки валидации асинхронно: https://vk.com/dev/need_validation
        /// </summary>
        /// <param name="validateUrl">Адрес страницы валидации</param>
        /// <param name="phoneNumber">Номер телефона, который необходимо ввести на странице валидации</param>
        /// <returns>Информация об авторизации приложения.</returns>
        public async Task <VkAuthorization> ValidateAsync(string validateUrl, string phoneNumber)
        {
            if (string.IsNullOrWhiteSpace(validateUrl))
            {
                throw new ArgumentException("Не задан адрес валидации!");
            }

            if (string.IsNullOrWhiteSpace(phoneNumber))
            {
                throw new ArgumentException("Не задан номер телефона!");
            }

            var validateUrlResult = await WebCall.MakeCallAsync(validateUrl, Proxy);

            var codeForm = WebForm.From(validateUrlResult)
                           .WithField("code")
                           .FilledWith(phoneNumber.Substring(1, 8));
            var codeFormPostResult = await WebCall.PostAsync(codeForm, Proxy);

            return(await EndAuthorizeAsync(codeFormPostResult, Proxy));
        }
Example #10
0
        /// <summary>
        /// Выполняет обход ошибки валидации асинхронно: https://vk.com/dev/need_validation
        /// </summary>
        /// <param name="validateUrl"> Адрес страницы валидации </param>
        /// <param name="phoneNumber">
        /// Номер телефона, который необходимо ввести на
        /// странице валидации
        /// </param>
        /// <returns> Информация об авторизации приложения. </returns>
        public async Task <VkAuthorization> ValidateAsync(string validateUrl, string phoneNumber)
        {
            if (string.IsNullOrWhiteSpace(value: validateUrl))
            {
                throw new ArgumentException(message: "Не задан адрес валидации!");
            }

            if (string.IsNullOrWhiteSpace(value: phoneNumber))
            {
                throw new ArgumentException(message: "Не задан номер телефона!");
            }

            var validateUrlResult = await WebCall.MakeCallAsync(url : validateUrl, webProxy : Proxy);

            var codeForm = WebForm.From(result: validateUrlResult)
                           .WithField(name: "code")
                           .FilledWith(value: phoneNumber.Substring(startIndex: 1, length: 8));

            var codeFormPostResult = await WebCall.PostAsync(form : codeForm, webProxy : Proxy);

            return(await EndAuthorizeAsync(result : codeFormPostResult, webProxy : Proxy));
        }