Private/Helper/Invoke-BenchmarkScraper.ps1

<#
Copyright © 2024 Integris. For internal company use only. All rights reserved.
#>


FUNCTION Invoke-BenchmarkScraper {
    <#
    .SYNOPSIS
    Scrapes benchmark data from specified domains.
 
    .DESCRIPTION
    This function retrieves and filters benchmark data from specified domains such as CPU, GPU, and hard drive benchmark sites.
 
    .PARAMETER Domain
    The domain to scrape data from. Valid values are "www.cpubenchmark.net", "www.videocardbenchmark.net", and "www.harddrivebenchmark.net".
 
    .PARAMETER Query
    The query string to filter results by name.
 
    .PARAMETER Limit
    The maximum number of results to return.
 
    .PARAMETER SortBy
    The property to sort results by. Default is "rank".
 
    .PARAMETER Order
    The order to sort results in. Default is "descending".
 
    .PARAMETER ItemId
    The ID of the item to filter results by.
 
    .EXAMPLE
    Invoke-BenchmarkScraper -Domain "www.cpubenchmark.net" -Query "Intel" -Limit 10 -SortBy "rank" -Order "ascending"
 
    .NOTES
    The function uses System.Net.Http.HttpClient to retrieve data and filters results based on user input.
    #>


    param (
        [string]$Domain = "www.cpubenchmark.net",
        [string]$Query,
        [int]$Limit,
        [string]$SortBy = "rank",
        [string]$Order = "descending",
        [int]$ItemId
    )

    Add-Type -AssemblyName System.Net.Http

    if ($Domain -notin @("www.videocardbenchmark.net", "www.cpubenchmark.net", "www.harddrivebenchmark.net")) {
        throw [System.ArgumentException]::new("Invalid domain given.")
    }

    $Url = @{
        "www.cpubenchmark.net" = "https://www.cpubenchmark.net/CPU_mega_page.html"
        "www.videocardbenchmark.net" = "https://www.videocardbenchmark.net/GPU_mega_page.html"
        "www.harddrivebenchmark.net" = "https://www.harddrivebenchmark.net/hdd-mega-page.html"
    }[$Domain]

    $Session = New-Object System.Net.Http.HttpClient
    $Headers = @{
        "referrer" = $Url
        "x-requested-with" = "XMLHttpRequest"
        "accept" = "application/json, text/javascript, */*; q=0.01"
    }
    $Session.DefaultRequestHeaders.Add("referrer", $Headers.referrer)
    $Session.DefaultRequestHeaders.Add("x-requested-with", $Headers."x-requested-with")
    $Session.DefaultRequestHeaders.Add("accept", $Headers.accept)

    $R1 = $Session.GetStringAsync($Url).Result
    $R1 | Out-Null
    $Url2 = "https://$Domain/data/?_=$([int](Get-Date -UFormat %s))000"
    $R2 = $Session.GetStringAsync($Url2).Result

    $Items = (ConvertFrom-Json $R2).data

    # Set Results to unfiltered Items value
    $Results = $Items

    # Apply user requested filters
    # Query by Name
    IF ($Query) { $Results = $Results | Where-Object { $_.name.ToLower() -like "*$($Query.ToLower())*" } }
    # Query by ItemId
    IF ($ItemId) { $Results = $Results | Where-Object { $_.id -eq $ItemId } }
    # Sort by Property and/or Order By ascending/descending
    IF ($SortBy -and $Order.ToLower() -eq "descending") { $Results = $Results | Sort-Object -Property $SortBy -Descending }
    ELSEIF ($SortBy) { $Results = $Results | Sort-Object -Property $SortBy }
    # Limit to # of Results
    IF ($Limit) { 
        IF (($Results | Where-Object { $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA"})) { 
            $Results = $Results | Where-Object { $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA"} | Select-Object -First $Limit 
        }
        ELSE {
            $Results = $Results | Select-Object -First $Limit 
        }
    }

    return $Results
}