当前位置: 首页 > 知识库问答 >
问题:

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

漆雕宏浚
2023-03-14

我有一个成功登录网站并执行查询的脚本:

$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变量会显示一个页面,就好像用户没有登录一样,所以我假设会话没有正确保存。我怎样才能解决这个问题?

共有2个答案

姜弘化
2023-03-14

根据站点处理登录的方式,您可能必须使用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...
姜鸿畴
2023-03-14

如果您想在web上使用远程服务,最简单的方法是使用它们的API。下面是如何走这条路线。

步骤1在这里注册API:https://trello.com/app-key

将此键复制为下面代码中的$trelloKey

步骤2下载此显示OAuthWindow功能,该功能已定制为与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/meendpoint存储有关用户帐户的信息。以下是如何完成此请求

$endpoint = "https://api.trello.com/1/members/me/boards"
$auth = "?key=$trellokey&token=$global:code"
$request = $endpoint + $auth
Invoke-RESTMethod $request

现在,您可以使用目录中列出的任何APIendpoint对Trello执行任何操作。只需将endpoint替换为所需信息的URL,就可以了。

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

如果你能在网页自动化方面做到这一点,你将任由Trello摆布。如果他们对页面进行了更改,您可能必须重写所有代码。

 类似资料:
  • 很抱歉,如果这是我忽略的非常简单的事情,但我正在尝试制作一个组件,它基本上只将某些react路由器路由限制为具有活动令牌的用户。 看起来(正如预期的那样)只有“console.log(result)”执行了挂起的promise,但在最终结果中,我试图将一些逻辑编码到从后端给出的响应中(true或false),然后这些逻辑应该发送到privaterout组件,以确定是否应该将用户发送回登录,等等。。

  • 我试图找到使用httr包通过R连接Appannie的API的方法(根本没有API连接的经验)。API要求包含来自appannie网站的请求标题引用:注册App Annie帐户并生成API密钥。将此密钥添加到您的请求标头中,如下所示: 授权:持有人“”引用 我写了这样的代码 命令http_status(getdata)显示我"客户端错误:(401)未经授权"有人能帮我吗,我做错了什么?

  • 问题内容: 我有一个复选框,可以切换某些行为,但是如果有人连续点击100次,我不想向服务器端发送100个请求。 到目前为止,这就是我所准备的(找到以下代码片段): 在我的文档准备功能中: 然后事件本身: 这是因为我将1500毫秒作为去抖动周期,所以如果您在1500毫秒内单击n次,它将仅向服务器发送最新状态。 但是,使用它会有副作用,现在我的其他事件的click事件被搞砸了。我在这里做错什么了吗?有

  • 我有一个spring cloud sleuth(Hoxton.SR3)的spring boot(2.2.5.RELEASE)项目。我想向控制器发送一个包含一个标头的请求,并将此标头设置为: 在控制器的跨度包中填充(即) 保存到MDC 我有一个自定义的 当返回从我的配置文件中读取的行李钥匙列表。 我还在应用程序中定义了。yml: 当我(通过邮递员)用带有“行李代理请求时间”和“值”(即) 问题 我需

  • 我正在尝试使用Google云存储JSON API使用http调用从一个bucket中检索文件。 我在GCE中的一个容器中卷曲,与存储桶在同一个项目中,服务号具有对存储桶的读取访问权限 以下是请求的模式: 根据API控制台,我不需要任何特别的东西,因为服务帐户提供应用程序默认凭据。然而,我一直有这样的想法: 我还尝试为项目创建一个API密钥,并将其附加到url()但是我仍然得到了相同的401错误。

  • 有一个非正式的百度百科APIhttp://baike.baidu.com/api/openapi/BaikeLemmaCardApi?appid=379020&bk_key=uzi 对该API发起请求时,有一定概率返回 errno: 2错误信息,该错误表示什么意思?如何避免返回该错误?