如何使此PowerShell Web请求正确保存会话?

时间:2016-07-15 15:40:36

标签: powershell 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

但是,结果变量显示一个页面,好像用户没有登录一样,所以我假设会话没有正确保存。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您想在网络上使用远程服务,最简单的方法是使用他们的API。所以这就是如何走这条路。

第1步注册API: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"

运行此代码时,您将获得一个登录窗口。登录然后关闭表单。

enter image description here

登录并单击以授权此令牌,我们需要稍后在我们的代码中使用该令牌。

Your token might be longer, this token here was VERY short because of limited perms

完成后,您将在控制台中看到此内容

>we retrieved a code, check within $code for the value

此函数返回$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

enter image description here

现在,您可以使用any of the API endpoints listed in their catalog为Trello做任何您喜欢的事情。只需将端点替换为您想要的信息的URL,然后就可以了。

这是一种支持和标准的与网络资源交互的方式,因此您的努力将得到充分利用。

如果您将此工作与网页自动化相结合,那么您将受到Trello的支配。如果他们对页面进行了更改,则可能需要重写所有代码。

答案 1 :(得分:1)

根据网站处理登录的方式,您可能必须使用Invoke-RestMethod。以下是如何通过PowerShell登录此站点的示例:

$u="username" 
$p="password"

#1. Get page:
$page = Invoke-WebRequest "https://stackoverflow.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://stackoverflow.com/users/login" -Body $form -Method $form.Method -WebSession $so

#4. Do something else...