Artikelformat

Short Urls mit Goo.gl

Wenn man Dienste mit einer Zeichenbeschränkung nutzt und darüber Urls weitergeben möchte, ist man daran interessiert, dass diese Url-Informationen möglich kurz sind. Mit der Verbreitung von Twitter bspw. haben Dienste, die URLs verkürzen, einen riesigen Zulauf erfahren. Sehr beliebt ist seit jeher Bit.ly. Google bietet sein einiger Zeit ebenfalls einen solchen Dienst an. Dieser läuft unter einer grönländischen Domain und heißt goo.gl. Diesen Dienst kann man über eine API nutzen. Und dazu schreiben wir heute eine kleine POC-Klasse.

Wie viele Leser wissen nutze ich Twitter um über neue Artikel zu informieren. Aus Spaß an der Technik habe ich mir das Plugin angeschaut und festgestellt, dass verschiedene URL-Shortener unterstützt werden, goo.gl gehört aber nicht dazu. Wenn ich diesen also nutzen wollte, müsste ich selbst tätig werden. Und weil es ja um Spaß geht, habe ich ein kurzes Proof-of-Concept gebaut. Wenn man sich WordPress weiter anschaut, merkt man schnell, dass solche Services mehrfach implementiert sind und jedes Plugin seine eigene Art hat, eine URL zu verkürzen. Hier wäre eine einheitliche Bibliothek der nächste logische Schritt. Dazu aber später mehr.

1. Voraussetzungen:
Um die API von Goo.gl nutzen zu können benötigt man einen API-Key. Diesen kann man über die Google API Console erhalten. Das Limit für goo.gl Anfragen liegt aktuell bei 1.000.000 je Tag. Damit sollte man eigentlich klar kommen. In der API Console kann man auch weitere APIs freischalten.
Bei der Implementierung habe ich mich für einen POST-Request entschieden. Daher benötige man auch noch Unterstützung für curl in PHP. Alternativ kann man auch ein GET absetzen und würde das gleiche Ergebnis erhalten. In einer Implementierung, die in einer Bibliothek angeboten wird, könnte man beide Möglichkeiten implementieren um allen Benutzern gerecht zu werden.

2. Short URL:
Es gibt nun eine Klasse, die sich GoogleUrlShortener nennt. Hier hinterlegt man die Service-URL und erfordert im Konstruktor den API-Key. Der Code dazu ist nicht sonderlich kompliziert, ist aber vollständig im SVN zu diesem Beitrag enthalten.

Um eine URL nun zu verkürzen benötigt man eine Methode short, der man die URL als Parameter übergibt. Dies könnte bspw so aussehen:

1
2
3
4
5
6
7
8
9
public function short($longUrl) {
        $dataArray = array("key" => $this->apiKey, "longUrl" => $longUrl);
        $dataJson = json_encode($dataArray);
 
        $returnJson = $this->postData(GoogleUrlShortener::SERVICE_URL, $dataJson);
 
        $returnArray = json_decode($returnJson);
        return $returnArray->id;
    }

Es wird also zuerst ein assoziatives Array erstellt, das man anschließend in einen JSON-String umwandelt. Der noch unbekannten Methode postData übergibt man diesen String und die Service-URL. Zurück erhält man einen JSON-String, den man dekodiert und im id-Attribut des erhaltenen Objekts findet man die kurze URL. Wir gehen davon aus, dass alles gut geht und kein Fehler auftritt. Bei einem POC ist das erlaubt.

Die postData-Methode ist aber bisher noch unbekannt und diese muss natürlich auch implementiert werden. Diese wäre dann so:

1
2
3
4
5
6
7
8
9
10
private function postData($url, $data) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        $return = curl_exec($ch);
        curl_close($ch);
        return $return;
    }

Man baut sich zuerst ein curl-Handle, das auf die Service-URL verweist. Anschließend konfiguriert man die Verbindung noch. Man möchte Daten per POST senden, diese Daten sind in der Variable $data hinterlegt, curl_exec soll die Antwort auch zurückgeben und im Header senden wir noch, dass unsere Daten als JSON übermittelt werden. Das Ergebnis des abschließenden Aufrufs geben wir zurück. Die curl-Resource geben wir netterweise wieder frei.

Damit haben wir aus einer URL mit Hilfe einer Google-API eine „Short-URL“ gezaubert. Diese kann man in bspw in Twitter nutzen.

3. Long URL:
Hinter diesem Punkt verbirgt sich eine Lookup-Funktion, die Google bereitstellt. Wenn ich eine Short URL von goo.gl bekomme, kann man diese auch wieder auflösen und erhält das eigentliche Ziel. Dies ist bspw interessant, wenn man anhand der URL abschätzen will, wohin ein Kollege mich schicken möchte mit dem neusten Link. Ist dieser vielleicht „not safe for work„.

Also implementieren wir nun eine Methode long. Diese erhält eine Short-URL und nennt uns die Zieladresse. Bei dieser Implementierung machen wir es uns mal ganz leicht:

1
2
3
4
5
public function long($shortUrl) {
        $call = GoogleUrlShortener::SERVICE_URL . "?key=" . $this->apiKey . "&shortUrl=" . $shortUrl;
        $longObject = json_decode(file_get_contents($call));
        return $longObject->longUrl;
    }

Wir bauen uns eine URL zusammen, die aus der Service-URL und einem Query-String besteht. Dieser hat 2 Variablen, nämlich key für den ApiKey und shortUrl für die …. ShortUrl. Wenn man diese URL im Browser eingibt, bekommt man ein Ergebnis in JSON. Also müssen wir das Ergebnis dekodieren und den Aufruf erledigen wir durch ein einfaches file_get_contents. Aus dem so erhaltenen Objekt lesen wir das longUrl-Attribut aus.

4. Beispiel:
Der Aufruf sieht bspw. so aus:

1
2
3
4
5
6
7
8
9
10
$googl = new GoogleUrlShortener("<apikey>");
 
$url = "https://www.phpmonkeys.de";
echo "Url: " . $url . "\n";
 
$short = $googl->short($url);
echo "Short: " . $short . "\n";
 
$long = $googl->long($short);
echo "Long: " . $long . "\n";

Wir erzeugen eine neue Instanz unserer Klasse. Dann überlegen wir uns eine URL. Diese schreiben wir einfach mal raus, denn dann können wir diese mit der Long URL die Google später liefert vergleichen. Mit short erzeugen wir uns eine Short-URL und diese wandeln wir wieder in eine Long-URL um. In der Kommandozeile wird man folgende Ausgabe finden:

1
2
3
Url: https://www.phpmonkeys.de
Short: http://goo.gl/iMiYI
Long: https://www.phpmonkeys.de/

Und man sieht hier, dass Google die URL normalisiert.

Weitere Gedanken:
Eingangs erwähnte ich eine Bibliothek, die solche Dienste vereinheitlichen sollte. Hier habe ich Slinky gefunden. Hier ist Goo.gl natürlich nicht vertreten, aber ein Patch dürfte nicht zu kompliziert sein. Weiter wäre es super, wenn man diese Bibliothek in ein WordPress Plugin stecken würde, das die individuelle Konfiguration ermöglichen würde. Anschließend könnten andere Plugins dieses nutzen, um Short-Urls zu generieren. Vielleicht noch einen kleinen Cache dazu, damit man bereits verkürzte URLs nicht mehrfach erfragen muss … schon gut, genug geträumt.

Wenn jemand noch weitere Bibliotheken kennt, die den Zugriff auf diese Dienste vereinheitlichen, dann würde ich mich über einen entsprechenden Kommentar freuen. Voraussetzung ist nur, dass die Bibliothek in PHP geschrieben sein muss; was aber selbstverständlich sein sollte 😉

4 Kommentare

    • Stimmt, an die Frameworks habe ich gar nicht gedacht. Ich sehe da aber auch das Problem, dass man bei der Benutzung in einem System wie WordPress ungern das Framework einbauen möchte. Und die notwendigen Klassen zu extrahieren ist sicher auch kein Spaß. Anschauen werde ich es mir aber auf jeden Fall!

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.