/// <summary> /// WebCall. /// </summary> /// <param name="url">URL.</param> /// <param name="cookies">Cookies.</param> /// <param name="host">Хост.</param> /// <param name="port">Порт.</param> /// <param name="proxyLogin">Логин прокси-сервера</param> /// <param name="proxyPassword">Пароль прокси-сервера</param> private WebCall(string url, Cookies cookies, string host = null, int? port = null, string proxyLogin = null, string proxyPassword =null) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (host != null && port != null) Request.Proxy = new WebProxy(host, port.Value); if (Request.Proxy != null) { if (proxyLogin != null && proxyPassword != null) { Request.Proxy.Credentials = new NetworkCredential(proxyLogin, proxyPassword); } else { // Авторизация с реквизитами по умолчанию (для NTLM прокси) Request.Proxy.Credentials = CredentialCache.DefaultCredentials; } } Result = new WebCallResult(url, cookies); }
/// <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="code"> Функция возвращающая код двухфакторной авторизации </param> /// <param name="loginFormPostResult"> Ответ сервера vk </param> /// <returns> Ответ сервера vk </returns> private WebCallResult FilledTwoFactorForm(Func <string> code, WebCallResult loginFormPostResult) { var codeForm = WebForm.From(result: loginFormPostResult) .WithField(name: "code") .FilledWith(value: code.Invoke()); return(WebCall.Post(form: codeForm, webProxy: Proxy)); }
private WebCall(string url, Cookies cookies) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; Result = new WebCallResult(url, cookies); }
/// <summary> /// Проверка на отсутствие двухфакторной авторизации. /// </summary> /// <param name="result">Результат.</param> /// <returns>WEB форма.</returns> public static bool IsOAuthBlank(WebCallResult result) { var html = new HtmlDocument(); html.LoadHtml(result.Response); var title = html.DocumentNode.SelectSingleNode("//head/title"); return(title.InnerText.ToLowerInvariant() == "oauth blank"); }
private WebForm(WebCallResult result) { Cookies = result.Cookies; _originalUrl = result.RequestUrl.OriginalString; _html = new HtmlDocument(); result.LoadResultTo(_html); _inputs = ParseInputs(); }
/// <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 WebForm(WebCallResult result) { Cookies = result.Cookies; _originalUrl = result.RequestUrl.OriginalString; _html = new HtmlDocument(); result.LoadResultTo(_html); _responceBaseUrl = result.ResponseUrl.GetLeftPart(UriPartial.Authority); _inputs = ParseInputs(); }
private WebCall(string url, Cookies cookies, string host = null, int? port = null) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (host != null && port != null) Request.Proxy = new WebProxy(host, port.Value); Result = new WebCallResult(url, cookies); }
private WebCall(string url, Cookies cookies, VkApi vk) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (!vk.isDefaultVkApi) { createProxy(ProxyManager.getInstance().reserveOrGet(vk.email), Request); } Result = new WebCallResult(url, cookies); }
private WebCall(string url, Cookies cookies, string host = null, int?port = null) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (host != null && port != null) { Request.Proxy = new WebProxy(host, port.Value); } Result = new WebCallResult(url, cookies); }
/// <summary> /// WEB форма. /// </summary> /// <param name="result">Результат.</param> private WebForm(WebCallResult result) { Cookies = result.Cookies; OriginalUrl = result.RequestUrl.OriginalString; var parser = new HtmlParser(); _html = parser.Parse(result.Response); var uri = result.ResponseUrl; _responseBaseUrl = uri.Scheme + "://" + uri.Host + ":" + uri.Port; _inputs = ParseInputs(); }
/// <summary> /// WEB форма. /// </summary> /// <param name="result">Результат.</param> private WebForm(WebCallResult result) { Cookies = result.Cookies; OriginalUrl = result.RequestUrl.OriginalString; _html = new HtmlDocument(); _html.LoadHtml(result.Response); var uri = result.ResponseUrl; _responseBaseUrl = uri.Scheme + "://" + uri.Host + ":" + uri.Port; _inputs = ParseInputs(); }
/// <summary> /// Получить токен из uri /// </summary> /// <param name="webCallResult">Результат запроса</param> /// <returns>Возвращает uri содержащий токен</returns> /// <exception cref="VkApiException">URI должен содержать токен!</exception> private Uri GetTokenUri(WebCallResult webCallResult) { if (UriHasAccessToken(webCallResult.RequestUrl)) { return(webCallResult.RequestUrl); } _logger?.Debug("Запрос: " + webCallResult.RequestUrl); if (UriHasAccessToken(webCallResult.ResponseUrl)) { return(webCallResult.ResponseUrl); } _logger?.Debug("Ответ: " + webCallResult.ResponseUrl); return(null); }
/// <summary> /// Получить токен из uri /// </summary> /// <param name="webCallResult">Результат запроса</param> /// <returns>Возвращает uri содержащий токен</returns> /// <exception cref="VkApiException">URI должен содержать токен!</exception> private Uri GetTokenUri(WebCallResult webCallResult) { if (UriHasAccessToken(webCallResult.RequestUrl)) { return(webCallResult.RequestUrl); } _logger?.Debug("Запрос: " + webCallResult.RequestUrl); if (UriHasAccessToken(webCallResult.ResponseUrl)) { return(webCallResult.ResponseUrl); } _logger?.Debug("Ответ: " + webCallResult.ResponseUrl); throw new VkApiException("URI должен содержать токен!"); }
private long?HasCaptchaInput(WebCallResult result) { var request = VkAuthorization.From(result.RequestUrl.ToString()); var response = VkAuthorization.From(result.ResponseUrl.ToString()); if (request.IsCaptchaNeeded) { return(request.CaptchaSid); } if (response.IsCaptchaNeeded) { return(response.CaptchaSid); } return(null); }
/// <summary> /// Получить токен из uri /// </summary> /// <param name="webCallResult"> Результат запроса </param> /// <returns> Возвращает uri содержащий токен </returns> /// <exception cref="VkApiException"> URI должен содержать токен! </exception> private Uri GetTokenUri(WebCallResult webCallResult) { if (UriHasAccessToken(uri: webCallResult.RequestUrl)) { _logger?.LogDebug(message: "Запрос: " + webCallResult.RequestUrl); return(webCallResult.RequestUrl); } if (UriHasAccessToken(uri: webCallResult.ResponseUrl)) { _logger?.LogDebug(message: "Ответ: " + webCallResult.ResponseUrl); return(webCallResult.ResponseUrl); } return(null); }
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> /// WebCall. /// </summary> /// <param name="url">URL.</param> /// <param name="cookies">Cookies.</param> /// <param name="host">Хост.</param> /// <param name="port">Порт.</param> private WebCall(string url, Cookies cookies, string host = null, int?port = null) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (host != null && port != null) { Request.Proxy = new WebProxy(host, port.Value); } if (Request.Proxy != null) { // Авторизация с реквизитами по умолчанию (для NTLM прокси) Request.Proxy.Credentials = CredentialCache.DefaultCredentials; } Result = new WebCallResult(url, cookies); }
/// <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> /// WebCall. /// </summary> /// <param name="url">URL.</param> /// <param name="cookies">Cookies.</param> /// <param name="webProxy">Хост.</param> /// <param name="allowAutoRedirect">Разрешить авто редиррект</param> private WebCall(string url, Cookies cookies, IWebProxy webProxy = null, bool allowAutoRedirect = true) { var baseAddress = new Uri(url); var handler = new HttpClientHandler { CookieContainer = cookies.Container, UseCookies = true, Proxy = webProxy, AllowAutoRedirect = allowAutoRedirect }; _request = new HttpClient(handler) { BaseAddress = baseAddress, DefaultRequestHeaders = { Accept = {MediaTypeWithQualityHeaderValue.Parse("text/html")} } }; _result = new WebCallResult(url, cookies); }
/// <summary> /// WebCall. /// </summary> /// <param name="url">URL.</param> /// <param name="cookies">Cookies.</param> /// <param name="webProxy">Хост.</param> /// <param name="allowAutoRedirect">Разрешить авто редиррект</param> private WebCall(string url, Cookies cookies, IWebProxy webProxy = null, bool allowAutoRedirect = true) { var baseAddress = new Uri(url); var handler = new HttpClientHandler { CookieContainer = cookies.Container, UseCookies = true, Proxy = webProxy, AllowAutoRedirect = allowAutoRedirect }; _request = new HttpClient(handler) { BaseAddress = baseAddress, DefaultRequestHeaders = { Accept = { MediaTypeWithQualityHeaderValue.Parse("text/html") } } }; _result = new WebCallResult(url, cookies); }
/// <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="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 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 CaptchaNeededException( captchaSid.Value, "https://m.vk.com/captcha.php?sid=" + captchaSid.Value ); }
/// <summary> /// Из результата. /// </summary> /// <param name="result">Результат.</param> /// <returns>WEB форма.</returns> public static WebForm From(WebCallResult result) => new WebForm(result);
/// <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)); }
public static WebForm From(WebCallResult result) { return(new WebForm(result)); }
public static WebForm From(WebCallResult result) { return new WebForm(result); }
/// <summary> /// Авторизация прошла успешно /// </summary> /// <param name="webCallResult"></param> /// <returns>true, если авторизация прошла успешно</returns> private static bool IsAuthSuccessfull(WebCallResult webCallResult) => UriHasAccessToken(webCallResult.RequestUrl) || UriHasAccessToken(webCallResult.ResponseUrl);
/// <summary> /// Проверка наличия двухфакторной авторизации /// </summary> /// <param name="code">Функция возвращающая код двухфакторной авторизации</param> /// <param name="loginFormPostResult">Ответ сервера vk</param> /// <returns></returns> private bool HasNotTwoFactor(Func <string> code, WebCallResult loginFormPostResult) { _logger?.Debug("Проверка наличия двухфакторной авторизации"); return(code == null || WebForm.IsOAuthBlank(loginFormPostResult)); }
/// <summary> /// Авторизация прошла успешно /// </summary> /// <param name="webCallResult"> </param> /// <returns> true, если авторизация прошла успешно </returns> private static bool IsAuthSuccessfull(WebCallResult webCallResult) { return(UriHasAccessToken(uri: webCallResult.RequestUrl) || UriHasAccessToken(uri: webCallResult.ResponseUrl)); }
static internal void LogWebCallResultDebugInfo(string method, string url, HttpResponseMessage response, WebCallResult res, long executionTimeMS) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"{method} {url} - {(int)response.StatusCode} {response.ReasonPhrase} in {executionTimeMS} msec."); foreach (var header in response.Content.Headers) { sb.AppendLine($"{header.Key}: {string.Join("; ", header.Value)}"); } sb.AppendLine(res.Response); sb.AppendLine(); Console.WriteLine($"{nameof(VkApi)} [{nameof(WebCall)}]: " + sb.ToString()); if (WRITE_TO_FILE) { File.AppendAllText(HTTP_LOG_PATH, $"{DateTime.Now}: " + sb.ToString(), Encoding.UTF8); } }