【问题标题】:How can I make this PowerShell web request save the session properly?如何使此 PowerShell Web 请求正确保存会话?
【发布时间】:2016-11-18 21:36:55
【问题描述】:

我有这个脚本可以成功登录网站并执行查询:

$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

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

【问题讨论】:

  • 你想用 Trello 做什么?他们有一个 API,比尝试通过他们的网页登录要容易得多。如果你告诉我你想做什么,我可以提供帮助。
  • 我正在编写将使用 API 的 PowerShell 脚本,但它希望我不想将我的密钥或任何令牌硬编码到其中,也不想强迫任何使用该脚本的人拥有记住这样的事情。所以我的目标是使用 webrequests 登录网站并获取帐户的 API 密钥并生成令牌,这样使用 API 的脚本只需从 CLI 获得凭据。
  • 我使用他们的 API 编写了一个本地执行此操作的方法,如果有帮助请告诉我。

标签: powershell trello


【解决方案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...

【讨论】:

  • 在网站的表单上,当您按下“登录”时,它会发送带有 3 个参数的 HTTP 帖子,这些参数是我在发出帖子的 Invoke-WebRequest 中发送的。在我当前的版本之前,我按照您描述的方式进行操作,但我总是收到“无法 POST /login”错误,尽管登录页面使用 POST 表单。
【解决方案2】:

如果您想在网络上使用远程服务,最简单的方法是使用它们的 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"

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

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

完成后,您会在控制台中看到它

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

【讨论】:

  • 当窗口弹出代码时,powershell 等到我关闭它,然后我得到:我们检索了一个代码,检查 $code 中的值 invoke-restmethod :请求被中止:无法创建 SSL/TLS 安全通道。
猜你喜欢
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多