c20082005
Goto Top

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.

	$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

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

132895
132895 08.04.2017 um 09:40:02 Uhr
Goto Top
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
c20082005
c20082005 09.04.2017 um 10:07:01 Uhr
Goto Top
Danke für die Antwort.
Ich habe alles Mögliche ausprobiert, aber es nicht hinbekommen.
Ich möchte mich gerne auf einer entfernten Fritzbox auf dem Webinterface einloggen.

Die Hash-Variable habe ich schon mit allem Möglichen gefüllt - ohne Erfolg.
Wie muss ich die Hashvariable füllen, damit der Login klappt?

Gruß

Klaus


Mein Code sieht jetzt so aus:
$login_url = 'https://xxx.de'  
$loginSite = Invoke-WebRequest -Uri $login_url -SessionVariable sess
$loginHash = @{uiResp='Anmelden';uiUser='username';uiPass='passwort'}  
$site = Invoke-WebRequest -Uri $login_url -WebSession $sess -Method Post -Body $loginHash
if ($site.StatusCode -eq 200){
 $readings = Invoke-WebRequest -Uri $login_url"/nas/index.lua" -WebSession $sess  
 $readings.Content
}

Die Internetseite hat folgenden Code:

<form id="uiMainForm" method="post" action="/nas/index.lua">  
	<div id="login_form_elements" style="">  
		<div class="formular">  
			<p>
			Bitte melden Sie sich mit Ihrem Benutzernamen oder Ihrer E-Mail-Adresse und Ihrem Kennwort an.
			</p>
			<label for="uiViewUser">Benutzername</label>  
			<input type="text" id="uiViewUser" name="uiUser" tabindex="1" value="">  
			<br>
			<p id="uiUsernameError" class="form_input_note ErrorMsg hidden">Bitte geben Sie einen Benutzernamen an.</p>  
			<label for="uiPass">Kennwort</label>  
			<input type="password" tabindex="2" id="uiPass" name="uiPass">  
			<div id="uiLoginError" class="hidden">  
				<p class="error_text">Anmeldung fehlgeschlagen.</p>  
				<p class="error_text">  
					Haben Sie sich vielleicht vertippt oder fehlt Ihnen die Zugangsberechtigung für diesen Bereich?
				</p>
				<p id="uiWait" class="error_text"></p>  
			</div>
		</div>
		<div id="btn_form_foot">  
			<input type="hidden" name="response" id="uiResp" value="">  
			<input type="hidden" name="page" value="">  
			<input type="hidden" id="username" name="username" value="">  
			<button type="submit" tabindex="3" id="uiSubmitLogin">Anmelden</button>  
		</div>
	</div>
</form>
132895
132895 09.04.2017 aktualisiert um 10:29:03 Uhr
Goto Top
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
c20082005
c20082005 12.04.2017 aktualisiert um 07:13:24 Uhr
Goto Top
Hallo zusammen,

um es vorweg zu nehmen: Ich habe die Lösung!

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.
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?

Und nun zur Lösung:
Zufällig fand ich in diesem Forum diesen Link:
Powershell Internetexplorer steuern
Das Problem war eine fehlende Visual Studio Installation. Ich habe Visual Studio Express installiert und schon lässt sich die Interetseite auslesen.

Gruß

Klaus
132895
132895 12.04.2017 aktualisiert um 08:27:09 Uhr
Goto Top
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!!
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!
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?
c20082005
c20082005 12.04.2017 um 09:44:42 Uhr
Goto Top
Aber gerne.
Es handelt sich um die Fritzbox 7490 mit der aktuellen Firmware 6.83

Gruß

Klaus
132895
132895 12.04.2017 aktualisiert um 09:58:46 Uhr
Goto Top
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!
colinardo
Lösung colinardo 12.04.2017, aktualisiert am 13.04.2017 um 11:18:39 Uhr
Goto Top
Servus zusammen!
Zitat von @132895:
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!
Dem muss ich widersprechen, dies geht wenn man sich ein bißchen auf den AVM-Seiten umsieht face-wink

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 
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
c20082005
c20082005 12.04.2017 um 18:51:18 Uhr
Goto Top
Es funktioniert!
Aber "schnipp-di-klick" ist es bei weitem nicht.
Das hätte ich im Leben nicht hinbekommen!

Ich werde das als Basis für meine nächsten Programmierversuche nehmen.

Vielen, vielen Dank!

Gruß

Klaus
colinardo
colinardo 12.04.2017 aktualisiert um 19:24:58 Uhr
Goto Top
Zitat von @c20082005:
Aber "schnipp-di-klick" ist es bei weitem nicht.
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 face-wink
Vielen, vielen Dank!
Gerne, keine Ursache face-smile
c20082005
c20082005 13.04.2017 um 10:32:06 Uhr
Goto Top
Nein, das war nicht auf dich bezogen.
Ich wollte damit nur sagen: Ich hätte das nicht hinbekommen!

Gruß

Klaus