如何使用powershell发送post/get请求

最近在做一个开源产品(github地址:https://github.com/LizardByte/Sunshine) 的二次开发适配,我需要对指定页面发送特定的post或get请求。我想用windows自带的powershell来实现。

这个开源产品sunshine安装完成后通过https://ip:47990/ 登录(预设账户密码为:sunshine)

img

登录进去后有个发送pin码的页面(https://192.168.0.13:47990/pin) 我想实现的就是:通过powershell登录并在pin页面输入pin码(假设pin码为1234)并点击send按钮

img

我找到一段powershell代码用于发送post请求,可以实现登录。但我不知道如何增加发送pin码参数。powershell里有二个命令函数可用于发送post请求:Invoke-WebRequest 和 Invoke-RestMethod

$username = "sunshine"
$password = "sunshine"
$url = "https://192.168.0.13:47990/pin"

# 创建一个 WebRequest 对象
$req = [System.Net.WebRequest]::Create($url)

# 禁用 SSL 证书验证
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

# 设置 HTTP 请求头
$req.Headers["Authorization"] = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)))"

# 发送 HTTP 请求
$res = $req.GetResponse()

# 输出响应的内容
$reader = New-Object System.IO.StreamReader($res.GetResponseStream())
$result = $reader.ReadToEnd()
$reader.Close()
$res.Close()
Write-Output $result

下面是pin页面的post请求消息头:

img

这是sunshine安装完成后生成的pin.html页面文件里的pin码验证方法,看样子是使用post请求方法

img

有熟悉精通powershell的帮忙看看该怎么写,sunshine很小,安装文件仅16MB 安装后也只有60MB多,也有硬盘版,只要电脑是独显都可以安装运行,懂串流的可以用moonlight测试。大家写的powershell代码可以在Windows PowerShell ISE 里面先自行测试下。谢谢~!!

仅供参考:
要发送带有参数的 POST 请求,可以使用 Invoke-RestMethod。以下是一个示例代码,用于在 PowerShell 中发送包含 pin 参数的 POST 请求:

$username = "sunshine"
$password = "sunshine"
$url = "https://192.168.0.13:47990/pin"
$pin = "1234"

$body = @{
    pin = $pin
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri $url -Method Post -Headers @{
    Authorization = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)))"
    ContentType = "application/json"
} -Body $body

Write-Output $response

在这段代码中,我们首先定义了用户名、密码、URL 和 pin 码。然后,我们使用 ConvertTo-Json 将参数转换为 JSON 格式,并将其存储在 $body 变量中。

接下来,我们使用 Invoke-RestMethod 函数来发送 POST 请求。我们使用 -Method 参数指定请求方法为 POST,使用 -Headers 参数设置请求头,包括授权信息和 Content-Type,以便服务器知道我们发送的是 JSON 格式的数据。最后,我们将 $body 变量作为请求体传递给 Invoke-RestMethod 函数。

如果请求成功,服务器将返回一个响应对象,我们可以将其输出到控制台。

您好,从您提供的信息来看,看不到它这个请求的参数在哪里以及参数如何传递和加密的。如果您最终没有解决的话,或者您可以换一个思路,可以通过selenium自动化工具来实现登陆和输入pin的功能,完全模仿人来输入和点击按钮。大致代码如下:


from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
b = webdriver.Chrome(options=options)
b.maximize_window()
b.get('http://xxxxxxxxxxx') #访问的网址,根据实际的位置修改
css_path = '#kw'    #pin输入框 根据实际的位置修改
b.find_element_by_css_selector(css_path).send_keys('1234')  #输入pin密码 根据实际的值修改
css_btn = '#su'    #按钮的位置,根据实际的位置修改
b.find_element_by_css_selector(css_btn).click()   #点击提交确定按钮

以下答案基于ChatGPT与GISer Liu编写:
你可以使用Invoke-RestMethod来发送post请求并附加参数。以下是一个示例代码:

$username = "sunshine"
$password = "sunshine"
$url = "https://192.168.0.13:47990/pin"
$pin = "1234"

# 创建一个请求对象
$req = @{
    Uri = $url
    Method = "POST"
    Headers = @{
        Authorization = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)))"
    }
    Body = @{
        pin = $pin
    }
    ContentType = "application/json"
}

# 发送HTTP请求
$res = Invoke-RestMethod @req

# 输出响应的内容
$res

在这个示例代码中,我们首先定义了用户名和密码以及目标URL,然后将要发送的PIN码赋值给$pin变量。接下来,我们创建了一个请求对象$req,并将它的URI设置为目标URL,请求方法设置为POST,请求头中包含授权信息,请求体中包含PIN码,并将内容类型设置为JSON。最后,我们使用Invoke-RestMethod函数发送请求,并输出响应内容。

注意,这个示例代码中将请求体的内容类型设置为了JSON,如果你的应用程序需要使用其他内容类型,请将ContentType的值相应地更改。另外,这个示例代码中假设应用程序接受JSON格式的请求体,如果应用程序接受其他格式的请求体,你需要根据情况修改请求体的格式。

可以使用Invoke-WebRequest命令来发送POST请求并附带参数。以下是一个示例代码,可以实现在登录后发送pin码的功能:

$username = "sunshine"
$password = "sunshine"
$url = "https://192.168.0.13:47990/pin"

# 构造POST请求的参数
$params = @{ pin = "1234" }

# 创建一个 WebRequest 对象
$req = [System.Net.WebRequest]::Create($url)

# 设置请求头和认证信息
$req.Method = "POST"
$req.Headers["Authorization"] = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)))"
$req.ContentType = "application/x-www-form-urlencoded"
$req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"

# 将POST参数写入请求的正文
$data = [System.Text.Encoding]::UTF8.GetBytes($params.GetEnumerator() | % { $_.Key + "=" + $_.Value } -join "&")
$req.ContentLength = $data.Length
$req.GetRequestStream().Write($data, 0, $data.Length)

# 发送请求并获取响应
$res = $req.GetResponse()

# 输出响应内容
$reader = New-Object System.IO.StreamReader($res.GetResponseStream())
$result = $reader.ReadToEnd()
$reader.Close()
$res.Close()
Write-Output $result

如果需要发送GET请求,可以将参数拼接在URL后面,如:

$username = "sunshine"
$password = "sunshine"
$url = "https://192.168.0.13:47990/pin?pin=1234"

# 创建一个 WebRequest 对象
$req = [System.Net.WebRequest]::Create($url)

# 设置请求头和认证信息
$req.Headers["Authorization"] = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)))"
$req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"

# 发送请求并获取响应
$res = $req.GetResponse()

# 输出响应内容
$reader = New-Object System.IO.StreamReader($res.GetResponseStream())
$result = $reader.ReadToEnd()
$reader.Close()
$res.Close()
Write-Output $result