Public/Network/Show-WhoIs.ps1

Set-Alias -Name whois -Value Show-WhoIs
function Show-WhoIs {
  <#
    .SYNOPSIS
        Performs the registration record for a domain name or an IP address.
    .DESCRIPTION
        Show-WhoIs uses API of external services and has no core library
        dependencies, so it can be easily modified for use outside of the
        module.
    .PARAMETER Domain
        Specifies a DNS name or an IP address.
    .PARAMETER UseAlternative
        Strongly required when specifying an IP address.
    .EXAMPLE
        Show-WhoIs 20.54.36.229 -UseAlternative
    .EXAMPLE
        Show-WhoIs microsoft.com
    .INPUTS
        System.String
    .OUTPUTS
        System.Array
  #>

  [CmdletBinding()]
  param(
    [Parameter(Mandatory, Position = 0, ValueFromPipeline)]
    [ValidateNotNullOrEmpty()]
    [String]$Domain,

    [Parameter()][Switch]$UseAlternative
  )

  process {
    $params = @{
      Uri     = "https://www.$($UseAlternative ? 'nic.ru/app/v1/get/whois' : ("virustotal.com/api/v3/domains/$Domain"))"
      Method  = $UseAlternative ? 'POST' : 'GET'
      Headers = @{'x-apikey' = '4d1ee14a3191ba1afde5261326dcd7e81793afacb6aa7e46d0b467bc6ebcd367' }
    }

    if ($UseAlternative) {
      $params.Body = "{`"searchWord`":`"$Domain`"}"
      $params.ContentType = 'application/json;charset=UTF-8'
      $params.Remove('Headers')
    }

    if (($res = Invoke-WebRequest @params).StatusCode -ne 200) {
      throw [InvalidOperationException]::new($res.StatusDescription)
    }

    $res = ConvertFrom-Json -InputObject $res.Content
    $UseAlternative ? (
      $res.body.list.ForEach{
        "Registry: $($_.registry)"
        $_.html ? ($_.html -replace '<[^>]*>') : $(
          foreach ($item in $_.formatted) {
            "$($item.name) $($item.value -replace '<[^>]*>')"
          }
        )
      }
    ) : $res.data.attributes.whois
  }
}