2016-07-15 58 views
0

我有這樣的腳本,成功登錄到網站,並進行查詢:如何使此PowerShell Web請求正確保存會話?

$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

你想用Trello做什麼?他們有一個API,比試圖通過他們的網頁登錄要容易得多。如果你讓我知道你想做什麼,我可以幫忙。 – FoxDeploy

+0

我正在編寫使用API​​的PowerShell腳本,但它希望我不想將我的密鑰或任何令牌硬編碼到其中,也不希望強制任何使用該腳本的人必須記住這些事情。 所以我的目標是使用webrequests登錄到網站並獲取帳戶的API密鑰並生成一個令牌,以便使用API​​的腳本只需從CLI獲得憑據。 –

+0

我寫了一個方法來使用他們的API本地執行此操作,請告訴我這是否有幫助。 – FoxDeploy

回答

3

如果你想在網絡上的遠程服務工作,要做到這一點最簡單的方法是使用他們的API。所以這裏是如何去那條路線。

第1步註冊爲這裏的API:https://trello.com/app-key

複製按住此鍵爲您$trelloKey在下面的代碼。

第2步下載這個已經定製爲與Trello一起工作的Show-OAuthWindow function

$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的擺佈。如果他們對其頁面進行了更改,則可能需要重寫所有代碼。

0

根據網站處理登錄的方式,您可能必須使用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... 
+0

在網站的表單上,當您按下「登錄」時,它會發送HTTP帖子和我發送的Invoke-WebRequest發送的3個參數。 在我目前的版本之前,我按照您描述的方式進行了這種操作,但儘管登錄頁面使用POST表單,但我總是收到「無法POST /登錄」錯誤。 –