private static string BuildImageQuery(string token, string query, SafeSearchLevel safeSearch, DuckDuckGoImageTime time, DuckDuckGoImageSize size, DuckDuckGoImageColor color, DuckDuckGoImageType type, DuckDuckGoImageLayout layout, DuckDuckGoImageLicense license, string region) { string url = $"?l={region}" + "&o=json" + $"&q={Uri.EscapeDataString(query)}" + $"&vqd={token}" + "&f="; url += time == DuckDuckGoImageTime.Any ? ',' : $"time:{time},"; url += size == DuckDuckGoImageSize.All ? ',' : $"size:{size},"; url += color == DuckDuckGoImageColor.All ? ',' : $"color:{color.ToString().ToLowerInvariant()},"; url += type == DuckDuckGoImageType.All ? ',' : $"type:{type},"; url += layout == DuckDuckGoImageLayout.All ? ',' : $"layout:{layout},"; url += license == DuckDuckGoImageLicense.All ? "" : $"license:{license}"; url += $"&p={(safeSearch == SafeSearchLevel.Off ? "-1" : "1")}"; return(url); }
private static string BuildImageQuery(string query, SafeSearchLevel safeSearch, GoogleImageSize size, string?color, GoogleImageType type, GoogleImageTime time, string?license, string?language) { string url = $"?q={Uri.EscapeDataString(query)}&tbs="; url += size == GoogleImageSize.Any ? ',' : $"isz:{(char)size},"; url += string.IsNullOrEmpty(color) ? ',' : $"ic:{color},"; url += type == GoogleImageType.Any ? ',' : $"itp:{type.ToString().ToLowerInvariant()},"; url += time == GoogleImageTime.Any ? ',' : $"qdr:{(char)time},"; url += string.IsNullOrEmpty(license) ? "" : $"il:{license}"; url += "&espv=2" + "&biw=1366" + "&bih=667" + "&site=webhp" + "&source=lnms" + "&tbm=isch" + "&sa=X" + "&ei=XosDVaCXD8TasATItgE" + "&ved=0CAcQ_AUoAg"; url += "&safe=" + safeSearch switch { SafeSearchLevel.Off => "off", SafeSearchLevel.Moderate => "medium", SafeSearchLevel.Strict => "high", _ => throw new ArgumentException("Invalid safe search level.", nameof(safeSearch)) }; if (!string.IsNullOrEmpty(language)) { url += $"&lr=lang_{language}&hl={language}"; } return(url); }
/// <summary> /// Gets images from Brave Search. /// </summary> /// <remarks>This method returns at most 150 image results (unless Brave changes something in their API).</remarks> /// <param name="query">The search query.</param> /// <param name="safeSearch">The safe search level.</param> /// <param name="country">The country. <see cref="BraveCountries"/> contains the countries that can be used here.</param> /// <param name="size">The image size.</param> /// <param name="type">The image type.</param> /// <param name="layout">The image layout.</param> /// <param name="color">The image color.</param> /// <param name="license">The image license.</param> /// <returns>A task representing the asynchronous operation. The result contains an <see cref="IEnumerable{T}"/> of <see cref="BraveImageResult"/>.</returns> /// <exception cref="ArgumentNullException"><paramref name="query"/> is null or empty.</exception> /// <exception cref="GScraperException">An error occurred during the scraping process.</exception> public async Task <IEnumerable <BraveImageResult> > GetImagesAsync(string query, SafeSearchLevel safeSearch = SafeSearchLevel.Moderate, string?country = null, BraveImageSize size = BraveImageSize.All, BraveImageType type = BraveImageType.All, BraveImageLayout layout = BraveImageLayout.All, BraveImageColor color = BraveImageColor.All, BraveImageLicense license = BraveImageLicense.All) { GScraperGuards.NotNull(query, nameof(query)); byte[] bytes; using (var request = new HttpRequestMessage()) { string cookie = $"safesearch={safeSearch.ToString().ToLowerInvariant()}"; if (!string.IsNullOrEmpty(country)) { cookie += $"; country={country}"; } request.Method = HttpMethod.Get; request.RequestUri = new Uri(BuildImageQuery(query, size, type, layout, color, license), UriKind.Relative); request.Headers.Add("cookie", cookie); var response = await _httpClient.SendAsync(request).ConfigureAwait(false); response.EnsureSuccessStatusCode(); bytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); } var document = JsonDocument.Parse(bytes); var results = document.RootElement.GetPropertyOrDefault("results"); return(EnumerateResults(results)); }
/// <summary> /// Gets images from Google Images. /// </summary> /// <remarks>This method returns at most 100 image results.</remarks> /// <param name="query">The search query.</param> /// <param name="safeSearch">The safe search level.</param> /// <param name="size">The image size.</param> /// <param name="color">The image color. <see cref="GoogleImageColors"/> contains the colors that can be used here.</param> /// <param name="type">The image type.</param> /// <param name="time">The image time.</param> /// <param name="license">The image license. <see cref="GoogleImageLicenses"/> contains the licenses that can be used here.</param> /// <param name="language">The language code to use. <see cref="GoogleLanguages"/> contains the language codes that can be used here.</param> /// <returns>A task representing the asynchronous operation. The result contains an <see cref="IEnumerable{T}"/> of <see cref="GoogleImageResult"/>.</returns> /// <exception cref="ArgumentNullException"><paramref name="query"/> is null or empty.</exception> /// <exception cref="GScraperException">An error occurred during the scraping process.</exception> public async Task <IEnumerable <GoogleImageResult> > GetImagesAsync(string query, SafeSearchLevel safeSearch = SafeSearchLevel.Off, GoogleImageSize size = GoogleImageSize.Any, string?color = null, GoogleImageType type = GoogleImageType.Any, GoogleImageTime time = GoogleImageTime.Any, string?license = null, string?language = null) { GScraperGuards.NotNull(query, nameof(query)); var uri = new Uri(BuildImageQuery(query, safeSearch, size, color, type, time, license, language), UriKind.Relative); string page = await _httpClient.GetStringAsync(uri).ConfigureAwait(false); JsonElement rawImages; try { rawImages = ExtractDataPack(page); } catch (Exception e) when(e is ArgumentOutOfRangeException or JsonException) { throw new GScraperException("Failed to unpack the image object data.", "Google", e); } return(EnumerateResults(rawImages)); }
/// <summary> /// Gets images from DuckDuckGo. /// </summary> /// <remarks>This method returns at most 100 image results.</remarks> /// <param name="query">The search query.</param> /// <param name="safeSearch">The safe search level.</param> /// <param name="time">The image time.</param> /// <param name="size">The image size.</param> /// <param name="color">The image color.</param> /// <param name="type">The image type.</param> /// <param name="layout">The image layout.</param> /// <param name="license">The image license.</param> /// <param name="region">The region. <see cref="DuckDuckGoRegions"/> contains the regions that can be used here.</param> /// <returns>A task representing the asynchronous operation. The result contains an <see cref="IEnumerable{T}"/> of <see cref="DuckDuckGoImageResult"/>.</returns> /// <exception cref="ArgumentNullException"><paramref name="query"/> is null or empty.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="query"/> is larger than <see cref="MaxQueryLength"/>.</exception> /// <exception cref="GScraperException">An error occurred during the scraping process.</exception> public async Task <IEnumerable <DuckDuckGoImageResult> > GetImagesAsync(string query, SafeSearchLevel safeSearch = SafeSearchLevel.Moderate, DuckDuckGoImageTime time = DuckDuckGoImageTime.Any, DuckDuckGoImageSize size = DuckDuckGoImageSize.All, DuckDuckGoImageColor color = DuckDuckGoImageColor.All, DuckDuckGoImageType type = DuckDuckGoImageType.All, DuckDuckGoImageLayout layout = DuckDuckGoImageLayout.All, DuckDuckGoImageLicense license = DuckDuckGoImageLicense.All, string region = DuckDuckGoRegions.UsEnglish) { GScraperGuards.NotNull(query, nameof(query)); GScraperGuards.NotNullOrEmpty(region, nameof(region)); GScraperGuards.ArgumentInRange(query.Length, MaxQueryLength, nameof(query), $"The query cannot be larger than {MaxQueryLength}."); string token = await GetTokenAsync(query); var uri = new Uri($"i.js{BuildImageQuery(token, query, safeSearch, time, size, color, type, layout, license, region)}", UriKind.Relative); byte[] bytes; using (var request = new HttpRequestMessage()) { request.Method = HttpMethod.Get; request.RequestUri = uri; if (safeSearch == SafeSearchLevel.Strict) { request.Headers.Add("cookie", "p=1"); } else if (safeSearch == SafeSearchLevel.Off) { request.Headers.Add("cookie", "p=-2"); } var response = await _httpClient.SendAsync(request).ConfigureAwait(false); response.EnsureSuccessStatusCode(); bytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); } var document = JsonDocument.Parse(bytes); var results = document.RootElement.GetPropertyOrDefault("results"); return(EnumerateResults(results)); }