Hallo und willkommen zurück! Heute geht es um die Faceit API. Was kann man mit Ihr machen, wozu ist sie gut und vor allem, wie verwende ich sie korrekt? Das sind Fragen mit denen wir uns jetzt auseinandersetzen. Als Praxisbeispiel wird mir mein Projekt „dachcs.de“ herhalten müssen.

Was ist die Faceit API?

Ich müsste dazu erstmal erklären, was eine API ist. API steht für Application Programming Interface, welches im Endeffekt „nur“ eine Programmierschnittstelle ist. Die Faceit API ist eine Benutzerschnittstelle, sodass Entwickler auf bestimmte Bereiche und Daten von Faceit zugreifen können, um diese für eigene Projekte (Beispiel dachcs.de) wie Websites oder Software zu verwenden.  Ohne diese API könnte ich keine Nutzerinformationen zu Accounts auslesen. Solche APIs werden auch von großen Firmen und Projekten genutzt. Prominente Beispiele für solche APIs ist unter anderem die Paypal In­te­g­ra­ti­on in Shopsystemen, damit du bei Zalando auch mit Paypal bezahlen kannst oder Google, Facebook oder Twitter Logins auf Websites.

Korrekte Anwendung anhand eines Praxisbeispiels

app portal

Heute soll es aber um die Faceit API gehen und ich möchte euch nun zeigen wie man diese korrekt anwendet. Zuerst müssten wir uns im Developer Portal von Faceit anmelden. Wir erstellen eine App im App Studio. Wichtig sind die API Keys die unter „API KEYS“ abgespeichert sind. Das sind gewissermaßen unsere Passwörter um die API nutzen zu können. Dort gibt es zwei verschiedene. Client side und Server side Keys. Für unser Beispiel nutzen wir den Server sided key, welcher für server side Sprachen wie PHP, Python oder Ruby genutzt wird. Der Client side Key ist für Sprachen wie Javascript gedacht. Für unser Script nutzen wir PHP (cURL), JSON und eine Datenbank.

Ich zeige euch jetzt einfach mal den kompletten Quellcode und dann erkläre ich euch Schritt für Schritt alles okay? Ich müsste noch kurz darauf hinweisen, dass ich meinen API Key anonymisiert habe.

k1to-elo.php

<?php

    // database part (get faceit id)
    include("../../db-connection.php");

    $id = "70";
    $sql = "SELECT * FROM user_info WHERE id = $id";
    $dbResult = mysqli_query($link, $sql);

    while($output = mysqli_fetch_array($dbResult, MYSQLI_ASSOC)){
        $username = $output['username'];
        $faceitId = $output['faceitId'];
    }

    mysqli_free_result($dbResult);

    // Faceit API part
    if(!extension_loaded("curl")) {
        die("cURL extension not installed. Please install this extension!");
    }

    $url = "https://open.faceit.com/data/v4/players/".$faceitId;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: Bearer abcd1234-ab12-ab12-ab12-abcdefg1234567"));
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    $out = curl_exec($curl);
    curl_close($curl);
    $decoded = json_decode($out);
    $faceitLinkToSave = $decoded->{'nickname'};
    $faceitLevelToSave = $decoded->{'games'}->{'csgo'}->{'skill_level'};
    $faceitEloToSave = $decoded->{'games'}->{'csgo'}->{'faceit_elo'};
   
    // database part (insert infos)
    $sql = "UPDATE user_info SET faceitLink = '$faceitLinkToSave', faceitLevel = '$faceitLevelToSave', faceitElo = '$faceitEloToSave' WHERE id = $id";
    if ($link->query($sql) === TRUE) {
        $mailTo = "faceit@dachcs.de";
        $subject = "Update erfolgreich / k1to";
        $from = "From: API Autoupdate / Cronjob <dontreply@dachcs.de>\r\n";
        $from .= "Reply-To: dontreply@dachcs.de\r\n";
        $from .= "Content-Type: text/html\r\n";
        $msg = "<h2>Perfekt!</h2><br><p>Die Faceit Infos von " . $username . "wurden erfolgreich geupdatet!</p>";
        
        mail($mailTo, $subject, $msg, $from);
      } else {
        $mailTo = "faceit@dachcs.de";
        $subject = "Update fehlerhaft / k1to";
        $from = "From: API Autoupdate / Cronjob <dontreply@dachcs.de>\r\n";
        $from .= "Reply-To: dontreply@dachcs.de\r\n";
        $from .= "Content-Type: text/html\r\n";
        $msg = "<h2>Oops!</h2><br><p>Die Faceit Infos von " . $username . "wurden <strong>nicht</strong> erfolgreich geupdatet!</p><p>Errorcode: " . $link->error . "</p>";
        
        mail($mailTo, $subject, $msg, $from);
      }
      
?>

db-connection.php

<?php 
    $dbServer = "localhost";
    $dbUser = "root";
    $dbPassword = "";
    $dbName = "dachcs";

    $link = mysqli_connect($dbServer, $dbUser, $dbPassword, $dbName);

    if($link === false){
        die("Es konnte keine Verbindung zur Datenbank aufgebaut werden. " . mysqli_connect_error());
    }
?>

Teil 1 – Datenbankvorarbeit

// database part (get faceit id)
include("../../db-connection.php");

$id = "70";
$sql = "SELECT * FROM user_info WHERE id = $id";
$dbResult = mysqli_query($link, $sql);

while($output = mysqli_fetch_array($dbResult, MYSQLI_ASSOC)){
    $username = $output['username'];
    $faceitId = $output['faceitId'];
}

mysqli_free_result($dbResult);

Das sieht erstmal nach viel aus, ist es aber nicht. Ich habe am Anfang nur meine Datenbankverbindung in das Dokument eingebunden (db-connection.php). Danach starte ich nur eine kleine Abfrage aus der Datenbank und greife auf den Datensatz mit der ID 70 zu. Den Wert aus den Zellen username und faceitId speichere ich in den Variablen $username und $faceitId. Diese Werte brauche ich später noch für das Script.

Teil 2 – Faceit API

// Faceit API part
if(!extension_loaded("curl")) {
    die("cURL extension not installed. Please install this extension!");
}

$url = "https://open.faceit.com/data/v4/players/".$faceitId;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: Bearer abcd1234-ab12-ab12-ab12-abcdefg1234567"));
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
$out = curl_exec($curl);
curl_close($curl);
$decoded = json_decode($out);
$faceitLinkToSave = $decoded->{'nickname'};
$faceitLevelToSave = $decoded->{'games'}->{'csgo'}->{'skill_level'};
$faceitEloToSave = $decoded->{'games'}->{'csgo'}->{'faceit_elo'};

Am Anfang nutze ich nur eine kurze Bedinung, dass wenn die Erweiterung „cURL“ nicht installiert ist, dass dann der entsprechende Text ausgegeben wird. Ohne cURL funktioniert unser Script eben nicht. Kommen wir zum wichtigen Teil.

In der Dokumentation zur Faceit Data API bekommen wir sämtliche Informationen, die wir nun brauchen. Faceit gibt uns sogar das Werkzeug, mithilfe unseres Keys direkt die API im Browser auszuprobieren. Der Spieler k1to hat die FaceitID „158f23b1-1e62-43a8-a24a-a20821a6e756„. Probiere es gleich aus! Grundsätzlich werden die Daten im JSON Format genau so ausgeben.

{
  "avatar": "string",
  "country": "string",
  "cover_featured_image": "string",
  "cover_image": "string",
  "faceit_url": "string",
  "friends_ids": [
    "string"
  ],
  "games": {
    "additionalProp1": {
      "faceit_elo": 0,
      "game_player_id": "string",
      "game_player_name": "string",
      "game_profile_id": "string",
      "region": "string",
      "regions": {},
      "skill_level": 0,
      "skill_level_label": "string"
    },
    "additionalProp2": {
      "faceit_elo": 0,
      "game_player_id": "string",
      "game_player_name": "string",
      "game_profile_id": "string",
      "region": "string",
      "regions": {},
      "skill_level": 0,
      "skill_level_label": "string"
    },
    "additionalProp3": {
      "faceit_elo": 0,
      "game_player_id": "string",
      "game_player_name": "string",
      "game_profile_id": "string",
      "region": "string",
      "regions": {},
      "skill_level": 0,
      "skill_level_label": "string"
    }
  },
  "infractions": {},
  "membership_type": "string",
  "memberships": [
    "string"
  ],
  "new_steam_id": "string",
  "nickname": "string",
  "platforms": {
    "additionalProp1": "string",
    "additionalProp2": "string",
    "additionalProp3": "string"
  },
  "player_id": "string",
  "settings": {
    "language": "string"
  },
  "steam_id_64": "string",
  "steam_nickname": "string"
}

Die Request URL ist folgende: https://open.faceit.com/data/v4/players/158f23b1-1e62-43a8-a24a-a20821a6e756. Wir sehen also, dass die URL aus folgenden Teilen besteht: Faceit API URL + Faceit ID des Spielers. Deswegen speichere ich diese URL in die Variable $url ($url = „https://open.faceit.com/data/v4/players/“.$faceitId;).

Wir arbeiten jetzt nur noch 4 Schritte ab.

  1. cURL initialisieren
  2. Option(en) für einen cURL Transfer setzen
  3. cURL ausführen
  4. cURL schließen

Die Optionen setzen wir mit folgendem Code. Unseren Faceit API Key setzen wir bei „Authorization: Bearer abcd1234-ab12-ab12-ab12-abcdefg1234567.

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_HTTPHEADER, 
array("Authorization: Bearer abcd1234-ab12-ab12-ab12-abcdefg1234567")); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

Danach speichern wir unseren cURL Output in der Variable $out und wandeln den Output in das JSON Format mithilfe von „json_decode“ um und speichern dies wiederum in der Variable $decoded.

Anschließend greife ich auf den JSON Output zu und speichere die bestimmten Werte wiederum in Variablen. In diesem Beispiel greife ich auf folgendes zu: „nickname“ sowie „skill_level“ und „faceit_elo“ vom eingespeicherten CS:GO Spiel. Anhang des Codes kann man erkennen, dass ich auf mehrere Schichten zugreifen muss, um an das Level und die Elo zu kommen. Ich muss erst auf „games“ zugreifen, dann auf „csgo“ und dann kann ich die Werte von „skill_level“ und „faceit_elo“ ansteuern.

$decoded = json_decode($out);
$faceitLinkToSave = $decoded->{'nickname'};
$faceitLevelToSave = $decoded->{'games'}->{'csgo'}->{'skill_level'};
$faceitEloToSave = $decoded->{'games'}->{'csgo'}->{'faceit_elo'};

Teil 3 – Abspeichern und absichern

Im Grund passiert jetzt nichts mehr. Ich Update die Daten nur in der Datenbank und starte eine Abfrage. Wenn das Speichern erfolgreich war, schicke ich mir eine E-Mail und wenn es nicht erfolgreich war, schicke ich mir eben auch eine E-Mail. Nur der Inhalt der E-Mail unterscheidet sich.

// database part (insert infos)
$sql = "UPDATE user_info SET faceitLink = '$faceitLinkToSave', faceitLevel = '$faceitLevelToSave', faceitElo = '$faceitEloToSave' WHERE id = $id";
if ($link->query($sql) === TRUE) {
    $mailTo = "faceit@dachcs.de";
    $subject = "Update erfolgreich / k1to";
    $from = "From: API Autoupdate / Cronjob <dontreply@dachcs.de>\r\n";
    $from .= "Reply-To: dontreply@dachcs.de\r\n";
    $from .= "Content-Type: text/html\r\n";
    $msg = "<h2>Perfekt!</h2><br><p>Die Faceit Infos von " . $username . "wurden erfolgreich geupdatet!</p>";
    
    mail($mailTo, $subject, $msg, $from);
  } else {
    $mailTo = "faceit@dachcs.de";
    $subject = "Update fehlerhaft / k1to";
    $from = "From: API Autoupdate / Cronjob <dontreply@dachcs.de>\r\n";
    $from .= "Reply-To: dontreply@dachcs.de\r\n";
    $from .= "Content-Type: text/html\r\n";
    $msg = "<h2>Oops!</h2><br><p>Die Faceit Infos von " . $username . "wurden <strong>nicht</strong> erfolgreich geupdatet!</p><p>Errorcode: " . $link->error . "</p>";
    
    mail($mailTo, $subject, $msg, $from);
  }

Das war es auch schon! War doch einfacher als erwartet, oder? Bestehen noch weitere Fragen? Dann einfach in die Kommentare damit oder mich einfach auf Twitter oder Instagram anschreiben. Ich hoffe, ich konnte euch damit helfen und die Faceit API etwas mehr „unters Volk“ bringen.