/// <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)); }
/// <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("Требуется ввод капчи"); }
/// <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)); }
/// <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)); }
/// <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); }
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)); }
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)); }
/// <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)); }
/// <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)); }
/// <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)); }