XML-Stats auslesen

ScoRpleX

Grünschnabel
Hi Leude,

ich habe folgendes Problem:
Ich habe eine Seite wo XML-Stats ausgegeben werden. Diese Seite erreiche ich unter
http;//IP:PORT/admin.cgi?mode=viewxml

So, in diesen Stats gibt es unter anderem eine Zeile <bla>XX</bla>, wobei XX eine Zahl ist.

Meine Frage: Wie stelle ich eine Verbindung zu dieser Datei her ( .htaccess geschützt ) und wie lese ich dann genau diese Zahl aus die zwischen <bla> und </bla> steht

Wäre nett wenn sich mal einer mein Problem zu HErzen nehmen kann und mir hilft :)

greetz ScoRpleX
 
Wenn das die Abfrage eine Shoutbox-Daemons sein soll, dann haette ich eine Loesung... Bzw. welche Infos brauchst du daraus?

Gruesse,
stanleyB
 
Nein,

es handelt sich hierbei um die Abfrage, wieviele User auf einen Radio-Stream geklickt haben.

Also die XML-Stats sehen ungefähr so aus:

<SERVERURL>http://www.shoutcast.com</SERVERURL>
<SERVERTITLE>N/A</SERVERTITLE>
<SONGTITLE />
<SONGURL />
<IRC>N/A</IRC>
<ICQ>N/A</ICQ>
<AIM>N/A</AIM>
<WEBHITS>35</WEBHITS>
<STREAMHITS>4</STREAMHITS>
<STREAMSTATUS>0</STREAMSTATUS>
<BITRATE>0</BITRATE>
<CONTENT>audio/mpeg</CONTENT>
<VERSION>1.9.2</VERSION>


Um diese Stats zu sehen, muss ich mich jedoch erst per .htaccess einloggen.
Danach möchte ich die Anzahl der STREAMHITS in eine Variable speichern.
 
Das geht auch ohne sich durch laestige Auths und XML Strukturen durchhangeln zu muessen.

PHP:
<?php

function get_listener($file,$port) { 
  $fp = @fsockopen ($file, $port, &$errno, &$errstr, 5); 
  if (!$fp) { 
          return 0; 
  } else { 
     fputs ($fp, "GET /7 HTTP/1.1\r\n"
                ."User-Agent:Mozilla\r\n\r\n");
     while (!feof($fp)) { 
      $stream .= fgets($fp,1024); 
     } 
     list(,$stream) = explode("<body>",$stream); 
     list($stream)  = explode("</body>",$stream); 
     $user = explode(",",$stream); 
     fclose($fp); 
  } 
  return $user[0];
}

/**
* get_listener("host", "port")
* gibt das was du willst zurueck
* auch ohne den laestigen 
* XML Output zu parsen.
*
**/

?>
 
Eine Alternative wäre es http://user:password@IP:PORT/admin.cgi?mode=viewxml zu öffnen und mit preg_match die hits rauszusuchen.
Ein Suchmuster könnte dafür in etwa so aussehen: /<STREAMHITS>(\d+)<\/STREAMHITS>/

Edit: stanleyB, funktioniert das auch mit einer .htaccess Passwordabfrage?
Und xml-output ist nicht schwer/lästig zu parsen, denn xml ist schön strikt und somit lässt es sich recht einfach mit RegEx durchsuchen.
 
Zuletzt bearbeitet:
Original geschrieben von SepteraCore
Eine Alternative wäre es http://user:password@IP:PORT/admin.cgi?mode=viewxml zu öffnen und mit preg_match die hits rauszusuchen.
Ein Suchmuster könnte dafür in etwa so aussehen: /<STREAMHITS>(\d+)<\/STREAMHITS>/

Edit: stanleyB, funktioniert das auch mit einer .htaccess Passwordabfrage?
Und xml-output ist nicht schwer/lästig zu parsen, denn xml ist schön strikt und somit lässt es sich recht einfach mit RegEx durchsuchen.

Ich hatte diese Problemstellung genau vor nem Jahr schon mal durchgespielt. Shoutcast gibt, wie ScoRpleX schon sagte, die temporaeren Informationen ueber den XML-Tree http://HOST:PORT/admin.cgi?mode=viewxml aus. Es gibt aber auch eine undokumentierte reduzierte Ausgabe ueber http://HOST:PORT/7 und genau zweiteres nutze ich bei meiner Loesung.
So faellt zum einen die traege .htaccess Authentifiierung weg - zum anderen braucht die Variante an den <body>-tags zu exploden erheblich weniger Zeit, als ein PCRE-Suchmuster darueber laufen zu lassen. Wie gesagt, viele Wege fuehren nach Rom, aber meiner ist der, der eindeutig die geringste Zeit verschleudert. :-)

EDIT: Ah - noch ein Vorteil meiner Variante ist, dass nicht die sensiblen Authentifizierungsdaten des Admins im Source stehen.

Gruesse,
stanleyB
 
Zuletzt bearbeitet:
Mmh, Stanley,

deine Idee sah zwar net schlecht aus, und geht auch soweit, nur ist auf der Seite, welche du mit HTTP://HOST:PORT/7 aufrufst, nicht die Zahl aufgelistet, welche ich suche :(

Ich suche die Streamhits, und soweit ich das sehe, werden nur diese Daten zurückgegeben:

<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>1</PEAKLISTENERS>
<MAXLISTENERS>75</MAXLISTENERS>
<REPORTEDLISTENERS>0</REPORTEDLISTENERS>
<AVERAGETIME>1</AVERAGETIME>


Zumindest steht auf der Seite 0,0,1,75,0,

Müssen wir dann doch die XML-Stats parsen oder gibts da dann noch eine Alternative
 
Oh, ich dachte <STREAMHITS> seien die <CURRENT LISTENERS>. Was sagt dann <STREAMHITS> aus, die Gesamtzahl der Hoerer, die je den Stream angeklickt hatten?
 
Hehe, also Streamhits ist die Anzahl alles User die seid dem Start des Servers auf den Stream connected haben. Und diese Zahl würde ich gern auslesen.
 
War auch keine grosse Action mehr:
Du kannst jetzt auch frei Schnauze waehlen welches Item vom XML-Tree du gerne zurueckgegeben haettest.

PHP:
<?php 

function get_radio_item($file, $port, $pass, $item) { 
  $fp = @fsockopen ($file, $port, &$errno, &$errstr, 5); 
  if (!$fp) { 
    return 0; 
  } else { 
      fputs($fp, "GET /admin.cgi?pass={$pass}&mode=viewxml HTTP/1.1\r\n"
                ."User-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
      while (!feof($fp)) { 
        $xml .= fgets($fp,1024); 
      }
      list(,$xml) = explode("<".strtoupper($item).">",$xml); 
      list($xml,) = explode("</".strtoupper($item).">",$xml); 
      fclose($fp); 
  } 
  return $xml; 
} 

echo get_radio_item("p0rnchild.de", "1337", "p0rnchild", "streamhits");

?>
 
Zuletzt bearbeitet:
Zurück