Guten Abend!
Ich hoffe das wird nicht als Werbung verstanden aber irgendwie muss ich mich ja auch erklären ;)
Es geht um folgendes...
Ich habe für die Community des Spiels "Battlefield Heroes" ein Script geschrieben, dass die Profilseite des Spielers bzw. dessen Heroes ausliest, daraus ein Array erstellt und das dann zurück gibt um die Daten anschließend in einer Datenbank zu speichern.
Der Sinn dahinter ist ein externes Meta-Game aus den Statistiken zu entwickeln (welches Team gewinnt öfter auf welcher Map usw...).
Da das Script dann doch auf eine ganze Menge Nutzer losgelassen wird, wollte ich euch vorher bitten mir zu sagen ob ich hier völligen Quark gemacht habe oder das so akzeptabel und vor allem auch "sicher" in welcher Form auch immer ist.
Es liegt mir wirklich sehr am Herzen. Der Code ist deutsch kommentiert, das sollte helfen.
Zum Testen der Funktion könnt ihr diese ID benutzen: 193336416
Bitte benutzt auch nur diese da sie mir offiziell zum testen freigegeben wurde. Danke!
Zum testen des "false"-Rückgabewertes reicht es der Funktion irgendwelche Buchstaben als Parameter zu geben.
Danke für das Überstehen der Vorgeschichte und jetzt die (lange) Funktion:
<?PHP
###################################################
# $target = BF:H hero-id
###################################################
function get_hero($target){
// neuen curl-Handler erzeugen $ch
$ch = curl_init();
// Verbindungs-"Parameter"
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, true);
curl_setopt($ch, CURLOPT_URL, "http://www.battlefieldheroes.com/heroes/".urlencode($target));
// Zeit bis zum timeout in Sekunden
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, '2');
// Minimale Geschwindigkeit
curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, '5000');
// Zeit nach der unter der minimalen Geschwindigkeit abgebrochen wird in Sekunden
curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, '4');
// User-Agent-String
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
// Daten als String senden, nicht ausgeben
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Daten als String an $content übergeben
$content = curl_exec($ch);
// curl-Handler schließen
curl_close($ch);
##############################################################
# Daten verarbeiten
##############################################################
// DOM-Object aus Daten machen
$doc = new DOMDocument();
@$doc->loadHTML($content);
// alle divs finden - '*' für alle Elemente
$divs = $doc->getElementsByTagName('div');
// Helden-Array erstellen
$heroes = array();
for($i = 0; $i < $divs->length; ++$i){
#############################################################
# Cache-Zeit ermittlen
#############################################################
// Cache Container finden
if($divs->item($i)->getAttribute('class') == 'cache-info'){
$bold = $divs->item($i)->getElementsByTagName('b');
// bold durchlaufen
for($a = 0; $a < $bold->length; ++$a){
if($a == 2){
$next_update = $bold->item($a)->nodeValue;
$next_update = eregi_replace('h', '', $next_update);
$next_update = eregi_replace('m', '', $next_update);
}
}
}
if($divs->item($i)->getAttribute('id') == 'heroprofile'){
############################################################
# Level, Klasse und Fraktion ermitteln
############################################################
// richtige Liste finden
$ul = $divs->item($i)->getElementsByTagName('ul');
for($b = 0; $b < $ul->length; ++$b){
if($ul->item($b)->getAttribute('class') == 'stats'){
// array erweitern
$heroes['profile'] = array();
// li-Elemente finden
$listitems = $ul->item($b)->getElementsByTagName('li');
for($a = 0; $a < $listitems->length; ++$a){
// Einträge aufarbeiten (key/value split)
$arraykey = explode(' ', $listitems->item($a)->getAttribute('class'));
$keyvalue = explode('-', $listitems->item($a)->getAttribute('class'));
// Einträge in Array speichern
$heroes['profile'][$arraykey[0]] = $keyvalue[1];
}
}
}
########################################################
# Namen ermitteln
########################################################
// h2 finden
$h2 = $divs->item($i)->getElementsByTagName('h2');
for($c = 0; $c == 0; ++$c){
// Eintrag in Array speichern
$heroes['profile']['name'] = $h2->item($c)->nodeValue;
}
########################################################
# Statistik ermitteln
########################################################
// Tabelle finden
$table = $divs->item($i)->getElementsByTagName('table');
for($d = 0; $d < $table->length; ++$d){
if($table->item($d)->getAttribute('class') == 'profileinfo'){
// array erweitern
$heroes['stats'] = array();
// Zeilen in Tabelle finden und durchlaufen
$tr = $table->item($d)->getElementsByTagName('tr');
for($e = 0; $e < $tr->length; ++$e){
// Überschrift finden (z.B. ELO, K/D-ratio, Accuracy....)
$th = $tr->item($e)->getElementsByTagName('th');
// Eintrag finden (z.B. ELO, K/D-ratio, Accuracy....)
$td = $tr->item($e)->getElementsByTagName('td');
// Einträge in Array speichern
$heroes['stats'][$th->item(0)->nodeValue] = $td->item(0)->nodeValue;
}
}
}
}
}
// Wenn Helden im Array Cache-Lifetime in das Array packen
if(count($heroes) != 0){
$heroes['lifetime'] = $next_update;
// und Array zurückgeben
return $heroes;
}else{
// sonst false
return false;
}
}
?>
Ich bin für jede Kritik dankbar solange sie mir weiter hilft.
Danke, Michael