Ejemplo n.º 1
0
        /// <summary>
        /// Авторизация и получение токена
        /// </summary>
        /// <param name="appId">Идентификатор приложения</param>
        /// <param name="emailOrPhone">Email или телефон</param>
        /// <param name="password">Пароль</param>
        /// <param name="code">Делегат получения кода для двух факторной авторизации</param>
        /// <param name="captchaSid">Идентификатор капчи</param>
        /// <param name="captchaKey">Текст капчи</param>
        /// <param name="settings">Права доступа для приложения</param>
        /// <param name="host">Имя узла прокси-сервера.</param>
        /// <param name="port">Номер порта используемого Host.</param>
        /// <param name="proxyLogin">Логин для прокси-сервера.</param>
        /// <param name="proxyPassword">Пароль для прокси-сервера</param>
        /// <exception cref="VkApiAuthorizationException"></exception>
        private void AuthorizeWithAntiCaptcha(ulong appId, string emailOrPhone, string password, Settings settings, Func <string> code, long?captchaSid = null, string captchaKey = null,
                                              string host = null, int?port = null, string proxyLogin = null, string proxyPassword = null)
        {
            if (_captchaSolver == null)
            {
                Authorize(appId, emailOrPhone, password, settings, code, captchaSid, captchaKey, host, port, proxyLogin, proxyPassword);
            }
            else
            {
                var numberOfRemainingAttemptsToSolveCaptcha = MaxCaptchaRecognitionCount;
                var numberOfRemainingAttemptsToAuthorize    = MaxCaptchaRecognitionCount + 1;
                var captchaSidTemp         = captchaSid;
                var captchaKeyTemp         = captchaKey;
                var authorizationCompleted = false;

                do
                {
                    try
                    {
                        numberOfRemainingAttemptsToAuthorize--;
                        Authorize(appId, emailOrPhone, password, settings, code, captchaSidTemp, captchaKeyTemp, host, port, proxyLogin, proxyPassword);

                        authorizationCompleted = true;
                    }
                    catch (CaptchaNeededException captchaNeededException)
                    {
                        // Если мы обрабатываем исключение не первый раз, сообщаем решателю капчи
                        // об ошибке распознавания предыдущей капчи
                        if (numberOfRemainingAttemptsToSolveCaptcha < MaxCaptchaRecognitionCount)
                        {
                            _captchaSolver?.CaptchaIsFalse();
                        }

                        if (numberOfRemainingAttemptsToSolveCaptcha <= 0)
                        {
                            continue;
                        }
                        captchaSidTemp = captchaNeededException.Sid;
                        captchaKeyTemp = _captchaSolver?.Solve(captchaNeededException.Img?.AbsoluteUri);
                        numberOfRemainingAttemptsToSolveCaptcha--;
                    }
                } while (numberOfRemainingAttemptsToAuthorize > 0 && !authorizationCompleted);

                // Повторно выбрасываем исключение, если капча ни разу не была распознана верно
                if (!authorizationCompleted && captchaSidTemp.HasValue)
                {
                    throw new CaptchaNeededException(captchaSidTemp.Value, captchaKeyTemp);
                }
            }
        }
Ejemplo n.º 2
0
        private void RepeatSolveCaptchaAsync(CaptchaNeededException captchaNeededException,
                                             ref int numberOfRemainingAttemptsToSolveCaptcha,
                                             ref long?captchaSidTemp,
                                             ref string captchaKeyTemp)
        {
            _logger?.LogWarning("Повторная обработка капчи");

            if (numberOfRemainingAttemptsToSolveCaptcha < MaxCaptchaRecognitionCount)
            {
                _captchaSolver?.CaptchaIsFalse();
            }

            if (numberOfRemainingAttemptsToSolveCaptcha <= 0)
            {
                return;
            }

            captchaSidTemp = captchaNeededException.Sid;
            captchaKeyTemp = _captchaSolver?.Solve(captchaNeededException.Img?.AbsoluteUri);
            numberOfRemainingAttemptsToSolveCaptcha--;
        }
 public int SolveCaptcha(string input)
 {
     int[] digits = _parser.ParseInput(input);
     return(_solver.Solve(digits));
 }