Public/Set-NMMHiddenApiCookie.ps1

function Set-NMMHiddenApiCookie {
    <#
    .SYNOPSIS
        Set authentication cookies for NMM Hidden API access.
    .DESCRIPTION
        Uses cookies captured from a browser session to authenticate to NMM's internal APIs.
 
        RECOMMENDED: Use Cookie-Editor browser extension
        1. Install "Cookie-Editor" extension for Chrome/Edge
        2. Log into NMM web portal
        3. Click Cookie-Editor icon > Export > "Header String"
        4. Paste in PowerShell: Set-NMMHiddenApiCookie -CookieString "<paste>"
 
        Note: Cookies expire when your browser session ends. You'll need to re-export
        cookies after logging in again.
    .PARAMETER Cookies
        Hashtable of cookie name/value pairs.
    .PARAMETER CookieString
        Cookie header string (format: "name1=value1;name2=value2").
        Export this from Cookie-Editor extension using "Header String" format.
    .EXAMPLE
        # Using Cookie-Editor "Header String" export (RECOMMENDED)
        Set-NMMHiddenApiCookie -CookieString ".AspNetCore.Cookies=abc123;XSRF-TOKEN=xyz789;ARRAffinity=abc"
 
    .EXAMPLE
        Set-NMMHiddenApiCookie -Cookies @{ ".AspNetCore.Cookies" = "abc123"; "XSRF-TOKEN" = "xyz" }
 
        Sets cookies from a hashtable.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'Hashtable')]
        [hashtable]$Cookies,

        [Parameter(Mandatory = $true, ParameterSetName = 'String')]
        [string]$CookieString
    )

    process {
        if ($PSCmdlet.ParameterSetName -eq 'String') {
            # Parse cookie string into hashtable
            $Cookies = @{}

            # Handle different formats (semicolon with or without space)
            $CookieString -split ';' | ForEach-Object {
                $trimmed = $_.Trim()
                if ($trimmed -match '^([^=]+)=(.+)$') {
                    $name = $matches[1].Trim()
                    $value = $matches[2].Trim()
                    if ($name -and $value) {
                        $Cookies[$name] = $value
                        Write-Verbose "Parsed cookie: $name"
                    }
                }
            }

            if ($Cookies.Count -eq 0) {
                Write-Warning "No cookies parsed from string. Make sure format is: name=value; name2=value2"
                Write-Warning "Tip: In browser console, run: copy(document.cookie)"
                return $null
            }
        }

        # Store cookies for use by Invoke-HiddenApiRequest
        $Script:HiddenApiCookies = $Cookies
        $Script:HiddenApiAuthMethod = 'Cookie'

        Write-Host ""
        Write-Host " ✓ Cookies set for Hidden API authentication" -ForegroundColor Green
        Write-Host " Cookie count: $($Cookies.Count)" -ForegroundColor Gray
        Write-Host " Cookies: $($Cookies.Keys -join ', ')" -ForegroundColor Gray
        Write-Host ""
        Write-Host " Use Invoke-HiddenApiRequest to call APIs." -ForegroundColor DarkGray
        Write-Host ""

        return [PSCustomObject]@{
            AuthMethod  = 'Cookie'
            CookieCount = $Cookies.Count
            CookieNames = [array]$Cookies.Keys
        }
    }
}