/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="code">Код двухфакторной авторизации</param> /// <param name="captchaSid">Идентификатор капчи</param> /// <param name="captchaKey">Текст капчи</param> /// <param name="host">Имя узла прокси-сервера.</param> /// <param name="port">Номер порта используемого Host.</param> /// <param name="proxyLogin">Логин для прокси-сервера.</param> /// <param name="proxyPassword">Пароль для прокси-сервера</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captchaSid = null, string captchaKey = null, string host = null, int?port = null, string proxyLogin = null, string proxyPassword = null) { _host = string.IsNullOrWhiteSpace(host) ? null : host; _port = port; _proxyLogin = string.IsNullOrWhiteSpace(proxyLogin) ? null : proxyLogin; _proxyPassword = string.IsNullOrWhiteSpace(proxyPassword) ? null : proxyPassword; var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl, host, port, proxyLogin, proxyPassword); if (authorizeUrlResult.ResponseUrl.ToString().StartsWith("https://oauth.vk.com/blank.html#access_token=")) { return(EndAuthorize(authorizeUrlResult, host, port, proxyLogin, proxyPassword)); } // Заполнить логин и пароль var loginForm = WebForm.From(authorizeUrlResult).WithField("email").FilledWith(email).And().WithField("pass").FilledWith(password); if (captchaSid.HasValue) { loginForm.WithField("captcha_sid").FilledWith(captchaSid.Value.ToString()).WithField("captcha_key").FilledWith(captchaKey); } var loginFormPostResult = WebCall.Post(loginForm, host, port, proxyLogin, proxyPassword); // Заполнить код двухфакторной авторизации if (code != null) { var codeForm = WebForm.From(loginFormPostResult).WithField("code").FilledWith(code()); loginFormPostResult = WebCall.Post(codeForm, host, port); } return(EndAuthorize(loginFormPostResult, host, port, proxyLogin, proxyPassword)); }
/// <summary> /// Закончить авторизацию /// </summary> /// <param name="result">Результат</param> /// <param name="webProxy">Настройки прокси</param> /// <returns></returns> /// <exception cref="CaptchaNeededException"></exception> private VkAuthorization EndAuthorize(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 = WebCall.Post(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="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="captcha_sid">Идентификатор капчи</param> /// <param name="captcha_key">Текст капчи</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(int appId, string email, string password, Settings settings, long?captcha_sid = null, string captcha_key = null) { var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl); var loginForm = WebForm.From(authorizeUrlResult).WithField("email").FilledWith(email).And().WithField("pass").FilledWith(password); if (captcha_sid.HasValue) { loginForm.WithField("captcha_sid").FilledWith(captcha_sid.Value.ToString()).FilledWith("captcha_key").FilledWith(captcha_key); } var loginFormPostResult = WebCall.Post(loginForm); var authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (authorization.CaptchaID.HasValue) { throw new VkNet.Exception.CaptchaNeededException(authorization.CaptchaID.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaID.Value.ToString()); } if (!authorization.IsAuthorizationRequired) { return(authorization); } var authorizationForm = WebForm.From(loginFormPostResult); var authorizationFormPostResult = WebCall.Post(authorizationForm); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <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="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 WebCallResult FilledTwoFactorForm(Func <string> code, WebCallResult loginFormPostResult) { var codeForm = WebForm.From(loginFormPostResult) .WithField("code") .FilledWith(code.Invoke()); return(WebCall.Post(codeForm, Proxy)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="code">Код двухфакторной авторизации</param> /// <param name="captchaSid">Идентификатор капчи</param> /// <param name="captchaKey">Текст капчи</param> /// <param name="host">Имя узла прокси-сервера.</param> /// <param name="port">Номер порта используемого Host.</param> /// <param name="proxyLogin">Логин для прокси-сервера.</param> /// <param name="proxyPassword">Пароль для прокси-сервера</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captchaSid = null, string captchaKey = null, string host = null, int?port = null, string proxyLogin = null, string proxyPassword = null) { _host = string.IsNullOrWhiteSpace(host) ? null : host; _port = port; _proxyLogin = string.IsNullOrWhiteSpace(proxyLogin) ? null : proxyLogin; _proxyPassword = string.IsNullOrWhiteSpace(proxyPassword) ? null : proxyPassword; var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl, host, port, proxyLogin, proxyPassword); // Заполнить логин и пароль var loginForm = WebForm.From(authorizeUrlResult) .WithField("email") .FilledWith(email) .And() .WithField("pass") .FilledWith(password); if (captchaSid.HasValue) { loginForm.WithField("captcha_sid") .FilledWith(captchaSid.Value.ToString()) .WithField("captcha_key") .FilledWith(captchaKey); } var loginFormPostResult = WebCall.Post(loginForm, host, port, proxyLogin, proxyPassword); // Заполнить код двухфакторной авторизации if (code != null) { var codeForm = WebForm.From(loginFormPostResult) .WithField("code") .FilledWith(code()); loginFormPostResult = WebCall.Post(codeForm, host, port); } var authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (authorization.CaptchaId.HasValue) { throw new CaptchaNeededException(authorization.CaptchaId.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaId.Value); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // Отправить данные var authorizationForm = WebForm.From(loginFormPostResult); var authorizationFormPostResult = WebCall.Post(authorizationForm, host, port, proxyLogin, proxyPassword); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <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)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="code">Код двухфакторной авторизации</param> /// <param name="captchaSid">Идентификатор капчи</param> /// <param name="captchaKey">Текст капчи</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captchaSid = null, string captchaKey = null) { var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl, Proxy); if (authorizeUrlResult.ResponseUrl.ToString() .StartsWith("https://oauth.vk.com/blank.html#access_token=", StringComparison.Ordinal)) { return(EndAuthorize(authorizeUrlResult, Proxy)); } // Заполнить логин и пароль var loginForm = WebForm.From(authorizeUrlResult) .WithField("email") .FilledWith(email) .And() .WithField("pass") .FilledWith(password); if (captchaSid.HasValue) { loginForm.WithField("captcha_sid") .FilledWith(captchaSid.Value.ToString()) .WithField("captcha_key") .FilledWith(captchaKey); } var loginFormPostResult = WebCall.Post(loginForm, Proxy); // Заполнить код двухфакторной авторизации var isOAuthBlank = WebForm.IsOAuthBlank(loginFormPostResult); if (code == null) { return(EndAuthorize(loginFormPostResult, Proxy)); } if (isOAuthBlank) { return(EndAuthorize(loginFormPostResult, Proxy)); } var codeForm = WebForm.From(loginFormPostResult) .WithField("code") .FilledWith(code.Invoke()); loginFormPostResult = WebCall.Post(codeForm, Proxy); return(EndAuthorize(loginFormPostResult, Proxy)); }
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="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="code">Код двухфакторной авторизации</param> /// <param name="captchaSid">Идентификатор капчи</param> /// <param name="captchaKey">Текст капчи</param> /// <param name="webProxy">Прокси-сервер.</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captchaSid = null, string captchaKey = null, IWebProxy webProxy = null) { _webProxy = webProxy; var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl, _webProxy); // Заполнить логин и пароль var loginForm = WebForm.From(authorizeUrlResult) .WithField("email") .FilledWith(email) .And() .WithField("pass") .FilledWith(password); if (captchaSid.HasValue) { loginForm.WithField("captcha_sid") .FilledWith(captchaSid.Value.ToString()) .WithField("captcha_key") .FilledWith(captchaKey); } var loginFormPostResult = WebCall.Post(loginForm, _webProxy); // Заполнить код двухфакторной авторизации var codeForm = WebForm.From(loginFormPostResult) .WithField("code") .FilledWith(code?.Invoke()); loginFormPostResult = WebCall.Post(codeForm, _webProxy); var authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (authorization.CaptchaId.HasValue) { throw new CaptchaNeededException(authorization.CaptchaId.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaId.Value); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // Отправить данные var authorizationForm = WebForm.From(loginFormPostResult); var authorizationFormPostResult = WebCall.Post(authorizationForm, _webProxy); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
private VkAuthorization EndAuthorize(WebCallResult result, IWebProxy webProxy = null) { var authorization = VkAuthorization.From(result.ResponseUrl); if (authorization.CaptchaId.HasValue) { throw new CaptchaNeededException(authorization.CaptchaId.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaId.Value); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // Отправить данные var authorizationForm = WebForm.From(result); var authorizationFormPostResult = WebCall.Post(authorizationForm, webProxy); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <summary> /// Закончить авторизацию /// </summary> /// <param name="result">Результат</param> /// <param name="webProxy">Настройки прокси</param> /// <returns></returns> /// <exception cref="CaptchaNeededException"></exception> private VkAuthorization EndAuthorize(WebCallResult result, IWebProxy webProxy = null) { var tokenUri = GetTokenUri(result); var authorization = VkAuthorization.From(tokenUri.ToString()); if (!authorization.IsAuthorizationRequired && !authorization.IsCaptchaNeeded) { _logger?.Debug("Завершение авторизации"); return(authorization); } _logger?.Debug("Требуется подтверждение прав или ввод капчи"); // Отправить данные var authorizationForm = WebForm.From(result); var authorizationFormPostResult = WebCall.Post(authorizationForm, webProxy); tokenUri = GetTokenUri(authorizationFormPostResult); return(VkAuthorization.From(tokenUri.ToString())); }
private VkAuthorization EndAuthorize(WebCallResult result, string host = null, int?port = null, string proxyLogin = null, string proxyPassword = null) { var authorization = VkAuthorization.From(result.ResponseUrl); if (authorization.CaptchaId.HasValue) { throw new CaptchaNeededException(authorization.CaptchaId.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaId.Value); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // Отправить данные var authorizationForm = WebForm.From(result); var authorizationFormPostResult = WebCall.Post(authorizationForm, host, port, proxyLogin, proxyPassword); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <summary> /// Выполняет обход ошибки валидации: https://vk.com/dev/need_validation /// </summary> /// <param name="validateUrl">Адрес страницы валидации</param> /// <param name="phoneNumber">Номер телефона, который необходимо ввести на странице валидации</param> /// <returns>Информация об авторизации приложения.</returns> public VkAuthorization Validate(string validateUrl, string phoneNumber) { if (string.IsNullOrWhiteSpace(validateUrl)) { throw new ArgumentException("Не задан адрес валидации!"); } if (string.IsNullOrWhiteSpace(phoneNumber)) { throw new ArgumentException("Не задан номер телефона!"); } var validateUrlResult = WebCall.MakeCall(validateUrl, Proxy); var codeForm = WebForm.From(validateUrlResult) .WithField("code") .FilledWith(phoneNumber.Substring(1, 8)); var codeFormPostResult = WebCall.Post(codeForm, Proxy); return(EndAuthorize(codeFormPostResult, Proxy)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="captcha_sid">Идентификатор капчи</param> /// <param name="captcha_key">Текст капчи</param> /// <param name="host">Имя узла прокси-сервера.</param> /// <param name="port">Номер порта используемого Host.</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captcha_sid = null, string captcha_key = null, string host = null, int?port = null) { this.host = string.IsNullOrEmpty(host) ? null : host; this.port = port; var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl, host, port); // fill email and password var loginForm = WebForm.From(authorizeUrlResult).WithField("email").FilledWith(email).And().WithField("pass").FilledWith(password); if (captcha_sid.HasValue) { loginForm.WithField("captcha_sid").FilledWith(captcha_sid.Value.ToString()).WithField("captcha_key").FilledWith(captcha_key); } var loginFormPostResult = WebCall.Post(loginForm, host, port); // fill code if (code != null) { var codeForm = WebForm.From(loginFormPostResult).WithField("code").FilledWith(code()); loginFormPostResult = WebCall.Post(codeForm, host, port); } var authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (authorization.CaptchaID.HasValue) { throw new CaptchaNeededException(authorization.CaptchaID.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaID.Value.ToString()); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // press allow button var authorizationForm = WebForm.From(loginFormPostResult); var authorizationFormPostResult = WebCall.Post(authorizationForm, host, port); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(int appId, string email, string password, Settings settings) { var authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); var authorizeUrlResult = WebCall.MakeCall(authorizeUrl); var loginForm = WebForm.From(authorizeUrlResult).WithField("email").FilledWith(email).And().WithField("pass").FilledWith(password); var loginFormPostResult = WebCall.Post(loginForm); var authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (!authorization.IsAuthorizationRequired) { return(authorization); } var authorizationForm = WebForm.From(loginFormPostResult); var authorizationFormPostResult = WebCall.Post(authorizationForm); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="code">Код двухфакторной авторизации</param> /// <param name="captchaSid">Идентификатор капчи</param> /// <param name="captchaKey">Текст капчи</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(ulong appId, string email, string password, Settings settings, Func <string> code = null, long?captchaSid = null, string captchaKey = null) { _logger?.Debug("Шаг 1. Открытие диалога авторизации"); var authorizeUrlResult = OpenAuthDialog(appId, settings); if (IsAuthSuccessfull(authorizeUrlResult)) { return(EndAuthorize(authorizeUrlResult, Proxy)); } _logger?.Debug("Шаг 2. Заполнение формы логина"); var loginFormPostResult = FilledLoginForm(email, password, captchaSid, captchaKey, authorizeUrlResult); if (IsAuthSuccessfull(loginFormPostResult)) { return(EndAuthorize(loginFormPostResult, Proxy)); } if (HasNotTwoFactor(code, loginFormPostResult)) { return(EndAuthorize(loginFormPostResult, Proxy)); } _logger?.Debug("Шаг 2.5.1. Заполнить код двухфакторной авторизации"); var twoFactorFormResult = FilledTwoFactorForm(code, loginFormPostResult); if (IsAuthSuccessfull(twoFactorFormResult)) { return(EndAuthorize(twoFactorFormResult, Proxy)); } _logger?.Debug("Шаг 2.5.2 Капча"); var captchaForm = WebForm.From(twoFactorFormResult); var captcha = WebCall.Post(captchaForm, Proxy); // todo: Нужно обработать капчу return(EndAuthorize(captcha, Proxy)); }
/// <inheritdoc /> public VkAuthorization Authorize(IApiAuthParams authParams) { _logger?.Debug("Шаг 1. Открытие диалога авторизации"); var authorizeUrlResult = OpenAuthDialog(authParams.ApplicationId, authParams.Settings); if (IsAuthSuccessfull(authorizeUrlResult)) { return(EndAuthorize(authorizeUrlResult, Proxy)); } _logger?.Debug("Шаг 2. Заполнение формы логина"); var loginFormPostResult = FilledLoginForm(authParams.Login, authParams.Password, authParams.CaptchaSid, authParams.CaptchaKey, authorizeUrlResult); if (IsAuthSuccessfull(loginFormPostResult)) { return(EndAuthorize(loginFormPostResult, Proxy)); } if (HasNotTwoFactor(authParams.TwoFactorAuthorization, loginFormPostResult)) { return(EndAuthorize(loginFormPostResult, Proxy)); } _logger?.Debug("Шаг 2.5.1. Заполнить код двухфакторной авторизации"); var twoFactorFormResult = FilledTwoFactorForm(authParams.TwoFactorAuthorization, loginFormPostResult); if (IsAuthSuccessfull(twoFactorFormResult)) { return(EndAuthorize(twoFactorFormResult, Proxy)); } _logger?.Debug("Шаг 2.5.2 Капча"); var captchaForm = WebForm.From(twoFactorFormResult); var captcha = WebCall.Post(captchaForm, Proxy); // todo: Нужно обработать капчу return(EndAuthorize(captcha, Proxy)); }
/// <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 WebCallResult FilledLoginForm(string email, string password, long?captchaSid, string captchaKey, WebCallResult authorizeUrlResult) { var loginForm = WebForm.From(authorizeUrlResult) .WithField("email") .FilledWith(email) .And() .WithField("pass") .FilledWith(password); if (captchaSid.HasValue) { _logger?.Debug("Шаг 2. Заполнение формы логина. Капча"); loginForm.WithField("captcha_sid") .FilledWith(captchaSid.Value.ToString()) .WithField("captcha_key") .FilledWith(captchaKey); } return(WebCall.Post(loginForm, 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)); }
/// <summary> /// Авторизация на сервере ВК /// </summary> /// <param name="appId">Идентификатор приложения</param> /// <param name="email">Логин - телефон или эл. почта</param> /// <param name="password">Пароль</param> /// <param name="settings">Уровень доступа приложения</param> /// <param name="captcha_sid">Идентификатор капчи</param> /// <param name="captcha_key">Текст капчи</param> /// <returns>Информация об авторизации приложения</returns> public VkAuthorization Authorize(int appId, string email, string password, Settings settings, Func <string> code = null, long?captcha_sid = null, string captcha_key = null) { string authorizeUrl = CreateAuthorizeUrlFor(appId, settings, Display.Wap); WebCallResult authorizeUrlResult = WebCall.MakeCall(authorizeUrl); // fill email and password WebForm loginForm = WebForm.From(authorizeUrlResult).WithField("email").FilledWith(email).And().WithField("pass").FilledWith(password); if (captcha_sid.HasValue) { loginForm.WithField("captcha_sid").FilledWith(captcha_sid.Value.ToString()).WithField("captcha_key").FilledWith(captcha_key); } WebCallResult loginFormPostResult = WebCall.Post(loginForm); // fill code if (code != null) { WebForm codeForm = WebForm.From(loginFormPostResult).WithField("code").FilledWith(code()); loginFormPostResult = WebCall.Post(codeForm); } VkAuthorization authorization = VkAuthorization.From(loginFormPostResult.ResponseUrl); if (authorization.CaptchaID.HasValue) { throw new CaptchaNeededException(authorization.CaptchaID.Value, "http://api.vk.com/captcha.php?sid=" + authorization.CaptchaID.Value.ToString()); } if (!authorization.IsAuthorizationRequired) { return(authorization); } // press allow button WebForm authorizationForm = WebForm.From(loginFormPostResult); WebCallResult authorizationFormPostResult = WebCall.Post(authorizationForm); return(VkAuthorization.From(authorizationFormPostResult.ResponseUrl)); }
/// <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(webCallResult: result)) { var auth = GetTokenUri(webCallResult: result); return(VkAuthorization.From(uriFragment: auth.ToString())); } if (HasСonfirmationRights(result: result)) { _logger?.Debug(message: "Требуется подтверждение прав"); var authorizationForm = WebForm.From(result: result); var authorizationFormPostResult = await WebCall.PostAsync(form : authorizationForm, webProxy : webProxy).ConfigureAwait(false); if (!IsAuthSuccessfull(webCallResult: authorizationFormPostResult)) { throw new VkApiException(message: "URI должен содержать токен!"); } var tokenUri = GetTokenUri(webCallResult: authorizationFormPostResult); return(VkAuthorization.From(uriFragment: tokenUri.ToString())); } var captchaSid = HasCaptchaInput(result: result); if (!captchaSid.HasValue) { throw new VkApiException(message: "Непредвиденная ошибка авторизации. Обратитесь к разработчику."); } _logger?.Debug(message: "Требуется ввод капчи"); throw new VkApiException(message: "Требуется ввод капчи"); }
/// <summary> /// Закончить авторизацию /// </summary> /// <param name="result"> Результат </param> /// <param name="webProxy"> Настройки прокси </param> /// <returns> </returns> /// <exception cref="CaptchaNeededException"> </exception> private VkAuthorization EndAuthorize(WebCallResult result, IWebProxy webProxy = null) { if (IsAuthSuccessfull(webCallResult: result)) { var auth = GetTokenUri(webCallResult: result); return(VkAuthorization.From(uriFragment: auth.ToString())); } if (HasСonfirmationRights(result: result)) { _logger?.LogDebug(message: "Требуется подтверждение прав"); var authorizationForm = WebForm.From(result: result); var authorizationFormPostResult = WebCall.Post(form: authorizationForm, webProxy: webProxy); if (!IsAuthSuccessfull(webCallResult: authorizationFormPostResult)) { throw new VkApiException(message: "URI должен содержать токен!"); } var tokenUri = GetTokenUri(webCallResult: authorizationFormPostResult); return(VkAuthorization.From(uriFragment: tokenUri.ToString())); } var captchaSid = HasCaptchaInput(result: result); if (!captchaSid.HasValue) { throw new VkApiException(message: "Непредвиденная ошибка авторизации. Обратитесь к разработчику."); } _logger?.LogDebug(message: "Требуется ввод капчи"); throw new CaptchaNeededException(sid: captchaSid.Value, img: "https://m.vk.com/captcha.php?sid=" + captchaSid.Value); }