/// <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); } } }
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)); }