Durch Javascript erstellte Elemente mit PHP auslesen

relasragent

Grünschnabel
Bin mir nicht mal sicher ob der Titel überhaupt Sinn macht aber hier zu meinem Problem:

Für das Spiel Minecraft gibt es ein Plugin welches eine Übersicht der Map auch im Browser zulässt, die sogenannte DynMap.
Wer sich das einmal angucken möchte: http://dynmap.minecraft.de/
Ich möchte einen bestimmten Teil auslesen, und zwar die Player, welche in der rechten Sidebar gelistet werden.
Wenn ich mir die Dynmap über $map = file('http://dynmap.minecraft.de/index.html'); in mein Script hole geht allerdings der Teil verloren, welchen ich brauche
view-source:http://dynmap.minecraft.de/ hier erkennt man, dass im sourcecode bei <div id="mcmap"></div> Schluss ist, die Spielernamen werden aber in diesem div-Container genannt.

Im Google Chrome Developer Tool finde ich unter
html>body>div#mcmap.dynmap>div.sidebar.pinned>div.panel>fieldset>ul.playlist
meine Daten

Zur Frage: Wie komme ich an diese Daten ran? (Mir reicht es wenn ich diese Passage als string oder Array vor mir liegen habe)
 
Via Console erkennt man, das die Spielerdaten dynamisch hergeleitet werden.

http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_=912

Ich konnte nicht ermitteln wofür die 912 stehen soll, jedoch erhaltet man in dieser URL die Userdaten.

Schau es dir hier an, welche Information du via erwähntem Link erhälts:
http://www.jsoneditoronline.org/?id=90d147302c333851d5693a1d9d493f97


Du musst nun, vorrausgesetzt der Betreiber der Seite erlaubt dir dies, via CURL die oben erwähnte Adresse aufrufen, json decoden und die Ausgabe je nach Bedarf erstellen.

Also so in etwa:
PHP:
<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_URL, 'http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_=912');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);   
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0');
    $data = curl_exec($ch);
    curl_close($ch);
   $data = json_decode($data);
   echo '<pre>Users:<hr>';
   foreach($data->players AS $k => $v){
       echo $v->account.'<hr>';
   }
   
   echo 'Daten die man erhält:';
   print_r($data);
?>
 
PHP:
<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_URL, 'http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_=912');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0');
    $data = curl_exec($ch);
    curl_close($ch);
   $data = json_decode($data);
   echo '<pre>Users:<hr>';
   foreach($data->players AS $k => $v){
       echo $v->account.'<hr>';
   }
  
   echo 'Daten die man erhält:';
   print_r($data);
?>
Es kommt hin und wieder vor, dass das Script probleme hat
zumindest wenn ich es auf einer anderen Dynmap versuche

Notice: Trying to get property of non-object in info.php on line 15 (Die foreach-Schleife)

Warning: Invalid argument supplied for foreach() in info.php on line 15 (s.o.)

Manchmal gehts und dann wieder nicht
 
Ja manchmal sind eben User online und manchmal nicht :) Eine if-Abfrage vor dem foreach würde das Problem beseitigen.
das Problem tritt durchgehend auf, unabhängig ob Spieler dabei sind

auf der Dynmap sehe ich wie 2-5 spieler lustig durch die Welt hüpfen und das script sagt es sind keine Spieler da
beim 17. reload gibt er dann die richtige spieleranzahl an
dann wieder keine

deshalb ist das ja so verwirrend für mich :D
 
Kann sein das die http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_=912 JSON Ausgabe gecached wird, so das die am Ende angehängte 912 ein Mechanismus gegen dem Cache ist.

Versuche mal:
PHP:
<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_URL, 'http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_='.rand(900, 999));
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0');
    $data = curl_exec($ch);
    curl_close($ch);
   $data = json_decode($data);
   echo '<pre>Users:<hr>';
   if($data->players){
   foreach($data->players AS $k => $v){
       echo $v->account.'<hr>';
   }
}
?>
 
Bei mir auf dem localhost funktioniert es reibungslos. Kannst du eventuell dein Code kurz umändern zu:

(Debugzweck)
PHP:
<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_URL, 'http://dynmap.minecraft.de/standalone/dynmap_hauptwelt.json?_='.rand(800, 999));
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);   
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0');
    $geted = curl_exec($ch);
    curl_close($ch);
   $data = json_decode($geted);
   echo '<pre>Users:<hr>';
   foreach($data->players AS $k => $v){
       echo $v->account.'<hr>';
   }
   
   echo 'Daten die man erhält:';
   print_r($data);
   
   echo $geted;
   echo phpinfo();
?>
 
Zurück