2016-07-15 20 views
0

Ich habe dieses Skript, das erfolgreich in eine Website anmeldet und führt eine Abfrage:Wie kann ich sicherstellen, dass diese PowerShell-Webanforderung die Sitzung ordnungsgemäß speichert?

$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 

Was ich versuche, eine ähnliche Sache zu tun mit einer anderen Website ist zu tun, Trello. Dies ist das Skript:

$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 

führen jedoch Variable zeigt eine Seite, als ob der Benutzer nicht angemeldet wurde, so dass ich nehme an, dass die Sitzung nicht ordnungsgemäß zu speichern. Wie kann ich das beheben?

+0

Was möchten Sie mit Trello machen? Sie haben eine API, die viel einfacher zu benutzen wäre, als zu versuchen, sich über ihre Webseite anzumelden.Wenn Sie mir eine Vorstellung davon geben, was Sie tun möchten, kann ich Ihnen helfen. – FoxDeploy

+0

Ich schreibe PowerShell-Skript, das die API verwenden wird, aber ich möchte meinen Schlüssel oder irgendwelche Tokens nicht fest codieren, noch möchte ich jemanden zwingen, das Skript zu verwenden, um sich solche Dinge merken zu müssen. Mein Ziel ist es, Webrequests zu verwenden, um sich auf der Website anzumelden und den API-Schlüssel des Kontos abzurufen und ein Token zu generieren, so dass das API-verwendende Skript nur Anmeldeinformationen von CLI erhalten muss. –

+0

Ich habe einen Ansatz dafür geschrieben, dies nativ mit ihrer API zu tun, lassen Sie mich wissen, ob das hilft. – FoxDeploy

Antwort

3

Wenn Sie mit Remote-Dienste auf dem Netz arbeiten wollen, ist der einfachste Weg, dies zu tun, ist durch ihre API. So, hier ist, wie man diese Route geht.

Schritt 1 Anmeldungen für den API hier: https://trello.com/app-key

Kopieren Sie diese Taste als $trelloKey im Code unten.

Schritt 2 Laden Sie dieses Show-OAuthWindow function herunter, das für die Arbeit mit Trello angepasst wurde.

$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" 

Wenn Sie diesen Code ausführen, erhalten Sie ein Anmeldefenster. Melde dich an und schließe das Formular.

enter image description here

Anmelden und und klicken Sie auf dieses Token zu genehmigen, die wir später in unserem Code verwenden müssen.

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

Wenn dies abgeschlossen ist, können Sie diese

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

Diese Funktion gibt eine globale Variable von $global:code in der Konsole angezeigt werden, die die Genehmigung enthält Token Sie, wenn Sie irgendwelche Informationen anfordern zur Verfügung stellen müssen . Um beispielsweise Informationen zu Ihrem Benutzerkonto anzuzeigen, werden in der letzten Zeile Informationen über Ihr Benutzerkonto unter Verwendung des Endpunkts /members/me gespeichert. Hier ist, wie diese Anforderung erfolgt:

$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

Sie jetzt any of the API endpoints listed in their catalog verwenden können, zu tun, was Sie mit Trello möchten. Ersetzen Sie einfach den Endpunkt durch die URL für die gewünschten Informationen, und schon kann es losgehen.

Dies ist eine unterstützte und standardisierte Art der Interaktion mit Web-Ressourcen, so dass Ihre Bemühungen gut ausgegeben werden.

Wenn Sie dies mit der Automatisierung von Webseiten arbeiten würden, wären Sie der Gnade von Trello ausgeliefert. Wenn sie Änderungen an ihrer Seite vorgenommen haben, müssen Sie möglicherweise den gesamten Code neu schreiben.

0

Je nachdem, wie die Site die Anmeldung verarbeitet, müssen Sie möglicherweise Invoke-RestMethod verwenden. Hier ist ein Beispiel dafür, wie Sie auf diese Seite über Powershell melden Sie sich an würde:

$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

Auf dem Formular der Website, wenn Sie auf "Anmelden" drücken, sendet es den HTTP-Post mit den 3 Parametern, die ich in meiner Invoke-WebRequest gesendet habe, die den Post macht. Vor meiner aktuellen Version habe ich es so gemacht, wie Sie es beschreiben, aber ich bekam immer einen "Can not POST/Login" -Fehler, trotz der Login-Seite mit einem POST-Formular. –