protected async Task <WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable <KeyValuePair <string, string> > data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookies, Referer = referer, PostData = data }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; if (response.IsRedirect) { await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies); } if (returnCookiesFromFirstCall) { response.Cookies = firstCallCookies; } return(response); }
protected async Task <WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable <KeyValuePair <string, string> > data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null, bool accumulateCookies = false) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookies, Referer = referer, PostData = data, Encoding = Encoding }; var response = await webclient.GetString(request); CheckTrackerDown(response); if (accumulateCookies) { response.Cookies = ResolveCookies((request.Cookies == null ? "" : request.Cookies + " ") + response.Cookies); } var firstCallCookies = response.Cookies; if (response.IsRedirect) { await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies, accumulateCookies); } if (returnCookiesFromFirstCall) { response.Cookies = ResolveCookies(firstCallCookies + (accumulateCookies ? " " + response.Cookies : "")); } return(response); }
/// <summary> /// Get Torrents Page from Tracker by Query Provided /// </summary> /// <param name="request">URL created by Query Builder</param> /// <returns>Results from query</returns> private async Task <string> QueryTracker(string request) { // Cache mode not enabled or cached file didn't exist for our query Output("\nQuerying tracker for results...."); // Build WebRequest for index var myIndexRequest = new Utils.Clients.WebRequest() { Type = RequestType.GET, Url = request, Encoding = Encoding, Headers = EmulatedBrowserHeaders }; // Request our first page var results = await webclient.GetString(myIndexRequest); if (results.Status == HttpStatusCode.InternalServerError) // See issue #2110 { throw new Exception("Internal Server Error (" + results.Content + "), probably you reached the API limits, please reduce the number of queries"); } // Return results from tracker return(results.Content); }
public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary <string, string> { { "username", configData.Username.Value }, { "password", configData.Password.Value } }; var request = new Utils.Clients.WebRequest() { Url = LoginUrl, Type = RequestType.POST, Referer = SiteLink, PostData = pairs }; var response = await webclient.GetString(request); CQ splashDom = response.Content; var link = splashDom[".trow2 a"].First(); var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies); CQ resultDom = resultPage.Content; await ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () => { var tries = resultDom["#main tr:eq(1) td font"].First().Text(); var errorMessage = "Incorrect username or password! " + tries + " tries remaining."; throw new ExceptionWithConfigData(errorMessage, configData); }); }
public async Task ApplyConfiguration(JToken configJson) { var incomingConfig = new ConfigurationDataBasicLogin(); incomingConfig.LoadValuesFromJson(configJson); var pairs = new Dictionary<string, string> { { "username", incomingConfig.Username.Value }, { "password", incomingConfig.Password.Value } }; var request = new Utils.Clients.WebRequest() { Url = LoginUrl, Type = RequestType.POST, Referer = SiteLink, PostData = pairs }; var response = await webclient.GetString(request); CQ splashDom = response.Content; var link = splashDom[".trow2 a"].First(); var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies); CQ resultDom = resultPage.Content; await ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () => { var tries = resultDom["#main tr:eq(1) td font"].First().Text(); var errorMessage = "Incorrect username or password! " + tries + " tries remaining."; throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)incomingConfig); }); }
public async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary <string, string> { { "username", configData.Username.Value }, { "password", configData.Password.Value } }; var request = new Utils.Clients.WebRequest() { Url = SiteLink, Type = RequestType.POST, Referer = SiteLink, PostData = pairs }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; // Redirect to ? then to /t await FollowIfRedirect(response, request.Url, null, firstCallCookies); await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () => { CQ dom = response.Content; var messageEl = dom["body > div"].First(); var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); return(IndexerConfigurationStatus.RequiresTesting); }
public async Task ApplyConfiguration(JToken configJson) { var config = new ConfigurationDataBasicLoginAnimeBytes(); config.LoadValuesFromJson(configJson); lock (cache) { cache.Clear(); } // Get the login form as we need the CSRF Token var loginPage = await webclient.GetString(new Utils.Clients.WebRequest() { Url = LoginUrl }); CQ loginPageDom =loginPage.Content; var csrfToken = loginPageDom["input[name=\"csrf_token\"]"].Last(); // Build login form var pairs = new Dictionary<string, string> { { "csrf_token", csrfToken.Attr("value") }, { "username", config.Username.Value }, { "password", config.Password.Value }, { "keeplogged_sent", "true" }, { "keeplogged", "on" }, { "login", "Log In!" } }; // Do the login var request = new Utils.Clients.WebRequest() { Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl }; var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null); // Follow the redirect await FollowIfRedirect(response, request.Url, SearchUrl); if (!(response.Content != null && response.Content.Contains("/user/logout"))) { // Their login page appears to be broken and just gives a 500 error. throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", (ConfigurationData)config); } else { cookieHeader = response.Cookies; AllowRaws = config.IncludeRaw.Value; var configSaveData = new JObject(); configSaveData["cookies"] = cookieHeader; configSaveData["raws"] = AllowRaws; SaveConfig(configSaveData); IsConfigured = true; } }
public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { LoadValuesFromJson(configJson); var pairs = new Dictionary <string, string> { { "username", configData.Username.Value }, { "password", configData.Password.Value }, { "g-recaptcha-response", configData.Captcha.Value } }; if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie)) { CookieHeader = configData.Captcha.Cookie; try { var results = await PerformQuery(new TorznabQuery()); if (results.Count() == 0) { throw new Exception("Your cookie did not work"); } IsConfigured = true; SaveConfig(); return(IndexerConfigurationStatus.Completed); } catch (Exception e) { IsConfigured = false; throw new Exception("Your cookie did not work: " + e.Message); } } var request = new Utils.Clients.WebRequest() { Url = TakeLoginUrl, Type = RequestType.POST, Referer = SiteLink, Encoding = Encoding, PostData = pairs }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; // Redirect to ? then to /t await FollowIfRedirect(response, request.Url, null, firstCallCookies); await ConfigureIfOK(firstCallCookies, response.Content.Contains("/lout.php"), () => { CQ dom = response.Content; var messageEl = dom["body > div"].First(); var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); return(IndexerConfigurationStatus.RequiresTesting); }
public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { LoadValuesFromJson(configJson); lock (cache) { cache.Clear(); } // Get the login form as we need the CSRF Token var loginPage = await webclient.GetString(new Utils.Clients.WebRequest() { Url = LoginUrl, Encoding = Encoding, EmulateBrowser = true }); CQ loginPageDom = loginPage.Content; var csrfIndex = loginPageDom["input[name=\"_CSRF_INDEX\"]"].Last(); var csrfToken = loginPageDom["input[name=\"_CSRF_TOKEN\"]"].Last(); // Build login form var pairs = new Dictionary <string, string> { { "_CSRF_INDEX", csrfIndex.Attr("value") }, { "_CSRF_TOKEN", csrfToken.Attr("value") }, { "username", configData.Username.Value }, { "password", configData.Password.Value }, { "keeplogged_sent", "true" }, { "keeplogged", "on" }, { "login", "Log In!" } }; // Do the login var request = new Utils.Clients.WebRequest() { Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Encoding = Encoding, Url = LoginUrl, EmulateBrowser = true }; var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null); // Follow the redirect await FollowIfRedirect(response, request.Url, SearchUrl); await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/user/logout"), () => { // Their login page appears to be broken and just gives a 500 error. throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", configData); }); return(IndexerConfigurationStatus.RequiresTesting); }
protected async Task <WebClientStringResult> PostDataWithCookies(string url, IEnumerable <KeyValuePair <string, string> > data, string cookieOverride = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookieOverride ?? CookieHeader, PostData = data }; return(await webclient.GetString(request)); }
protected async Task <WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = cookieOverride ?? CookieHeader }; if (cookieOverride != null) { request.Cookies = cookieOverride; } return(await webclient.GetBytes(request)); }
protected async Task <WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = CookieHeader, Referer = referer, Headers = headers }; if (cookieOverride != null) { request.Cookies = cookieOverride; } return(await webclient.GetString(request)); }
protected async Task <WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null, RequestType method = RequestType.GET, string referer = null, IEnumerable <KeyValuePair <string, string> > data = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = method, Cookies = cookieOverride ?? CookieHeader, PostData = data, Referer = referer, Encoding = Encoding }; if (cookieOverride != null) { request.Cookies = cookieOverride; } return(await webclient.GetBytes(request)); }
protected async Task <WebClientStringResult> PostDataWithCookies(string url, IEnumerable <KeyValuePair <string, string> > data, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null, string rawbody = null, bool?emulateBrowser = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookieOverride ?? CookieHeader, PostData = data, Referer = referer, Headers = headers, RawBody = rawbody }; if (emulateBrowser.HasValue) { request.EmulateBrowser = emulateBrowser.Value; } return(await webclient.GetString(request)); }
protected async Task<WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = CookieHeader, Referer = referer, Headers = headers, Encoding = Encoding }; if (cookieOverride != null) request.Cookies = cookieOverride; WebClientStringResult result = await webclient.GetString(request); CheckTrackerDown(result); UpdateCookieHeader(result.Cookies, cookieOverride); return result; }
protected virtual async Task<WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null, RequestType method = RequestType.GET, string referer = null, IEnumerable<KeyValuePair<string, string>> data = null, Dictionary<string, string> headers = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = method, Cookies = cookieOverride ?? CookieHeader, PostData = data, Referer = referer, Headers = headers, Encoding = Encoding }; if (cookieOverride != null) request.Cookies = cookieOverride; var result = await webclient.GetBytes(request); UpdateCookieHeader(result.Cookies, cookieOverride); return result; }
/// <summary> /// Get Torrents Page from Tracker by Query Provided /// </summary> /// <param name="request">URL created by Query Builder</param> /// <returns>Results from query</returns> private async Task <String> QueryTracker(string request) { // Cache mode not enabled or cached file didn't exist for our query Output("\nQuerying tracker for results...."); // Build WebRequest for index var myIndexRequest = new Utils.Clients.WebRequest() { Type = RequestType.GET, Url = request, Encoding = Encoding, Headers = EmulatedBrowserHeaders }; // Request our first page var results = await webclient.GetString(myIndexRequest); // Return results from tracker return(results.Content); }
protected async new Task <WebClientByteResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = CookieHeader, Referer = referer, Headers = headers }; if (cookieOverride != null) { request.Cookies = cookieOverride; } WebClientByteResult result = await webclient.GetBytes(request); UpdateCookieHeader(result.Cookies, cookieOverride); return(result); }
protected async Task<WebClientStringResult> PostDataWithCookies(string url, IEnumerable<KeyValuePair<string, string>> data, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null, string rawbody = null, bool? emulateBrowser = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookieOverride ?? CookieHeader, PostData = data, Referer = referer, Headers = headers, RawBody = rawbody, Encoding = Encoding }; if (emulateBrowser.HasValue) request.EmulateBrowser = emulateBrowser.Value; WebClientStringResult result = await webclient.GetString(request); CheckTrackerDown(result); UpdateCookieHeader(result.Cookies, cookieOverride); return result; }
/// <summary> /// Perform login to racker /// </summary> /// <returns></returns> private async Task DoLogin() { // Build WebRequest for index var myIndexRequest = new Utils.Clients.WebRequest() { Type = RequestType.GET, Url = SiteLink, Headers = _emulatedBrowserHeaders, Encoding = Encoding }; // Get index page for cookies Output("\nGetting index page (for cookies).. with " + SiteLink); var indexPage = await webclient.GetString(myIndexRequest); // Building login form data var pairs = new Dictionary <string, string> { { "username", ConfigData.Username.Value }, { "password", ConfigData.Password.Value } }; // Build WebRequest for login var myRequestLogin = new Utils.Clients.WebRequest() { Type = RequestType.GET, Url = LoginUrl, Headers = _emulatedBrowserHeaders, Cookies = indexPage.Cookies, Referer = SiteLink, Encoding = Encoding }; // Get login page -- (not used, but simulation needed by tracker security's checks) LatencyNow(); Output("\nGetting login page (user simulation).. with " + LoginUrl); await webclient.GetString(myRequestLogin); // Build WebRequest for submitting authentification var request = new Utils.Clients.WebRequest() { PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginCheckUrl, Headers = _emulatedBrowserHeaders, Cookies = indexPage.Cookies, Encoding = Encoding }; // Perform loggin LatencyNow(); Output("\nPerform loggin.. with " + LoginCheckUrl); var response = await webclient.GetString(request); // Test if we are logged in await ConfigureIfOK(response.Cookies, response.Cookies != null && response.Cookies.Contains("uid="), () => { // Default error message var message = "Error during attempt !"; // Parse redirect header var redirectTo = response.RedirectingTo; // Oops, unable to login Output("-> Login failed: " + message, "error"); throw new ExceptionWithConfigData("Login failed: " + message, configData); }); Output("\nCookies saved for future uses..."); ConfigData.CookieHeader.Value = indexPage.Cookies + " " + response.Cookies + " ts_username="******"\n-> Login Success\n"); }
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary<string, string> { { "username", configData.Username.Value }, { "password", configData.Password.Value }, { "g-recaptcha-response", configData.Captcha.Value } }; if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie)) { CookieHeader = configData.Captcha.Cookie; try { var results = await PerformQuery(new TorznabQuery()); if (results.Count() == 0) { throw new Exception("Your cookie did not work"); } SaveConfig(); IsConfigured = true; return IndexerConfigurationStatus.Completed; } catch (Exception e) { IsConfigured = false; throw new Exception("Your cookie did not work: " + e.Message); } } var request = new Utils.Clients.WebRequest() { Url = TakeLoginUrl, Type = RequestType.POST, Referer = UseLink, PostData = pairs }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; // Redirect to ? then to /t await FollowIfRedirect(response, request.Url, null, firstCallCookies); await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () => { CQ dom = response.Content; var messageEl = dom["body > div"].First(); var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); return IndexerConfigurationStatus.RequiresTesting; }
protected async Task<WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable<KeyValuePair<string, string>> data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null, bool accumulateCookies = false) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookies, Referer = referer, PostData = data, Encoding = Encoding }; var response = await webclient.GetString(request); if (accumulateCookies) { response.Cookies = ResolveCookies((request.Cookies == null ? "" : request.Cookies + " ") + response.Cookies); } var firstCallCookies = response.Cookies; if (response.IsRedirect) { await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies, accumulateCookies); } if (returnCookiesFromFirstCall) { response.Cookies = ResolveCookies(firstCallCookies + (accumulateCookies ? " " + response.Cookies : "")); } return response; }
public async Task <HttpResponseMessage> Call(string indexerID, [FromUri] TorrentPotatoRequest request) { var indexer = indexerService.GetIndexer(indexerID); var allowBadApiDueToDebug = false; #if DEBUG allowBadApiDueToDebug = Debugger.IsAttached; #endif if (!allowBadApiDueToDebug && !string.Equals(request.passkey, serverService.Config.APIKey, StringComparison.InvariantCultureIgnoreCase)) { logger.Warn(string.Format("A request from {0} was made with an incorrect API key.", Request.GetOwinContext().Request.RemoteIpAddress)); return(Request.CreateResponse(HttpStatusCode.Forbidden, "Incorrect API key")); } if (!indexer.IsConfigured) { logger.Warn(string.Format("Rejected a request to {0} which is unconfigured.", indexer.DisplayName)); return(Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer is not configured.")); } if (!indexer.TorznabCaps.Categories.Select(c => c.ID).Any(i => MOVIE_CATS.Contains(i))) { logger.Warn(string.Format("Rejected a request to {0} which does not support searching for movies.", indexer.DisplayName)); return(Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer does not support movies.")); } var year = 0; if (string.IsNullOrWhiteSpace(request.search)) { // We are searching by IMDB id so look up the name var omdbapiRequest = new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid); omdbapiRequest.Encoding = Encoding.UTF8; var response = await webClient.GetString(omdbapiRequest); if (response.Status == HttpStatusCode.OK) { JObject result = JObject.Parse(response.Content); if (result["Title"] != null) { request.search = result["Title"].ToString(); year = ParseUtil.CoerceInt(result["Year"].ToString()); } } } var torznabQuery = new TorznabQuery() { ApiKey = request.passkey, Categories = MOVIE_CATS, SearchTerm = request.search, ImdbID = request.imdbid, QueryType = "TorrentPotato" }; IEnumerable <ReleaseInfo> releases = new List <ReleaseInfo>(); if (!string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) { releases = await indexer.PerformQuery(torznabQuery); releases = indexer.CleanLinks(releases); } // Cache non query results if (string.IsNullOrEmpty(torznabQuery.SanitizedSearchTerm)) { cacheService.CacheRssResults(indexer, releases); } releases = indexer.FilterResults(torznabQuery, releases); var serverUrl = string.Format("{0}://{1}:{2}{3}", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port, serverService.BasePath()); var potatoResponse = new TorrentPotatoResponse(); releases = TorznabUtil.FilterResultsToTitle(releases, torznabQuery.SanitizedSearchTerm, year); releases = TorznabUtil.FilterResultsToImdb(releases, request.imdbid); foreach (var r in releases) { var release = Mapper.Map <ReleaseInfo>(r); release.Link = serverService.ConvertToProxyLink(release.Link, serverUrl, indexerID, "dl", release.Title + ".torrent"); // Only accept torrent links, magnet is not supported if (release.Link != null) { potatoResponse.results.Add(new TorrentPotatoResponseItem() { release_name = release.Title + "[" + indexer.DisplayName + "]", // Suffix the indexer so we can see which tracker we are using in CPS as it just says torrentpotato >.> torrent_id = release.Guid.ToString(), details_url = release.Comments.ToString(), download_url = release.Link.ToString(), imdb_id = release.Imdb.HasValue ? "tt" + release.Imdb : null, freeleech = (release.DownloadVolumeFactor == 0 ? true : false), type = "movie", size = (long)release.Size / (1024 * 1024), // This is in MB leechers = (int)release.Peers - (int)release.Seeders, seeders = (int)release.Seeders, publish_date = r.PublishDate == DateTime.MinValue ? null : release.PublishDate.ToUniversalTime().ToString("s") }); } } // Log info if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) { logger.Info(string.Format("Found {0} torrentpotato releases from {1}", releases.Count(), indexer.DisplayName)); } else { logger.Info(string.Format("Found {0} torrentpotato releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.GetQueryString())); } // Force the return as Json return(new HttpResponseMessage() { Content = new JsonContent(potatoResponse) }); }
/// <summary> /// Configure our SceneFZ Provider /// </summary> /// <param name="configJson">Our params in Json</param> /// <returns>Configuration state</returns> public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { try { // Retrieve config values set by Jackett's user LoadValuesFromJson(configJson); // Check & Validate Config validateConfig(); // Setting our data for a better emulated browser (maximum security) // TODO: Encoded Content not supported by Jackett at this time // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate"); // If we want to simulate a browser if (ConfigData.Browser.Value) { // Clean headers emulatedBrowserHeaders.Clear(); // Inject headers emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value); emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value); emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString()); emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString()); emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value); } // Building login form data var pairs = new Dictionary <string, string> { { "username", ConfigData.Username.Value }, { "password", ConfigData.Password.Value }, { "submitme", "X" }, { "returnto", "%2F" } }; // Getting login form to retrieve PHPSESSID var myRequest = new Utils.Clients.WebRequest() { Url = LoginUrl }; // Add our headers to request myRequest.Headers = emulatedBrowserHeaders; // Get login page var loginPage = await webclient.GetString(myRequest); // Do the login var request = new Utils.Clients.WebRequest() { Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginCheckUrl, Headers = emulatedBrowserHeaders }; // Perform loggin latencyNow(); output("\nPerform login.. with " + LoginCheckUrl); // Get login page var response = await webclient.GetString(request); output("\nTesting if we are logged..."); await ConfigureIfOK(response.Cookies, response.Cookies != null && response.Cookies.Contains("uid="), () => { output("-> Login Failed: Wrong username or Password"); throw new ExceptionWithConfigData("Wrong username or Password", configData); }); output("-> Login Success"); return(IndexerConfigurationStatus.RequiresTesting); } catch (Exception e) { IsConfigured = false; Console.WriteLine("Exception thrown : {0}.", e.Message); Console.WriteLine(e.StackTrace); throw e; } }
protected async Task<WebClientStringResult> PostDataWithCookies(string url, IEnumerable<KeyValuePair<string, string>> data, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null, string rawbody = null, bool? emulateBrowser = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookieOverride ?? CookieHeader, PostData = data, Referer = referer, Headers = headers, RawBody = rawbody }; if (emulateBrowser.HasValue) request.EmulateBrowser = emulateBrowser.Value; return await webclient.GetString(request); }
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); lock (cache) { cache.Clear(); } // Get the login form as we need the CSRF Token var loginPage = await webclient.GetString(new Utils.Clients.WebRequest() { Url = LoginUrl }); CQ loginPageDom = loginPage.Content; var csrfToken = loginPageDom["input[name=\"csrf_token\"]"].Last(); // Build login form var pairs = new Dictionary<string, string> { { "csrf_token", csrfToken.Attr("value") }, { "username", configData.Username.Value }, { "password", configData.Password.Value }, { "keeplogged_sent", "true" }, { "keeplogged", "on" }, { "login", "Log In!" } }; // Do the login var request = new Utils.Clients.WebRequest() { Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl }; var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null); // Follow the redirect await FollowIfRedirect(response, request.Url, SearchUrl); await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/user/logout"), () => { // Their login page appears to be broken and just gives a 500 error. throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", configData); }); return IndexerConfigurationStatus.RequiresTesting; }
/// <summary> /// Configure our Provider /// </summary> /// <param name="configJson">Our params in Json</param> /// <returns>Configuration state</returns> public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { // Retrieve config values set by Jackett's user ConfigData.LoadValuesFromJson(configJson); // Check & Validate Config validateConfig(); // Setting our data for a better emulated browser (maximum security) // TODO: Encoded Content not supported by Jackett at this time // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate"); // If we want to simulate a browser if (ConfigData.Browser.Value) { // Clean headers emulatedBrowserHeaders.Clear(); // Inject headers emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value); emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value); emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString()); emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString()); emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value); } // Getting login form to retrieve CSRF token /*var myRequest = new Utils.Clients.WebRequest() { Url = LoginUrl };*/ // Add our headers to request //myRequest.Headers = emulatedBrowserHeaders; // Building login form data var pairs = new Dictionary<string, string> { { "username", ConfigData.Username.Value }, { "password", ConfigData.Password.Value } }; // Do the login var request = new Utils.Clients.WebRequest(){ PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl, Headers = emulatedBrowserHeaders }; // Perform loggin latencyNow(); output("\nPerform loggin.. with " + LoginUrl); var response = await webclient.GetString(request); // Test if we are logged in await ConfigureIfOK(response.Cookies, !response.Cookies.Contains("deleted"), () => { // Parse error page CQ dom = response.Content; string message = dom[".error"].Text().Trim().Replace("X\n\t\t", "").Replace("\n\t\tX", ""); // Oops, unable to login output("-> Login failed: \"" + message + "\".", "error"); throw new ExceptionWithConfigData("Login failed: << " + message + " >>", configData); }); output("-> Login Success"); return IndexerConfigurationStatus.RequiresTesting; }
/// <summary> /// Configure our WiHD Provider /// </summary> /// <param name="configJson">Our params in Json</param> /// <returns>Configuration state</returns> public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { // Retrieve config values set by Jackett's user LoadValuesFromJson(configJson); // Check & Validate Config validateConfig(); // Setting our data for a better emulated browser (maximum security) // TODO: Encoded Content not supported by Jackett at this time // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate"); // If we want to simulate a browser if (ConfigData.Browser.Value) { // Clean headers emulatedBrowserHeaders.Clear(); // Inject headers emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value); emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value); emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString()); emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString()); emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value); } // Getting login form to retrieve CSRF token var myRequest = new Utils.Clients.WebRequest() { Url = LoginUrl }; // Add our headers to request myRequest.Headers = emulatedBrowserHeaders; // Building login form data var pairs = new Dictionary <string, string> { { "username", ConfigData.Username.Value }, { "password", ConfigData.Password.Value }, { "keeplogged", "1" }, { "login", "Connexion" } }; // Do the login var request = new Utils.Clients.WebRequest() { PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl, Headers = emulatedBrowserHeaders }; // Perform loggin latencyNow(); output("\nPerform loggin.. with " + LoginUrl); var response = await webclient.GetString(request); // Test if we are logged in await ConfigureIfOK(response.Cookies, response.Cookies.Contains("session="), () => { // Parse error page CQ dom = response.Content; string message = dom[".warning"].Text().Split('.').Reverse().Skip(1).First(); // Try left string left = dom[".info"].Text().Trim(); // Oops, unable to login output("-> Login failed: \"" + message + "\" and " + left + " tries left before being banned for 6 hours !", "error"); throw new ExceptionWithConfigData("Login failed: " + message, configData); }); output("-> Login Success"); return(IndexerConfigurationStatus.RequiresTesting); }
/// <summary> /// Configure our WiHD Provider /// </summary> /// <param name="configJson">Our params in Json</param> /// <returns>Configuration state</returns> public async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { // Retrieve config values set by Jackett's user ConfigData.LoadValuesFromJson(configJson); // Check & Validate Config validateConfig(); // Setting our data for a better emulated browser (maximum security) // TODO: Encoded Content not supported by Jackett at this time // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate"); // If we want to simulate a browser if (ConfigData.Browser.Value) { // Clean headers emulatedBrowserHeaders.Clear(); // Inject headers emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value); emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value); emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString()); emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString()); emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value); } // Getting login form to retrieve CSRF token var myRequest = new Utils.Clients.WebRequest() { Url = LoginUrl }; // Add our headers to request myRequest.Headers = emulatedBrowserHeaders; // Get login page var loginPage = await webclient.GetString(myRequest); // Retrieving our CSRF token CQ loginPageDom = loginPage.Content; var csrfToken = loginPageDom["input[name=\"_csrf_token\"]"].Last(); // Building login form data var pairs = new Dictionary <string, string> { { "_csrf_token", csrfToken.Attr("value") }, { "_username", ConfigData.Username.Value }, { "_password", ConfigData.Password.Value }, { "_remember_me", "on" }, { "_submit", "" } }; // Do the login var request = new Utils.Clients.WebRequest() { Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl, Headers = emulatedBrowserHeaders }; // Perform loggin latencyNow(); output("Perform loggin.. with " + LoginCheckUrl); var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null); // Test if we are logged in await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () => { // Oops, unable to login throw new ExceptionWithConfigData("Failed to login", configData); }); return(IndexerConfigurationStatus.RequiresTesting); }
protected async Task<WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = CookieHeader, Referer = referer, Headers = headers }; if (cookieOverride != null) request.Cookies = cookieOverride; return await webclient.GetString(request); }
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary<string, string> { { "username", configData.Username.Value }, { "password", configData.Password.Value } }; var request = new Utils.Clients.WebRequest() { Url = SiteLink, Type = RequestType.POST, Referer = SiteLink, PostData = pairs }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; // Redirect to ? then to /t await FollowIfRedirect(response, request.Url, null, firstCallCookies); await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () => { CQ dom = response.Content; var messageEl = dom["body > div"].First(); var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); return IndexerConfigurationStatus.RequiresTesting; }
protected async Task<WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.GET, Cookies = cookieOverride ?? CookieHeader }; if (cookieOverride != null) request.Cookies = cookieOverride; return await webclient.GetBytes(request); }
protected async Task<WebClientStringResult> PostDataWithCookies(string url, Dictionary<string, string> data, string cookieOverride = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookieOverride ?? cookieHeader, PostData = data }; return await webclient.GetString(request); }
protected async Task<WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable<KeyValuePair<string, string>> data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null) { var request = new Utils.Clients.WebRequest() { Url = url, Type = RequestType.POST, Cookies = cookies, Referer = referer, PostData = data }; var response = await webclient.GetString(request); var firstCallCookies = response.Cookies; if (response.IsRedirect) { await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies); } if (returnCookiesFromFirstCall) { response.Cookies = firstCallCookies; } return response; }
/// <summary> /// Configure our WiHD Provider /// </summary> /// <param name="configJson">Our params in Json</param> /// <returns>Configuration state</returns> public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) { // Retrieve config values set by Jackett's user ConfigData.LoadValuesFromJson(configJson); // Check & Validate Config validateConfig(); // Setting our data for a better emulated browser (maximum security) // TODO: Encoded Content not supported by Jackett at this time // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate"); // If we want to simulate a browser if (ConfigData.Browser.Value) { // Clean headers emulatedBrowserHeaders.Clear(); // Inject headers emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value); emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value); emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString()); emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString()); emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value); } // Getting login form to retrieve CSRF token var myRequest = new Utils.Clients.WebRequest() { Url = LoginUrl }; // Add our headers to request myRequest.Headers = emulatedBrowserHeaders; // Get login page var loginPage = await webclient.GetString(myRequest); // Retrieving our CSRF token CQ loginPageDom = loginPage.Content; var csrfToken = loginPageDom["input[name=\"_csrf_token\"]"].Last(); // Building login form data var pairs = new Dictionary<string, string> { { "_csrf_token", csrfToken.Attr("value") }, { "_username", ConfigData.Username.Value }, { "_password", ConfigData.Password.Value }, { "_remember_me", "on" }, { "_submit", "" } }; // Do the login var request = new Utils.Clients.WebRequest(){ Cookies = loginPage.Cookies, PostData = pairs, Referer = LoginUrl, Type = RequestType.POST, Url = LoginUrl, Headers = emulatedBrowserHeaders }; // Perform loggin latencyNow(); output("\nPerform loggin.. with " + LoginCheckUrl); var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null); // Test if we are logged in await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () => { // Oops, unable to login output("-> Login failed", "error"); throw new ExceptionWithConfigData("Failed to login", configData); }); output("-> Login Success"); return IndexerConfigurationStatus.RequiresTesting; }