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