如何使此 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 摆布。如果他们更改了页面,您可能需要重写所有代码。