我有一个成功登录网站并执行查询的脚本:
$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
但是,结果变量显示一个页面,好像用户没有登录一样,所以我假设会话没有正确保存。我该如何解决这个问题?
答案 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"
运行此代码时,您将获得一个登录窗口。登录然后关闭表单。
登录并单击以授权此令牌,我们需要稍后在我们的代码中使用该令牌。
完成后,您将在控制台中看到此内容
>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
现在,您可以使用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...