如何使此 PowerShell Web 请求正确保存会话?
How can I make this PowerShell web request save the session properly?
我有这个脚本可以成功登录网站并执行查询:
$credential = Get-Credential
$postParams = @{username=$credential.UserName;password=$credential.GetNetworkCredential().password}
Invoke-WebRequest -Uri http://www.nexusmods.com/newvegas/sessions/?Login -Method POST -Body $postParams -SessionVariable cookie
$query = Invoke-WebRequest -Uri http://www.nexusmods.com/newvegas/mods/searchresults/? -WebSession $cookie
我想做的是对另一个网站 Trello 做类似的事情。这是脚本:
$credential = Get-Credential
$postParams = @{method='password';'factors[user]'=$credential.UserName;'factors[password]'=$credential.GetNetworkCredential().password}
Invoke-WebRequest -Uri https://trello.com/1/authentication -Method POST -Body $postParams -SessionVariable cookie
$result = Invoke-WebRequest -uri https://trello.com/ -WebSession $cookie
但是,result 变量显示的页面就像用户未登录一样,因此我假设会话未正确保存。我该如何解决这个问题?
根据站点处理登录的方式,您可能必须使用 Invoke-RestMethod。以下是如何通过 PowerShell 登录此站点的示例:
$u="username"
$p="password"
#1. Get page:
$page = Invoke-WebRequest "https://whosebug.com/users/login" -SessionVariable so
#2. Fill in login form:
$form = $page.Forms["login-form"]
$form.Fields["email"] = $u
$form.Fields["password"] = $p
#3. Submit login form:
$page = Invoke-RestMethod "https://whosebug.com/users/login" -Body $form -Method $form.Method -WebSession $so
#4. Do something else...
如果您想在 Web 上使用远程服务,最简单的方法是使用他们的 API。所以这是走那条路的方法。
在此处注册 API 的第 1 步:https://trello.com/app-key
在下面的代码中将此密钥复制为您的 $trelloKey
。
第 2 步下载这个 Show-OAuthWindow
function,它已被定制为与 Trello 一起使用。
$trellokey ='redacted'
$r = Show-OAuthWindow "https://trello.com/1/authorize?expiration=never&scope=read,write,account&response_type=token&name=Server%20Token&key=$trellokey"
$me = invoke-restmethod "https://api.trello.com/1/members/me/boards?key=$trellokey&token=$global:code"
当您 运行 此代码时,您将获得一个登录名 window。登录然后关闭表单。
登录并单击以授权此令牌,稍后我们需要在代码中使用它。
完成后,您将在控制台中看到它
>we retrieved a code, check within $code for the value
此函数 returns $global:code
的全局变量,其中包含您在请求任何信息时需要提供的授权令牌。例如,要查看有关您的用户帐户的信息,最后一行使用 /members/me
端点存储有关您的用户帐户的信息。以下是此请求的完成方式:
$endpoint = "https://api.trello.com/1/members/me/boards"
$auth = "?key=$trellokey&token=$global:code"
$request = $endpoint + $auth
Invoke-RESTMethod $request
您现在可以使用 any of the API endpoints listed in their catalog 随心所欲地使用 Trello。只需将端点替换为您想要的信息的 URL,然后就可以了。
这是与 Web 资源交互的一种受支持的标准方式,因此您的努力将得到充分利用。
如果您确实通过网页自动化实现了此功能,那么您将任由 Trello 摆布。如果他们更改了页面,您可能需要重写所有代码。
我有这个脚本可以成功登录网站并执行查询:
$credential = Get-Credential
$postParams = @{username=$credential.UserName;password=$credential.GetNetworkCredential().password}
Invoke-WebRequest -Uri http://www.nexusmods.com/newvegas/sessions/?Login -Method POST -Body $postParams -SessionVariable cookie
$query = Invoke-WebRequest -Uri http://www.nexusmods.com/newvegas/mods/searchresults/? -WebSession $cookie
我想做的是对另一个网站 Trello 做类似的事情。这是脚本:
$credential = Get-Credential
$postParams = @{method='password';'factors[user]'=$credential.UserName;'factors[password]'=$credential.GetNetworkCredential().password}
Invoke-WebRequest -Uri https://trello.com/1/authentication -Method POST -Body $postParams -SessionVariable cookie
$result = Invoke-WebRequest -uri https://trello.com/ -WebSession $cookie
但是,result 变量显示的页面就像用户未登录一样,因此我假设会话未正确保存。我该如何解决这个问题?
根据站点处理登录的方式,您可能必须使用 Invoke-RestMethod。以下是如何通过 PowerShell 登录此站点的示例:
$u="username"
$p="password"
#1. Get page:
$page = Invoke-WebRequest "https://whosebug.com/users/login" -SessionVariable so
#2. Fill in login form:
$form = $page.Forms["login-form"]
$form.Fields["email"] = $u
$form.Fields["password"] = $p
#3. Submit login form:
$page = Invoke-RestMethod "https://whosebug.com/users/login" -Body $form -Method $form.Method -WebSession $so
#4. Do something else...
如果您想在 Web 上使用远程服务,最简单的方法是使用他们的 API。所以这是走那条路的方法。
在此处注册 API 的第 1 步:https://trello.com/app-key
在下面的代码中将此密钥复制为您的 $trelloKey
。
第 2 步下载这个 Show-OAuthWindow
function,它已被定制为与 Trello 一起使用。
$trellokey ='redacted'
$r = Show-OAuthWindow "https://trello.com/1/authorize?expiration=never&scope=read,write,account&response_type=token&name=Server%20Token&key=$trellokey"
$me = invoke-restmethod "https://api.trello.com/1/members/me/boards?key=$trellokey&token=$global:code"
当您 运行 此代码时,您将获得一个登录名 window。登录然后关闭表单。
登录并单击以授权此令牌,稍后我们需要在代码中使用它。
完成后,您将在控制台中看到它
>we retrieved a code, check within $code for the value
此函数 returns $global:code
的全局变量,其中包含您在请求任何信息时需要提供的授权令牌。例如,要查看有关您的用户帐户的信息,最后一行使用 /members/me
端点存储有关您的用户帐户的信息。以下是此请求的完成方式:
$endpoint = "https://api.trello.com/1/members/me/boards"
$auth = "?key=$trellokey&token=$global:code"
$request = $endpoint + $auth
Invoke-RESTMethod $request
您现在可以使用 any of the API endpoints listed in their catalog 随心所欲地使用 Trello。只需将端点替换为您想要的信息的 URL,然后就可以了。
这是与 Web 资源交互的一种受支持的标准方式,因此您的努力将得到充分利用。
如果您确实通过网页自动化实现了此功能,那么您将任由 Trello 摆布。如果他们更改了页面,您可能需要重写所有代码。