Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="BraveScraper"/> class using the provided <see cref="HttpClient"/> and API endpoint.
 /// </summary>
 public BraveScraper(HttpClient client, string apiEndpoint)
 {
     GScraperGuards.NotNull(client, nameof(client));
     GScraperGuards.NotNullOrEmpty(apiEndpoint, nameof(apiEndpoint));
     _httpClient             = client;
     _httpClient.BaseAddress = new Uri(apiEndpoint);
     if (_httpClient.DefaultRequestHeaders.UserAgent.Count == 0)
     {
         _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(_defaultUserAgent);
     }
 }
Exemplo n.º 3
0
        /// <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));
        }
Exemplo n.º 4
0
        /// <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));
        }