Ausgabe
Ich bin gerade dabei, mich anzumelden, aber ich bekomme im letzten Schritt von Facebook “Ihre Anfrage konnte nicht bearbeitet werden”.
# Setup
#[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$ProgressPreference = 'SilentlyContinue'
# Session
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
$session.Cookies.Add((New-Object System.Net.Cookie("datr", "value", "/", ".facebook.com"))) # Used to set Allow Cookies to Accepted, replace value with your own value form the datr cookie.
$url = 'https://facebook.com/'
# Creds and Form
$login = Invoke-WebRequest -Uri $url -WebSession $session
$form = $login.Forms[0]
$credential = Get-Credential # or Import-CliXml cred.xml
$form.Fields["email"] = $credential.GetNetworkCredential().username
$form.Fields["pass"] = $credential.GetNetworkCredential().password
# Request
$facebook = Invoke-WebRequest -Uri $url -WebSession $session -Method POST -Body $form.Fields
#$facebook.Content
Die Idee: Powershell-Skript ausführen, Creds angeben, es geht zu Facebook, meldet sich an und gibt in der Konsole aus, wie viele Fotos man insgesamt hat.
Lösung
Verwenden Sie Chromium-basierte Browser-DevTools, um den WebRequest-Code für Sie zu generieren
Der bei weitem einfachste Weg, dies zu tun, ist die Verwendung der Entwicklertools von Chrome (oder anderen chrombasierten Browsern). Die Tools generieren den gesamten Code, den Sie benötigen.
- Gehen Sie zur Facebook-Anmeldeseite
- Öffnen Sie die DevTools, indem Sie die Taste F12 drücken
- Öffnen Sie das Netzwerk-Panel
- Geben Sie Ihre Anmeldeinformationen ein
- Klicken Sie auf die Schaltfläche “Anmelden”.
- Suchen Sie die Post-Anforderung in der Liste (sollte ganz oben stehen, wenn Sie gerade DevTools geöffnet haben).
- Klicken Sie mit der rechten Maustaste auf die Anfrage und wählen Sie Kopieren > Als PowerShell kopieren.
- Fügen Sie den Code in eine Skriptdatei/VS Code/PowerShell ISE ein.
- Entfernen Sie “, br” aus
"accept-encoding"="gzip, deflate, br"
der Header-Hashtabelle oder die Antwort ist NICHT lesbar - Sie können die
$session
Variable dann in weiteren Anfragen
verwenden- Diese Anforderungen können auf die gleiche Weise wie die erste im DevTools-Netzwerkbereich generiert werden. Entfernen Sie einfach alle obersten
$session
Zeilen, damit Sie die ursprünglichen Sitzungscookies nicht überschreiben (und entfernen Sie das br-Komprimierungsformat erneut aus der Zeile zur Codierung akzeptieren).
- Diese Anforderungen können auf die gleiche Weise wie die erste im DevTools-Netzwerkbereich generiert werden. Entfernen Sie einfach alle obersten
Generierter Code sieht in etwa so aus
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33"
$session.Cookies.Add((New-Object System.Net.Cookie("fr", "0SmzDrtR5y3gEIe773d..BjT69C.eZ.AAA.0.0.BjHE333C.AWTZZ825DfGgk0", "/", ".facebook.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("sb", "Qk8dY1sdf23MH4kHnd1F225Ap2akhXf", "/", ".facebook.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("datr", "TEh3de4TYyf-7e2d36gFVo3wIpseiWg", "/", ".facebook.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("wd", "881x863", "/", ".facebook.com")))
Invoke-WebRequest -UseBasicParsing -Uri "https://www.facebook.com/login/?privacy_mutation_token=eyJ0eXBlIjowLCJjcDFmVhd43324Glvbl90aW1dfslIjoxNjYyODY1MjE4LCJ4WxsD4Ooc2453l0ZV9pZCIDFg36MszgxMjI5MDc5NTsTQ2fQ%3D%3D" `
-Method "POST" `
-WebSession $session `
-Headers @{
"authority"="www.facebook.com"
"method"="POST"
"path"="/login/?privacy_mutation_token=eyJ0eXBlIjowLCJjcDFmVhd43324Glvbl90aW1dfslIjoxNjYyODY1MjE4LCJ4WxsD4Ooc2453l0ZV9pZCIDFg36MszgxMjI5MDc5NTsTQ2fQ%3D%3D"
"scheme"="https"
"accept"="text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
"accept-encoding"="gzip, deflate, br"
"accept-language"="en-US,en;q=0.9"
"cache-control"="max-age=0"
"origin"="https://www.facebook.com"
"referer"="https://www.facebook.com/"
"sec-ch-ua"="`"Microsoft Edge`";v=`"105`", `" Not;A Brand`";v=`"99`", `"Chromium`";v=`"105`""
"sec-ch-ua-mobile"="?0"
"sec-ch-ua-platform"="`"Windows`""
"sec-fetch-dest"="document"
"sec-fetch-mode"="navigate"
"sec-fetch-site"="same-origin"
"sec-fetch-user"="?1"
"upgrade-insecure-requests"="1"
} `
-ContentType "application/x-www-form-urlencoded" `
-Body "jazoest=2923&lsd=AVoElEJYWu0&email=test%40gmail.com&login_source=comet_headerless_login&next=&encpass=%23PWD_BROWSER%3A5%3A16D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3EKNpw%3D%3D"
Nach einigem Ausprobieren scheint dies das absolute Minimum zu sein.
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
# Keep from above generated code
$session.Cookies.Add((New-Object System.Net.Cookie('datr', 'TEh3de4TYyf-7e2d36gFVo3wIpseiWg', '/', '.facebook.com')))
$body = [ordered]@{
lsd = 'AVoElEJYWu0' # Keep from above generated code
email = '[email protected]' # update
pass = 'mypassword123' # update
}
$params = @{
OutFile = 'c:\temp\facebook.html'
Uri = 'https://www.facebook.com/login'
Method = 'POST'
Headers = @{
'scheme' = 'https'
'accept' = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}
WebSession = $session
ContentType = 'application/x-www-form-urlencoded'
Body = $body
}
$response = Invoke-WebRequest @params -PassThru
Beantwortet von – Daniel
Antwort geprüft von – Terry (FixError Volunteer)