Problem Auslesen einer Internetseite mit Powershell
Hallo zusammen,
ich brauche eure Hilfe.
Ich habe ein Powershell-Skript erstellt, mit dem ich eine Internetseite auslese, nachdem ich mich eingeloggt habe.
Das klappt an Computer 1 auch wunderbest, jedoch an Computer 2 ist der String "$Seiteninhalt" leer, obwohl das Einloggen funktioniert und ich die Internetseite auch so sehe wie an Computer 1.
Windows 10 bei beiden, ich habe auch die Versionen von Powershell verglichen: alles gleich.
Liegt es an den Interneteinstellungen des Internet Explorers?
Gibt es vielleicht was Besseres, um den Inhalt auszulesen?
Weiß jemand, warum das nicht funktioniert?
Gruß
Klaus
ich brauche eure Hilfe.
Ich habe ein Powershell-Skript erstellt, mit dem ich eine Internetseite auslese, nachdem ich mich eingeloggt habe.
$ie = New-Object -com "InternetExplorer.Application"
$ie.Navigate("https://xxx.de")
$ie.visible = $true
do { sleep 30 }
while ( $ie.busy )
$ie.Document.getElementById("uiViewUser").value = "km"
$ie.Document.getElementByID("uiPass").value=$script:Passwd
$ie.Document.getElementById("uiSubmitLogin").Click();
do { sleep 30 }
while ( $ie.busy )
$Seiteninhalt=($ie.document.documentelement).innerText
Das klappt an Computer 1 auch wunderbest, jedoch an Computer 2 ist der String "$Seiteninhalt" leer, obwohl das Einloggen funktioniert und ich die Internetseite auch so sehe wie an Computer 1.
Windows 10 bei beiden, ich habe auch die Versionen von Powershell verglichen: alles gleich.
Liegt es an den Interneteinstellungen des Internet Explorers?
Gibt es vielleicht was Besseres, um den Inhalt auszulesen?
Weiß jemand, warum das nicht funktioniert?
Gruß
Klaus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 334532
Url: https://administrator.de/forum/problem-auslesen-einer-internetseite-mit-powershell-334532.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
11 Kommentare
Neuester Kommentar
Dafür gibt's Invoke-Webrequest
Powershell-Script, das sich auf Website anmeldet und dann eine andere speichert
Dann muss man sich mit den Plagen des IE rumschlagen.
Btw. gehört ein sleep z.B. mit einer Sekunde in die Schleife nicht davor.
Und Groß und Kleinschreibung der Eigenschaften des IE Objects sind teilweise zu berücksichtigen.
hauruck
Powershell-Script, das sich auf Website anmeldet und dann eine andere speichert
Dann muss man sich mit den Plagen des IE rumschlagen.
Btw. gehört ein sleep z.B. mit einer Sekunde in die Schleife nicht davor.
Und Groß und Kleinschreibung der Eigenschaften des IE Objects sind teilweise zu berücksichtigen.
hauruck
Damit kommst du bei der Fritte nicht weit, da hier ein LoginHash (SID) zum Login berechnet werden muss.
Benutze besser gleich TR-064, dann musst du deine Skripte nicht bei jeder neuen FritzOS Version neu schreiben!
Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen
Informationen aus dem Webinterface einer Fritz!Box via Shellscript auslesen
Benutze besser gleich TR-064, dann musst du deine Skripte nicht bei jeder neuen FritzOS Version neu schreiben!
Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen
Informationen aus dem Webinterface einer Fritz!Box via Shellscript auslesen
Zitat von @c20082005:
Aber nochmals kurz zu den anderen Vorschlägen:
TR-064 funktioniert nicht, weil die Fritzbox über das Internet angesprochen wird.
Das sollte man aus Prinzip sowieso nie machen das WebIF eines Routers nackt ins Internet stellen, bei der nächsten Sicherheitslücke sind die direkt verwundbar! Gerade zu eine Einladung für Skript-Kiddies. Immer per VPN schützen lautet die Devise!!Aber nochmals kurz zu den anderen Vorschlägen:
TR-064 funktioniert nicht, weil die Fritzbox über das Internet angesprochen wird.
Und das mit dem Invoke-WebRequest und vielleicht auch mit dem System.Net.WebClient:
Diese beiden Lösungen sind viel eleganter als die Möglichkeit, die einem der Internet Explorer bietet.
Deshlab bin ich sehr an diesen beiden interessiert.
Ja, aber beide abhängig welche Firmware drauf installiert ist, denn die WebInterfaces zeigen leichte Unterschiede zum Auslesen der SID und zum Login, deswegen ist für jede neue Firmware meist eine Anpassung nötig!Diese beiden Lösungen sind viel eleganter als die Möglichkeit, die einem der Internet Explorer bietet.
Deshlab bin ich sehr an diesen beiden interessiert.
Ich habe aber jetzt so lange rumprobiert, ich komme wirklich nicht weiter, somit möchte ich euch fragen:
Kann mir jemand ein konkretes Beispiel nennen, wie man sich an der Fritzbox über beide Methoden anmeldet und die Seite "dahinter" ausliest?
Wenn man die in Frage kommenden Firmware-Version erfahren dürfte?Kann mir jemand ein konkretes Beispiel nennen, wie man sich an der Fritzbox über beide Methoden anmeldet und die Seite "dahinter" ausliest?
Zitat von @c20082005:
Aber gerne.
Es handelt sich um die Fritzbox 7490 mit der aktuellen Firmware 6.83
Diese Variante geht mit den neuesten Versionen ab 6.5 leider nicht mehr da hier die Webseiten nicht mehr statischen Content zurückliefern sondern der Inhalt von der Box via Javascript dynamisch von der Seite nachgeladen wird deswegen ist das Auslesen der SID nicht mehr möglich, das Invoke-WebRequest kein Client-Side JavaScript ausführt!Aber gerne.
Es handelt sich um die Fritzbox 7490 mit der aktuellen Firmware 6.83
Servus zusammen!
Hier ein Beispiel wie das mit Powershell bei aktuellen Fritzbox-Firmwares geht: (habe hier leider nur eine Box mit 6.51 deswegen keine Gewähr für neuere Firmwares da sich wie @hauruck schon geschrieben hat jederzeit in der Firmware etwas ändern kann, deswegen würde ich dringend dazu raten! Das WebIF so direkt ins Internet zu hängen halt ich ebenfalls, gerade bei den Boxen für sehr sehr fahrlässig.)
Ich habe dir da einige Seiten schon mal zusammengestellt. Einfach die auskommentieren die du brauchst, Username,Passwort und URL der Fritzbox anpassen.
Die möglichen URLs lassen sich aus der Homepage der Fritzbox auslesen. Kann ich aber auch gerne übermitteln. Die Seiten und Parameter lassen sich aber auch per Browser-Developer-Tools (F12) auf dem Tab Netzwerk sehr leicht selbst ermitteln.
Grüße Uwe
Zitat von @132895:
Dem muss ich widersprechen, dies geht wenn man sich ein bißchen auf den AVM-Seiten umsieht Es handelt sich um die Fritzbox 7490 mit der aktuellen Firmware 6.83
Diese Variante geht mit den neuesten Versionen ab 6.5 leider nicht mehr da hier die Webseiten nicht mehr statischen Content zurückliefern sondern der Inhalt von der Box via Javascript dynamisch von der Seite nachgeladen wird deswegen ist das Auslesen der SID nicht mehr möglich, das Invoke-WebRequest kein Client-Side JavaScript ausführt!Hier ein Beispiel wie das mit Powershell bei aktuellen Fritzbox-Firmwares geht: (habe hier leider nur eine Box mit 6.51 deswegen keine Gewähr für neuere Firmwares da sich wie @hauruck schon geschrieben hat jederzeit in der Firmware etwas ändern kann, deswegen würde ich dringend dazu raten! Das WebIF so direkt ins Internet zu hängen halt ich ebenfalls, gerade bei den Boxen für sehr sehr fahrlässig.)
# Helperfunctions
function md5([string]$string){
[System.BitConverter]::ToString([System.Security.Cryptography.MD5]::Create().ComputeHash((new-object System.Text.UnicodeEncoding).GetBytes($string))).replace('-','').toLower()
}
function Get-SessionID([string]$url,[string]$user,[string]$pass){
$xml = irm -Uri "$url/login_sid.lua" -SessionVariable sess -ContentType "application/xml"
$sid = $xml.SessionInfo.SID
if ($sid -eq '0000000000000000'){
$challenge = $xml.SessionInfo.Challenge
# Response berechnen
$response = "$challenge-$((md5 "$challenge-$password").Substring(0,32))"
$xml = irm -Uri "$login_url/login_sid.lua" -WebSession $sess -Body @{response=$response;username=$user}
$sid = $xml.SessionInfo.SID
}
return $sid
}
function Get-PageData([string]$url,[string]$sid,[hashtable]$parameters = @{}){
$body = $parameters;$body.sid = $sid
$r = Invoke-WebRequest -Uri $url -Body $body -Method Get
return $r.Content
}
$fboxurl = 'http://fritz.box'
$username = ''
$password = 'GEHEIM'
# Login durchführen / SID holen
$sid = Get-SessionID -url $fboxurl -user $username -pass $password
# Übersicht
$data = Get-PageData "$fboxurl/data.lua" -sid $sid -parameters @{page='overview';type='all'} | ConvertFrom-Json
$data.data
# Internet > DSL-Informationen > Übersicht
# Get-PageData "$fboxurl/internet/dsl_overview.lua" -sid $sid -parameters @{useajax=1;action='get_data'} | ConvertFrom-Json
# Telefonbuch
# Get-PageData "$fboxurl/fon_num/fonbook_list.lua" -sid $sid
# Internet > Online-Monitor > Internet-Statistik "Tabelle"
#Get-PageData "$fboxurl/internet/inetstat_monitor.lua" -sid $sid -parameters @{useajax=1;action='get_table'}
# Internet > Online-Monitor > Internet-Statistik "Grafikdaten"
# Get-PageData "$fboxurl/internet/inetstat_monitor.lua" -sid $sid -parameters @{useajax=1;action='get_graphic'} | convertfrom-JSON
# Internet > Online-Monitor > Online-Zähler
# Get-PageData "$fboxurl/data.lua" -sid $sid -parameters @{page='netCnt'}
# Internet > Zugangsdaten > Internetzugang
# Get-PageData "$fboxurl/internet/internet_settings.lua" -sid $sid
# Internet > DSL-Informationen > DSL
# Get-PageData "$fboxurl/internet/dsl_stats_tab.lua" -sid $sid -parameters @{update='mainDiv'}
# Telefonie > Anrufe
# Get-PageData "$fboxurl/data.lua" -sid $sid -parameters @{page='dialLi'}
# Heimnetz > Heimnetzübersicht
# Get-PageData "$fboxurl/net/network.lua" -sid $sid
# System > Ereignisse
# $raw = Get-PageData "$fboxurl/system/syslog.lua" -sid $sid -parameters @{update='uiEventTable';event_filter=0}
# [regex]::Matches($raw,'(?is)datalabel="([^"]+)".*?<a target[^>]+>(.*?)</a>').Captures | select @{n="Datum";e={get-date $_.Groups[1].Value}},@{n="Message";e={$_.Groups[2].Value}} | ft -AutoSize
Die möglichen URLs lassen sich aus der Homepage der Fritzbox auslesen. Kann ich aber auch gerne übermitteln. Die Seiten und Parameter lassen sich aber auch per Browser-Developer-Tools (F12) auf dem Tab Netzwerk sehr leicht selbst ermitteln.
Grüße Uwe
Was meinst du damit??
Gefordert war das Auslesen der Seiten, und das tut es. Ich hab dir ja schon mal für ein paar Seiten die Daten nutzbar aufbereitet, natürlich nicht für alle, aber wenn du Hilfe bei anderen Seiten brauchst, melde dich einfach via PM, das Extrahieren der reinen Nutzdaten aus dem HTML-Code ist ja dann nur noch Makulatur
Gefordert war das Auslesen der Seiten, und das tut es. Ich hab dir ja schon mal für ein paar Seiten die Daten nutzbar aufbereitet, natürlich nicht für alle, aber wenn du Hilfe bei anderen Seiten brauchst, melde dich einfach via PM, das Extrahieren der reinen Nutzdaten aus dem HTML-Code ist ja dann nur noch Makulatur
Vielen, vielen Dank!
Gerne, keine Ursache