最近在做一个开源产品(github地址:https://github.com/LizardByte/Sunshine) 的二次开发适配,我需要对指定页面发送特定的post或get请求。我想用windows自带的powershell来实现。
这个开源产品sunshine安装完成后通过https://ip:47990/ 登录(预设账户密码为:sunshine)
登录进去后有个发送pin码的页面(https://192.168.0.13:47990/pin) 我想实现的就是:通过powershell登录并在pin页面输入pin码(假设pin码为1234)并点击send按钮
我找到一段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请求消息头:
这是sunshine安装完成后生成的pin.html页面文件里的pin码验证方法,看样子是使用post请求方法
有熟悉精通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