PHP API abfragen | Hitbox API

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

  • PHP API abfragen | Hitbox API

    Anzeige
    Hallo Leute,

    Von euch kennen sich ja wahrscheinlich einige mit PHP aus, deswegen wende ich mich an euch.
    Ich wollte einen Status Check machen, ob jemand streamt oder nicht.
    Dazu stellt Hitbox eine API zur Verfügung, jedoch habe noch nie mit einer API gearbeitet.

    Ich habe auch schon Google konsultiert und bin auf folgendes Ergebnis gestoßen, jedoch für Twitch.
    incendiarymedia.org/twitch/status.php


    So schwer ist der Script jetzt nicht zu verstehen, ihn auf Hitbox zu ändern jedoch schon.
    developers.hitbox.tv/start


    Ich würde gerne den Status des Streams abfragen, sowie das Profilbild und den Profilnamen anzeigen lassen.
    Mehr lässt die API derzeit nicht zu :D


    Das Bild soll linksbündig sein, rechts davon dann der Name und unter dem Namen der Status.
    Dazu soll dieses als Bild erzeugt werden, damit man dies problemlos in Foren einbinden kann.

    Könnte mir einer dazu Hilfe geben?
    Bitte nicht den fertigen Code posten, da ich mich mit dem Umgang von APIs etwas vertraut machen will und das bei einem fertigen Script schlecht geht ^^
  • Also wenn ich mir das so ansehe, dann ist für dich das User-Objekt interessant, richtig? Im Grunde ändert sich da gegenüber Twitch nicht viel - du rufst eine URL auf (welche das ist, steht da) und bekommst ein JSON-Objekt als Text zurück. Wie das aufgebaut ist, steht ebenfalls da, das musst du nur noch auswerten und fertig. Im Grunde genommen reicht es sogar, im Twitch-Script die Addresse der Seite (insb. ohne Client ID) und die Addressierung der Daten innerhalb des Arrays zu ändern.

    Das größte Problem dürfte die Referenzierung der Bilder sein. Die Bild-URLs, die man da bekommt, sind zwar relativ zu irgendetwas - nur nirgendwo ist dokumentiert, zu was. Wenn du mal von irgendeinem User das Profilbild öffnest, wirst du aber sehen, was du davor stellen musst.

    Die json_decode-Funktion dürfte das ganze irgendwie in so eine Baumstruktur von assoziativen Arrays verwursteln (im konkreten Fall nur von Tiefe 1), wie genau die funktioniert, weiß ich nicht auswendig, aber dafür gibt es ja die Dokumentation. :D

    Dazu soll dieses als Bild erzeugt werden, damit man dies problemlos in Foren einbinden kann.

    Also quasi für so eine dynamische Signatur? Kann man machen. Nötig ist dafür eigentlich nur folgendes:
    - Das eigentliche Bild per ImageMagick erzeugen. Würde ich aus Gründen der Serverbelastung allerdings zwischenspeichern und dann nur alle x Minuten mal aktualisieren.
    - Gezielt HTTP-Headerinformationen manipulieren, um dem Browser zu sagen, dass du ein PNG-Bild schickst...
    - ...und dann das Bild als PNG ausgeben.

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

  • Die API ist jetzt zwar weder besonders umfangreich noch umfangreich dokumentiert, allerdings herauszufinden, ob ein bestimmter User gerade streamt, ist jetzt auf den ersten Blick nicht so schwer umzusetzen.

    Dein Skript muss irgendwas mit api.hitbox.tv aufrufen und bekommt die Informationen als JSON, was du dann recht einfach mit der Funktion json_decode in was verwertbares umwandeln kannst - ähnlich wie bei Twitch. Jetzt musst du nur rausfinden, wie du mit dem Ding reden kannst. Kleiner Tipp - du benötigst den Bereich "Media" - und da ist ein kleines Beispielskript angegeben ;).

    Kurz gefasst:
    1. Im PHP-Skript api.hitbox.tv/media/live/channelname auslesen
    2. Decodieren mit json_decode - ich würd's zu nem Array umwandeln, also den assoc-Parameter auf true setzen.
    3. Mal das zurückgegebene Array genauer anschauen, z.B. mit var_dump. Der Pfad zum Profilbild ist auch angegeben, was du noch tun musst wurde bereits erwähnt.

    Falls du noch Probleme mit der API hast, hier ein kleines Beispiel (zur Veranschaulichung) - den Spaß mit der Bilderstellung überlass ich vorerst mal Dir, will Dir ja den Spaß nicht vermiesen. Wenn's da Probleme gibt sag bescheid

    Spoiler anzeigen

    PHP-Quellcode

    1. $channel = "testuser";
    2. $array = json_decode(file_get_contents("http://api.hitbox.tv/media/live/".$channel), true);
    3. echo ($array["livestream"][0]["media_is_live"] ? "Online" : "Offline")."<br>";
    4. echo "<img src='http://edge.vie.hitbox.tv/".$array["livestream"][0]["channel"]["user_logo"]."'>";
    5. print_r($array);
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte

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

  • Ich habe es jetzt geschafft die Daten abzufragen.

    PHP-Quellcode

    1. <?php
    2. $channelName = htmlspecialchars($_GET['channel'], ENT_QUOTES);
    3. $json_array = json_decode(file_get_contents('http://api.hitbox.tv/media/live/'.strtolower($channelName)), true);
    4. $getImage = $json_array['livestream'][0]['channel']['user_logo_small'];
    5. $getFollower = $json_array['livestream'][0]['channel']['followers'];
    6. $getViewer =$json_array['livestream'][0]['channel']['livestream_count'];
    7. if ($json_array['livestream'][0]['media_is_live'] == 1) {
    8. echo "<img src='http://edge.vie.hitbox.tv/$getImage' alt='user_logo' />";
    9. echo "$channelTitle is Online playing $currentGame";
    10. } else {
    11. echo "<img src='http://edge.vie.hitbox.tv/$getImage' alt='user_logo' />";
    12. echo "$channelName is Offline";
    13. }
    14. ?>
    Alles anzeigen



    War wirklich nicht so schwer wenn man sich den Twitch Code und eure Hilfe hat ^^
    5.45.101.236/status.php?channel=NAME

    Ein Bild generieren lassen ist für mich auch kein Problem, wohingegen das Anzeigen eines statischen Bildes in einem generierten Bild schon ein Problem ist.
    Kann mir einer sagen wie ein statisches Bild in einem generierten darstellen kann?
  • Anzeige
    Kann mir einer sagen wie ein statisches Bild in einem generierten darstellen kann?

    Meinst du den Avatar des jeweiligen Users in dem dynamisch generierten Bild? Im Grunde dürfte das nur so gehen:
    - Bild vom Quellserver runterladen (und zwischenspeichern)
    - Bild laden (Imagick::readImage)
    - Bild ins generierte Bild einsetzen (Imagick::compositeImage)
    - fertig.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von VikingGe ()

  • Vielen Dank für die Antwort.
    Werde ich sofort probieren.

    ~EDIT~

    Ich habe jetzt soweit alles fertig nur verstehe ich das mit dem Einsetzen des Bildes nicht.

    PHP-Quellcode

    1. <?php
    2. header ("Content-type: image/png");
    3. $channelName = htmlspecialchars($_GET['channel'], ENT_QUOTES);
    4. $fontfile = "arialbd.ttf";
    5. $json_array = json_decode(file_get_contents('http://api.hitbox.tv/media/live/'.strtolower($channelName)), true);
    6. $getImage = $json_array['livestream'][0]['channel']['user_logo_small'];
    7. $getFollower = $json_array['livestream'][0]['channel']['followers'];
    8. $getViewer =$json_array['livestream'][0]['channel']['livestream_count'];
    9. $imageURL = "http://edge.vie.hitbox.tv/$getImage";
    10. $image = "user/".$channelName.".png";
    11. file_put_contents($image, file_get_contents($imageURL));
    12. $loadImage = Imagick::readImage("user/".$channelName.".png");
    13. if ($json_array['livestream'][0]['media_is_live'] == 1) {
    14. $im = @ImageCreate (300, 64)
    15. or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
    16. $background_color = ImageColorAllocate ($im, 247, 247, 247);
    17. $text_color = ImageColorAllocate ($im, 71, 71, 71);
    18. $name_color = ImageColorAllocate ($im, 171, 213, 47);
    19. ImageTTFText ($im, 13, 0, 60, 20, $name_color, $fontfile, $channelName);
    20. ImageTTFText ($im, 10, 0, 60, 38, $text_color, $fontfile, "Online");
    21. ImageTTFText ($im, 10, 0, 110, 38, $text_color, $fontfile, "Viewer: $getViewer");
    22. ImageTTFText ($im, 10, 0, 60, 56, $text_color, $fontfile, "Follower: $getFollower");
    23. ImagePNG ($im);
    24. } else {
    25. $im = @ImageCreate (300, 64)
    26. or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
    27. $background_color = ImageColorAllocate ($im, 247, 247, 247);
    28. $text_color = ImageColorAllocate ($im, 71, 71, 71);
    29. $name_color = ImageColorAllocate ($im, 171, 213, 47);
    30. ImageTTFText ($im, 13, 0, 60, 20, $name_color, $fontfile, $channelName);
    31. ImageTTFText ($im, 10, 0, 60, 38, $text_color, $fontfile, "Offline");
    32. ImageTTFText ($im, 10, 0, 60, 56, $text_color, $fontfile, "Follower: $getFollower");
    33. ImagePNG ($im);
    34. }
    35. ?>
    Alles anzeigen


    php.net ist mit dem Beispiel einfach viel zu kompliziert xD

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Kazu ()

  • ~EDIT~

    Es lag daran dass das Profilbild als PNG gespeichert wurde, auf dem Server von Hitbox jedoch ein .jpg ist.

    Nun funktioniert der Script einwandfrei.
    5.45.101.236/hitboxstatus/status.php?channel=Kazuto

    Nun muss ich es nur noch irgendwie als Bild speichern können.
    Damit man es auch in Foren verwenden kann ^^

    PHP-Quellcode

    1. <?php
    2. header ("Content-type: image/png");
    3. $channelName = htmlspecialchars($_GET['channel'], ENT_QUOTES);
    4. $arialbd = "arialbd.ttf";
    5. $arial = "arial.ttf";
    6. $json_array = json_decode(file_get_contents('http://api.hitbox.tv/media/live/'.strtolower($channelName)), true);
    7. $getImage = $json_array['livestream'][0]['channel']['user_logo_small'];
    8. $getFollower = $json_array['livestream'][0]['channel']['followers'];
    9. $getViewer = $json_array['livestream'][0]['channel']['livestream_count'] -1;
    10. $getGame = $json_array['livestream'][0]['category_name'];
    11. $imageURL = "http://edge.vie.hitbox.tv/$getImage";
    12. if (!file_exists('user')) {
    13. mkdir('user', 0777, true);
    14. }
    15. if (!file_exists('status')) {
    16. mkdir('status', 0777, true);
    17. }
    18. $image = "user/".$channelName.".jpg";
    19. file_put_contents($image, file_get_contents($imageURL));
    20. if ($json_array['livestream'][0]['media_is_live'] == 1) {
    21. $im = @ImageCreate (300, 64)
    22. or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
    23. $background_color = ImageColorAllocate ($im, 247, 247, 247);
    24. $text_color = ImageColorAllocate ($im, 71, 71, 71);
    25. $name_color = ImageColorAllocate ($im, 72, 194, 52);
    26. $online_color = ImageColorAllocate ($im, 222, 46, 46);
    27. ImageTTFText ($im, 13, 0, 70, 21, $name_color, $arialbd, $channelName);
    28. ImageTTFText ($im, 9, 0, 70, 38, $online_color, $arialbd, "LIVE");
    29. ImageTTFText ($im, 9, 0, 98, 38, $text_color, $arial, "playing $getGame");
    30. ImageTTFText ($im, 9, 0, 185, 55, $text_color, $arial, "Viewer: $getViewer");
    31. ImageTTFText ($im, 9, 0, 70, 55, $text_color, $arial, "Follower: $getFollower");
    32. } else {
    33. $im = @ImageCreate (300, 64)
    34. or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
    35. $background_color = ImageColorAllocate ($im, 247, 247, 247);
    36. $text_color = ImageColorAllocate ($im, 71, 71, 71);
    37. $name_color = ImageColorAllocate ($im, 72, 194, 52);
    38. ImageTTFText ($im, 13, 0, 70, 21, $name_color, $arialbd, $channelName);
    39. ImageTTFText ($im, 9, 0, 70, 38, $text_color, $arial, "Offline");
    40. ImageTTFText ($im, 9, 0, 70, 55, $text_color, $arial, "Follower: $getFollower");
    41. }
    42. $profile = imagecreatefromjpeg("user/".$channelName.".jpg");
    43. imagecopymerge($im, $profile, 8, 8, 0, 0, 50, 50, 100);
    44. imagepng($im);
    45. imagedestroy($im)
    46. ?>
    Alles anzeigen

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