Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Powershell - bestimmten Wert aus Webseite auslesen

Mitglied: c20082005

c20082005 (Level 1) - Jetzt verbinden

03.02.2019 um 10:43 Uhr, 276 Aufrufe, 9 Kommentare, 1 Danke

Hallo zusammen,

ich möchte aus der Webseite meines Raspberrys (Volumio läuft dort) einen bestimmten Wert auslesen.
Wenn ich die Webseite mit Chrome öffne und abspeichere, kann ich den Wert, der mich interessiert (der Wert "0:36" nach "ng-binding ng-scope"), finden und auslesen.

01.
<div class="bigText"><!-- ngIf: trackManager.playerService.state.trackType !== 'webradio' && trackManager.playerService.state.service !== 'analogin' --><span ng-if="trackManager.playerService.state.trackType !== 'webradio' &amp;&amp; trackManager.playerService.state.service !== 'analogin'" class="ng-binding ng-scope">0:36</span><!-- end ngIf: trackManager.playerService.state.trackType !== 'webradio' && trackManager.playerService.state.service !== 'analogin' --><!-- ngIf: trackManager.playerService.state.trackType === 'webradio' --></div>
Auslesen mit Powershell:
01.
$iwr=Invoke-WebRequest ("http://volumio/playback")
Lese ich die Seite mit Invoke Webrequest aus, habe ich das Problem, dass ich diese Information nicht finde.
Wo ist diese Zeichenfolge "versteckt"?

Gibt es in Powershell eine Möglichkeit, den Inhalt von Invoke Webrequest zu durchsuchen?
Kann ich ´z.B. nach "ng-binding ng-scope" suchen und Powershell gibt mir die Stelle zurück, in der der Suchstring steht?

Kann ich (wie Chrome) den kompletten Inhalt der Webseite abspeichern, so dass ich den Quellcode durchsuchen kann?

Ich würde mich über eine Lösung sehr freuen!

Gruß

Klaus
Mitglied: colinardo
03.02.2019, aktualisiert um 17:36 Uhr
Servus Klaus,
kein Problem, ohne jetzt den weiteren Inhalt zu kennen und ob die Seite dynamisch per JavaScript generiert wird( in den Fall geht das unten stehende nicht), select des ersten "SPAN" Elements mit Klassen "ng-binding ng-scope"

Variante über "AllElements"-Eigenschaft

01.
$req = iwr 'http://volumio/playback'
02.
$content = $req.AllElements | ?{$_.tagname -eq 'SPAN' -and $_.class -eq 'ng-binding ng-scope'} | select -First 1 -Expand InnerText
03.
$content
Es gibt noch weitere Varianten, z.B. über die Eigenschaft ParsedHtml mit der man ebenfalls die Elemente der Seite objektorientiert durchwandern kann.

Variante über "ParsedHtml"-Eigenschaft

01.
$req = iwr 'http://volumio/playback'
02.
$content = $req.ParsedHtml.getElementsByTagName('SPAN') | ?{$_.className  -eq 'ng-binding ng-scope'} | select -First 1 -Expand innerText
03.
$content
Oder auch mit Regex und der Eigenschaft content des WebRequest in der man den HTML Quellcode bekommt.

Variante Regular Expressions über die "Content"-Eigenschaft

01.
$req = iwr 'http://volumio/playback'
02.
$content = [regex]::match($req.Content,'(?is)(?<=<span.*?class="ng-binding ng-scope">)[^<]*').Value
03.
$content
Such dir was aus . Schema sollte ja jetzt durch die Beispiele klar sein.

Grüße Uwe
Bitte warten ..
Mitglied: c20082005
03.02.2019, aktualisiert um 18:04 Uhr
Hallo Uwe,

danke für Deine Antwort.
Leider bringen diese Befehle nicht das Gewünschte - es wird nichts gefunden.

Das, was da von Invoke-webrequest zurückkommt, ist ja gewaltig.
Da gibt es AllElements, Content, ParsedHtml uvm.
Hinter diesen gibt es dann wieder 1000 Informationen auszulesen.
Ich habe schon einiges durchgesehen - ohne Erfolg.

Gibt es eine Möglichkeit, das Invoke-Webrequest "komplett" abzuspeichern (und dann aus dem Wust das Gewünschte zu suchen)?

Wenn ich mit Chrome den Quellcode abspeichere, kann ich den String suchen und finden.
Gibt es eine Möglichkeit, den Quellcode automatisch in Powershell einzulesen und dann zu suchen?
Ich habe das schon so probiert:
01.
Invoke-WebRequest ("http://volumio/playback") -outfile "f:\text.txt"
Dann speichert er aber nur einen kleinen Teil ab (Größe: 3kB / Größe der HTML-Datei von Chrome: 24kB).

Gruß

Klaus
Bitte warten ..
Mitglied: colinardo
03.02.2019, aktualisiert 04.02.2019
Dann wird deine Seite dynamisch mit JavaScript aufgebaut. Wie oben geschrieben bringt dir der WebRequest mit Invoke-WebRequest in dem Fall nichts, weil hier kein JavaScript Interpreter arbeitet sondern nur statischer Content geladen wird.
Indem Fall musst du ein Objekt nehmen das das Clientside JavaScript auswertet. Das kannst du z.B. mit dem InternetExplorer.Application COM-Object machen. Such mal im Forum nach meinen Beiträgen dazu, dazu habe ich schon etliche Skripte hier gepostet.
Wie z.B. hier
https://administrator.de/forum/gmail-login-script-powershell-hat-problem ...
hier
https://administrator.de/forum/finaler-content-scriptgenerierter-webseit ...
und auch hier
https://administrator.de/forum/powershell-aufruf-html-verkn%C3%BCpfungen ...
usw.

01.
# Neuen IE-Prozess erzeugen
02.
$i = New-Object -Com InternetExplorer.Application
03.
# Fenster unsichtbar machen
04.
$i.Visible = $false
05.
# Webseite aufrufen
06.
$i.Navigate("http://volumio/playback")
07.
while($i.Busy){sleep .3}
08.
# Zusätzlichen sleep einbauen damit dynmaischer Content nachgeladen werden kann
09.
sleep 2
10.
# irgendein DOM-Object auslesen, im Beispiel den reinen Body als HTML ausgeben
11.
# $i.document.Body.innerHTML
12.
# oder nach Tags suchen und deren Inhalt ausgeben
13.
$i.document.getElementsByTagName('SPAN') | ?{$_.className -eq 'ng-binding ng-scope'} | %{$_.innerHTML}
14.
# Browser beenden
15.
$i.Quit()
16.
# COM ressourcen freigeben
17.
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($i) | out-null
Bitte warten ..
Mitglied: c20082005
10.02.2019 um 09:13 Uhr
Leider sagt Volumio "Nein" zum Internet Explorer ("You are using an outdated browser.").

Ich habe dann versucht, andere Browser per Kommandozeile dazu zu bringen, die Seite abzuspeichern.
Das ist ja ein mühsames Geschäft!
Unter Chrome habe ich es geschafft, die Seite im PDF-Format zu speichern

01.
chrome --headless --print-to-pdf="d:\Seite.pdf" http://volumio
Das bringt natürlich nichts, weil man das PDF nicht nach diesem String durchsuchen kann.

Chrome / Firefox oder Opera - all diese Browser habe ich mit Kommandozeile-Befehlen beschäftigt, aber es nicht hinbekommen, dass die diese Seite abspeichern (und ich dann die Datei mit Powershell durchsuchen kann).

Schade - ich gebe auf und bedanke mich trotzdem für Deine Mühe.

Gruß

Klaus
Bitte warten ..
Mitglied: colinardo
10.02.2019, aktualisiert um 09:56 Uhr
Leider sagt Volumio "Nein" zum Internet Explorer ("You are using an outdated browser.").
User Agents lassen sich auch per API faken.
Alternative zum IE ist die Browser API vom FF GeckoFX damit ginge das auch problemlos.
Das bringt natürlich nichts, weil man das PDF nicht nach diesem String durchsuchen kann.
Kannst du schon (iTextSharp), aber das wäre vollkommen ineffizient, also Finger weg.

ich gebe auf
Schade ist eigentlich ein Kinderspiel.

Gegen Aufwandsentschädigung teste ich dir das gerne an der Seite in einer VM.

p.s. Noch effizienter wäre es wenn man gleich ein Skript in die Seite einbaut (Plugin) welches die gewünschten Daten direkt irgendwo hin schreibt, da da im Hintergrund vermutlich PHP und JavaScript arbeiten wäre das auch nicht weiter schwer.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 10.02.2019, aktualisiert um 16:48 Uhr
Habe mit das Volumio-Projekt gerade mal angesehen.
Nutze einfach die REST API
https://volumio.github.io/docs/API/REST_API.html
Über die URL
<IPVOLUMIO>/api/v1/getstate
bekommst du mit der Eigenschaft Seek genau das was du möchtest, die aktuelle Playposition per JSON frei Haus geliefert

Volumio2 kommuniziert dagegen über WebSockets, damit lässt sich das ganze ebenfalls direkt abfragen:
https://github.com/volumio/Volumio2/wiki/WebSockets-API-Reference
Bitte warten ..
Mitglied: c20082005
11.02.2019 um 18:54 Uhr
Vielen Dank!

Jetzt habe ich es ja doch hinbekommen!
Der Verweis auf die REST API hat mich gerettet.

Ist ja auch genial, dass man Volumio damit steuern kann.
So lässt sich damit der Kasten in Pause versetzen:
01.
$Url="http://volumio/api/v1/commands/?cmd=pause"
02.
$iwr=Invoke-WebRequest ($Url)
Hier meinen Code für die Nachwelt

01.
Url="http://volumio/api/v1/getstate"
02.
$iwr=Invoke-WebRequest ($Url)
03.

04.
$Volumio_Suchbegriff='"seek":'
05.
$Volumio_Stelle_im_String=$iwr.Content.IndexOf($Volumio_Suchbegriff)
06.
# Bis zum Wert abschneiden
07.
$Volumio_TEMP=$iwr.Content.Substring($Stelle_im_String+$Volumio_Suchbegriff.Length)
08.
# Das Zeichen nach dem Wert finden
09.
$Volumio_Stelle_im_String=$Volumio_TEMP.IndexOf(',')
10.
# Wert zuweisen
11.
$script:Volumio_Playposition_aktuell=$Volumio_TEMP.Substring(0,$Volumio_Stelle_im_String)
Danke nochmals und Gruß

Klaus
Bitte warten ..
Mitglied: colinardo
LÖSUNG 11.02.2019, aktualisiert um 19:00 Uhr
Hier meinen Code für die Nachwelt
Das geht viel einfacher, schau dir mal Invoke-Restmethod an . Das erstellt aus dem zurückgelieferten JSON direkt ein Objekt.

Kanns jetzt nicht testen aber das sollte das ganze abkürzen
01.
(irm 'http://volumio/api/v1/getstate').seek
Ebenfalls für JSON-Strings nützlich ConvertFrom-JSON um JSON in ein Objekt zu wandeln.

Grüße Uwe
Bitte warten ..
Mitglied: c20082005
11.02.2019 um 19:11 Uhr
Spitze!
Danke!

01.
        $Url="http://volumio/api/v1/getstate"
02.
        $iwr=Invoke-WebRequest ($Url)
03.
        $script:Volumio_Playposition_aktuell=(Invoke-RestMethod $Url).seek
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

In einem Powershell Skript einen bestimmt User anmelden

Frage von Bommi1961Batch & Shell2 Kommentare

Hallo zusammen, ich muss ein PS Skript erstellen mit dem ich Installierte SW Automatisch und Silent Aktivieren kann. Ich ...

Batch & Shell

PowerShell Wert in Array finden

gelöst Frage von derhoeppiBatch & Shell7 Kommentare

Hallo, in meinem Projekt lese ich einen Eintrag aus einer Combobox aus. Dieser wird in eine Variable / Objekt ...

Batch & Shell

Powershell Wert der Property entfernen manipulieren

gelöst Frage von NintoxBatch & Shell9 Kommentare

Hallo zusammen, ich möchte einen bestimmten Key in der Registry ändern. Genauer gesagt, dass bei allen Volumes der Papierkorb ...

Batch & Shell

Powershell - CSV - kleinster Wert einer Gruppe

gelöst Frage von KraemerBatch & Shell4 Kommentare

Moin zusammen, ich habe da eine Problemstellung, die ich normalerweise simpel mit einer Schleife lösen würde. Da ich in ...

Neue Wissensbeiträge
Windows Server

Zähe Update-Installation auf Windows Server 2016

Information von kgborn vor 1 TagWindows Server4 Kommentare

Mir sind in der Vergangenheit immer wieder Beschwerden von Admins unter die Augen gekommen, die sich über die doch ...

Humor (lol)
Turnschuhe per Firmware lahmlegen
Information von Henere vor 1 TagHumor (lol)8 Kommentare

Und was kommt demnächst ? Bekomme ich kein Klopapier mehr, weil der Spender einem DDOS unterliegt ? :-) Ich ...

Sicherheit

Sicherheitsrisiko in WinRAR und Co. durch Schwachstelle in UNACEV2.DLL

Information von kgborn vor 1 TagSicherheit

In der seit 2005 nicht mehr aktualisierten Bibliothek UNACEV2.DLL gibt es eine Path-Traversal-Schwachstelle. Diese ermöglicht es, bei ACE-Archiven Dateien ...

Internet

CDU Propaganda: Urheberschutz im Internet - Ende des digitalen Wild-West

Information von Frank vor 2 TagenInternet6 Kommentare

Hallo Administratoren, aus einem Kommentar heraus habe ich folgenden Beiträge von Herr Sven Schulze und Axel Voss (beide CDU ...

Heiß diskutierte Inhalte
Windows Tools
Dateiname Automatisch auf PDF Klartext oder als Barcode abdrucken
Frage von spongebob24Windows Tools29 Kommentare

Hallo Zusammen, habe eine tolle Anforderung bekommen. Ich sollte auf mehrere PDF Dateien Automatisch einen Stempel anbringen lassen. Toll ...

Internet
SDSL oder ADSL - Preis-Leistungs-Verhältnis
Frage von ZeppelinInternet22 Kommentare

Wehrte Community, der Unterschied dieser beiden Techniken ist recht einfach erklärt. Das S, steht für Synchron (Gleich) und das ...

Microsoft Office
MicroSoft und seine Lizenzen
Frage von ZeppelinMicrosoft Office19 Kommentare

Wehrte Community, ich wende mich an die Community weil MicroSoft dazu keine Stellung nehmen möchte. Ich öffne mein Web-Browser ...

Batch & Shell
Batchdatei für das Erstellen eines Unterordner bei Vorhandensein eines bestimmten Ordnernamens
Frage von KarstenPaBatch & Shell14 Kommentare

Hallo zusammen , ich suche nach einer Möglichkeit, ein freigegebenes Laufwerk nach einem bestimmten Ordnernamen ("Schriftverkehr") zu durchsuchen, und ...