PHP Website auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHP Website auslesen

    Anzeige
    Hi!
    Zuerst einmal mein Problem:
    Ich handle ziemlich viel mit den Items von CS:GO, deswegen wollte ich mir ein Skript für mein Webspace/meine Website schreiben wo die Infos ausgelesen werden und angezeigt werden.
    Nach gefühlten 3 Jahren (~6 Std.) Google Arbeit und Bekanntenanrufe, bin ich soweit das ich ein Skript gefunden habe, aber das geht nicht.
    Das Script (mit meinen eingesetzten Daten):
    Spoiler anzeigen
    <?php
    // URL, die durchsucht werden soll
    $url = "http://steamcommunity.com/market/";

    // Zeichenfolge vor relevanten Einträgen
    $startstring = ">63,521</span>
    <br/>
    Ab:<br/>
    ";

    // bis zum nächsten html tag bzw. Zeichenfolge nach relevanten Einträgen
    $endstring = " </span>
    </div>

    <div class";

    $file = @fopen ($url,"r");

    if (trim($file) == "") {
    echo "Service out of order";
    } else {
    $i=0;
    while (!feof($file)) {

    // Wenn das File entsprechend groß ist, kann es unter Umständen
    // notwendig sein, die Zahl 2000 entsprechend zu erhöhen. Im Falle
    // eines Buffer-Overflows gibt PHP eine entsprechende Fehlermeldung aus.

    $zeile[$i] = fgets($file,2000);
    $i++;
    }
    fclose($file);
    }

    // Nun werden die Daten entsprechend gefiltert.

    for ($j=0;$j<$i;$j++) {
    if ($resa = strstr($zeile[$j],$startstring)) {
    $resb = str_replace($startstring, "", $resa);
    $endstueck = strstr($resb, $endstring);
    $resultat .= str_replace($endstueck,"",$resb);
    $resultat .= "; ";
    }
    }

    // Ausgabe der Daten

    $resultat = "KistenPreis: ".$resultat."€";
    return $resultat;
    ?>


    Das Skript so gibt es hier.
    Als Fehlermeldung kommt das eingebaute Service out of order, wenn er keine Daten findet.
    Jetzt an die die sich mit PHP auskennen:
    Wie kann ich das lösen? Ich hab absolut keine Idee mehr...
    Danke im Vorraus!
  • Wenn du deine eigenen Angebote auslesen willst kann ich dir dabei nicht helfen, dafür müsstest du dich über diesen Weg mit dem Skript einloggen, eine andere URL nehmen (... die mir als Nicht-Steam-User nicht bekannt ist, falls sie überhaupt existiert :P ) oder sehr viel mehr Daten abrufen, quasi den kompletten Communitystore spidern - nicht so ideal. Oder eben anders arbeiten, allerdings dafür kenne ich Steam halt nicht genug.

    Wenn du jetzt die öffentlichen Marktaktivitäten auslesen willst, also das, was ein außenstehender unter "Beliebte Einträge" oder "Neu" sieht - das ist relativ leicht umzusetzen, allerdings wirst du wohl nicht nur die Preise wollen, sondern auch den zugehörigen Itemnamen. Dementsprechend müsste dein Skript - übrigends hundsmiserabel geschrieben - etwas mehr draufhaben. Bevor ich Dir da nen Skript poste oder dich auf die Fehler in deinem aufmerksam mache (falls gewünscht) schreib bitte, was du nun willst.

    MfG
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von RealLiVe ()

  • Hab schnell mal was hingeschissen, auf XAMPP funktioniert's. Wirst es wohl aber nicht selber anpassen können.
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. function getPopularItems() {
    3. $MARKET_URL = "http://steamcommunity.com/market/";
    4. $DELIM_DROP = 'market_listing_table_showmore';
    5. $PRICE_PATTERN = '@Starting at(?:.*)$(.*)\</span\>@isU';
    6. $ITEM_PATTERN = '@\<span id\="result_(?:.*)_name" class\="market_listing_item_name" style\="(?:.*);"\>(.*)\</span\>@isU';
    7. $raw = "";
    8. $handle = @fopen($MARKET_URL, "r");
    9. if (!$handle) {
    10. trigger_error("FOPEN - Connection Error. ");
    11. return false;
    12. } else {
    13. while (!feof($handle)) {
    14. $zeile = fgets($handle);
    15. if (strpos($zeile, $DELIM_DROP)) {
    16. break;
    17. }
    18. $raw.=$zeile;
    19. }
    20. fclose($handle);
    21. }
    22. $result = preg_match_all($PRICE_PATTERN, $raw, $subpattern);
    23. if (!$result) {
    24. trigger_error("PRICE_PATTERN failure");
    25. return false;
    26. } else {
    27. $prices = array_map("htmlentities", array_map("trim", $subpattern[1]));
    28. }
    29. $result = preg_match_all($ITEM_PATTERN, $raw, $subpattern);
    30. if (!$result) {
    31. trigger_error("ITEM_PATTERN failure");
    32. return false;
    33. } elseif (count($subpattern[1]) != count($prices)) {
    34. trigger_error("ITEM_PATTERN and PRICE_PATTERN-Results does not match");
    35. return false;
    36. } else {
    37. $names = array_map("htmlentities", array_map("trim", $subpattern[1]));
    38. }
    39. return array_map(null, $names, $prices);
    40. }
    41. $Items = getPopularItems();
    42. if ($Items) {
    43. foreach ($Items as $item) {
    44. // Name
    45. echo $item[0];
    46. echo " - ";
    47. // Preis
    48. echo $item[1];
    49. echo "<br>";
    50. }
    51. }
    52. ?>
    Alles anzeigen
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte
  • Der Fehler sagt aus, dass fopen die Adresse nicht öffnen konnte - sicher, dass allow_url_fopen & Konsorten in der PHP-Konfiguration passen? Wo willst du das Skript draufhauen? War oben zwar ohnehin fehlerhaft, da hatte es das Pattern zerlegt, aber wenn du da Beschränkungen drinnen hast wird's so nicht klappen. (korrigierte Version, Ergebnis sieht soaus).
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von RealLiVe ()

  • Da ich das nun auch verstanden habe, kann ich sogar was beitragen:

    Die Steam Website ist der beschissenste Scheißhaufen aller beschissensten Scheißhaufen. Der digitale Krebs, namentlich JavaScript, ist dort ohne Ende vorhanden und ohne das geht auf der Seite gar nichts. Allerdings hat das bei simplen Abfragen den Vorteil, das man relativ fix Ergebnisse aus den JSON Antworten holen kann.

    Bei den Artikeln ist die GET URL wie folgt aufgebaut:
    steamcommunity.com/market/listings/<appid>/<name>/render/?query=&search_descriptions=0&start=0&count=<anzahl>

    Da du ja eh den günstigsten willst kannst du start auf 0 lassen.
    count reichen ein bis zwei, je nachdem, wie viele Preis du vergleichen willst. Das senkt auch die Chance, einen Server Error seitens Steam zu bekommen. (Die solltest du aber trotzdem einplanen, weil bei Steam jeder zwanzigste Request so endet.)
    Die appid und der name beziehen sich auf das Objekt im Markt. Die sind unabhängig vom Shop. Dota 2 hat beispielsweise die 570, CS:GO die 730. Beim Namen nicht vergessen, die Zeichen URL konform zu ersetzen.

    Folgendes sollte für die Namen im Market ausreichen:

    Quellcode

    1. " " -> "%20"
    2. "(" -> "%28"
    3. ")" -> "%29"
    4. "|" -> "%7C"
    5. ":" -> "%3A"
    6. "'" -> "%27"
    7. "\u2122" -> "%E2%84%A2" // TradeMark Zeichen - StatTrak
    (Wobei auch PHPs interne Funktionen dafür reichen sollten. Einfach mal ausprobieren!)

    Dann musst du einfach den Rückgabewert per json_decode parsen und dir das raussuchen, was du brauchst.
    Aus dem Kopf kann ich dir das jetzt aber nicht mehr sagen. Einmal print_r auf das JSON Array sollte dir da aber gute Dienste zur Erkennung leisten.

    Zum Abfragen nimmst du besser file_get_contents (sofern für URLs erlaubt) oder curl (sofern Erweiterung aktiviert). Sockets sind da dezent unnötig und versperren dir zu viel Einfachheit. Über curl lässt sich im Zweifelsfall nämlich auch einfacher POSTen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von DerET ()

  • Bevor hier jemand zumacht noch eine Ergänzung:
    Ich habe das Skript auf n paar Minuten hingeschrieben und dementsprechend nicht sonderlich groß dabei nachgedacht und dass diese Einstellungen per Default so gesetzt sind hat auch seinen Grund. Wenn du selber noch dran werkeln willst: Der von DerET beschriebene Weg ist deutlich besser als mein Vorschlag.

    MfG
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte