Armory + PHP - Teil 1: XML einlesen, Onlinestatus, einfache Ausgabe
Die Informationsvielfalt im Armory ist recht gigantisch und wird auch grafisch hochwertig präsentiert. Leider fehlt jegliche direkte Entwicklerschnittstelle und nicht jeder kann sich mit derart übertriebenen Darstellungen anfreunden. Der Vorteil im Armory liegt in seinem Datenhintergrund. Es generiert sich aus XML-Dateien, welche mit relativ wenig Mühe in PHP eingelesen werden können.
Der UserAgent und das Täuschungsmanöver
Blizzard rückt seine Daten nicht sofort heraus, sondern man muss die Scriptabfrage als Benutzeranfrage verschleiern um die XML-Datei im Hintergrund laden zu können. In PHP wird die ini-Funktion “user_agent” dafür verwendet und die Ausgabe nach UTF-8 formatiert.
# UserAgent setzen
$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6)
Gecko/20040206 Firefox/1.0.1";
ini_set('user_agent',$useragent);
header('Content-Type: text/html; charset=utf-8');
XML-Datei einlesen
Der nächste Schritt besteht darin, die Daten der XML-Datei erstmal als Variable in die PHP-Andwendung zu bekommen, bevor wir irgendwelche Algorithmen zur Auswertung starten können.
Innerhalb meiner Armory Klasse habe ich mich für eine Variante mit CURL entschieden. Dies setzt die libcurl voraus. Der Useragent wird auch hier bei der Anfrage übergeben. Ein einfacher Weg ist auch die XML-Datei mittels file_get_contents() in eine Stringvariable zu laden.
# URL vorbereiten
$URL
= "http://eu.wowarmory.com/character-sheet.xml?r=Echsenkessel&n=Ariliao";
# CURL initialisieren und XML-Datei laden
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, $URL);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$load = curl_exec($curl);
curl_close($curl);
Armory online oder offline?
Aufgrund der extrem starken Auslastungen kann es vorkommen, dass das Armory nicht erreichbar ist. Meist wird eine Standardnachricht angezeigt und man erhält keinen Einblick auf Daten.
Nach einiger Tüftelei kann die Länge des eingelesenen Strings (im Onlinefall die XML-Datei) dazu benutzt werden einen Status relativ zielsicher zu ermitteln. Die Übersicht eines Charakters ist bis zu 15.000 Zeichen lang und im Gegensatz zur Fehlermeldung wesentlich größer. Eine Überprüfung auf 5000 Zeichen Mindestlänge kann einige Probleme lösen. Wird keine Onlineabfrage durchgeführt, erhält man im Offlinefall nur wirre Datenausgaben bzw. Fehlermeldungen. Kein Benutzer des Scripts sieht so etwas gern.
# Laenge des eingelesenen Strings ermitteln
$sleng = strlen($load);
# Pruefen ob online / offline mittels Laenge
if($sleng >= 5000) {
# Armory online => Datenverarbeitung beginnen
}
else {
# Armory offline => Fehlermeldung anzeigen
}
XML-Daten nutzen => SimpleXML
PHP liefert die Möglichkeit XML-Dateien mit SimpleXML zu verarbeiten. Dabei wird der eingelesene String zu verwaltbaren XML-Elementen welche im Programmcode genutzt werden können.
# eingelesenen String zu SimpleXMLElement umformen
$xml = new SimpleXMLElement($load);
XML-Struktur und der Zugriff auf Felder und Attribute
Eine weitere Hürde für die Nutzung der Armorydaten ist die Struktur, welche im momentanen Programmcode vorliegt. Die Variable $xml enthält alle verfügbaren Charakterdaten und müssen nur noch verarbeitet werden. Eine größere Liste über die Objekte und die Form des XML-Objekts wird es in einem späteren Teil geben.
Für die momentane Ausgabe, soll nur der Name und das Level eines Charakters per echo verkündet werden. Beides befindet sich unter $xml->characterInfo->character mit dem Attribut ‘name’ bzw. ‘level’.
# Namen und Level des eingelesenen Charakters ausgeben
echo $xml->characterInfo->character['name']." hat das
Level ".$xml->characterInfo->character['level'];
Probleme bei der Zuweisung in Variablen / Arrays
Die Variable $xml enthält Objekte und bei diesen kann es innerhalb von PHP zu Problemen kommen, wenn man sie einfach in neue Arrays sortieren möchte.
Ein kleiner und sicher nicht sehr eleganter Workaround ist die Zuweisung als Ergänzung zum String im Array. Bei einer Neuzuweisung ist das Ergebnis dieser ‘Ergänzung’ gleich der normalen Zuweisung, da neue Arrayfelder immer Leer sind.
# Charakternamen in neues Array bringen: ' .= ' ist die Ergaenzung
$Char["Info"]["name"] .= $xml->characterInfo->character['name'];
Der gesamte Quellcode des Beispiels
# UserAgent setzen
$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6)
Gecko/20040206 Firefox/1.0.1";
ini_set('user_agent',$useragent);
header('Content-Type: text/html; charset=utf-8');
# URL vorbereiten
$URL
= "http://eu.wowarmory.com/character-sheet.xml?r=Echsenkessel&n=Ariliao";
# CURL initialisieren und XML-Datei laden
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, $URL);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$load = curl_exec($curl);
echo $load;
curl_close($curl);
# eingelesenen String zu SimpleXMLElement umformen
$xml = new SimpleXMLElement($load);
# Namen und Level des eingelesenen Charakters ausgeben
echo $xml->characterInfo->character['name']." hat das
Level ".$xml->characterInfo->character['level'];
Wird es noch mehr Entwicklerinfos zum Armory von dir geben?
Ja wird es. Ich plane eine Übersicht über die Datenstrukturen als Hilfe für mich wie für andere Entwickler zu veröffentlichen. Eventuell kann ich sogar Teile meiner Armory Klasse, welche auf wow.skyfighter.net zum Einsatz kommt zur Verfügung stellen.
Abgelegt in WoW/Programmierung | 19 Kommentare »








