Kategorien
Allgemein Services Shared Hosting Wunschthema

Die Sache mit der Zählerei

Wer irgendetwas irgendwo postet, möchte meistens auch wissen ob das jemand liest, schliesslich hat er oder sie ja Zeit, Talent, Kreativität und viel Hirnschmalz in den Beitrag investiert, vielleicht sogar Geld.
Zählen ist aber gar nicht so einfach. Zunächst ist es ein grosser Unterscheid, ob etwas „aus Leidenschaft“ passiert oder ob ein „Budget“ benötigt wird. Der leidenschaftliche Poster freut sich vermutlich über Anerkennung, steht aber meist über der Erbsenzählerei von Zugriffszahlen. Es geht „um Wichtigeres“.
Alle anderen, nicht ganz so leidenschaftliche Menschen, werden aus unterschiedlichen Gründen durchaus mal nach Zugriffszahlen ihrer Beiträge gefragt. Und genau an diesem Punkt stellt man fest, dass es gar nicht so einfach ist, eine Antwort auf diese doch so einfache Frage zu geben.

Kategorien
Content Management Systeme Shared Hosting Webdesign Wunschthema

Ein selbstgehostetes Twitter Archiv mit WordPress

Wenn du in sozialen Netzwerken Nachrichten, Fotos und Videos postest, sammeln sich über die Jahre eine Menge Einträge an. Ohne gleich an die konkrete Datenapokalyse zu denken, wünscht man sich doch manchmal eine Art Backup oder ein Archiv seiner Daten. Wer mal die Suchfunktion von Twitter bemüht hat um eigene Tweets zu durchsuchen, kann ein Lied davon singen.

Konkreter Anlass für das nachdenken über Twitter Archiv war bei mir war die „Blockierung“ eines Twitter Users seitens Twitter, den ich für unser kleines Blog Projekt erstellt hatte und der wöchentlich eine Zusammenfassung der Blogeinträge postete. Grund der Sperrung war die Tatsache, dass der Geburtstag des Twitter Users nicht oder falsch ausgefüllt war. Im Ergebnis sind alle Tweets nun „weg“ (Die gesamte Geschichte findest du hier: ).

Zurück zum Archiv. Ich dachte mir, dass es doch möglich sein müsse, per Twitter API die Tweets des eigenen Users auszulesen und als Posts in einer WordPress Installation zu speichern. Die Tweets wären dann auch bei einer versehentlichen Sperrung noch lesbar und das Problem der Suche wäre obendrein ebenfalls gelöst.

Kategorien
Allgemein News Soziale Netze

Du Besucher, du!

In den letzten Wochen kam bei einem internen Chat die Frage auf, ob wir hier im Blog Sie, den Besucher, eigentlich mit Sie oder Du anreden wollen.
Die Frage hört sich einfach an, eine Antwort ist aber gar nicht so einfach. Beide Anredeformen haben ihre Vor- und Nachteile.
Nach ausgiebiger Diskussion haben wir uns entschlossen dich, lieber Besucher dieses Blogs, zu duzen!

Wir, das sind übrigens Michael und Hagen und diese beiden wunderbaren Fotos stammen aus unseren privaten Social Network Accounts .
Du siehst also – wir meinen es ernst 🙂 !

Michael Brunner
Michael Brunner

Hagen Graf
Hagen Graf

Übrigens Social Networks: Damit du (und jetzt Luft anhalten und lächeln) „noch besser“ verfolgen kannst, was wir hier bei NovaTrend und auch auch sonst so treiben, hier unsere Twitter Accounts! Und damit gleich klar ist, wo das hinführt: Wenn du uns folgst, werden wir dir auch folgen 🙂


tl;dr: Wir reden jetzt alle mit „Du“ an

Kategorien
seafolly.ch Soziale Netze

Die Twitter API – einfach Tweets auslesen und weiterverarbeiten

Unser Kunstprojekt seafolly.ch hat einen Twitter User und ich wollte die Tweeterei irgendwie teilautomatisieren. Dazu probierte ich IFTTT aus (Ein Automat für #kunstprojekt) und das Ergebnis war schon beeindruckend. Der Haken an Services wie IFTTT ist, dass „nur“ vordefinierte Funktionen zur Verfügung stehen. Und wenn mir die nicht ausreichen oder ich einen anderen Anwendungsfall habe, dann geht es eben nicht.

Aber wie könnte man das anders machen?

Twitter API

Twitter bietet eine Schnittstelle (API) an, auf die man mit unterschiedlichen Programmiersprachen zugreifen kann. Man kann Daten abfragen, auf dem eigenen Server verarbeiten und dann damit „machen, was ich will“.
Die Anzahl der Zugriffe auf die Twitter API ist beschränkt, reicht jedoch für unsere Anforderungen aus.

We divide the rate limit window into 15 minute chunks per endpoint, with most individual calls allowing for 15 requests in each window. In most cases, you can query the API on a per endpoint basis more than the v1 API, and other widely used calls have been increased to 180 requests per window.
Twitter API Dokumentation

Das Prinzip dahinter: Kleinere Zugriffsmengen sind kostenlos, grössere nicht.

Damit das kontrolliert werden kann, muss man sich mit seinem Twitter User entsprechend registrieren.

Früher war das alles mal einfacher, da konnte jeder öffentlich Anfragen an Twitter stellen und erhielt Daten zurück (wie sich twitter mit der twitter-api 1.1 einigelt).
Als freie Alternative zu Twitter gibt es beispielsweise pump.io (pump.io – die Basis für dezentrale soziale Netzwerke?).

Die Twitter-API liefert Ergebnisse in XML und JSON Format, ist also grundsätzlich von jeder Programmiersprache aus nutzbar. Meistens werden die Sprachen PHP, Python oder Ruby benutzt.

Ziel

Für den Anfang möchte ich die Tweets von @seafollych auf einer Website einbinden.
Als nächsten Schritt würde ich gern Tweets mit dem Hashtag #kunstprojekt retweeten.

Twitter Account einrichten und App registrieren

Einen Twitter Account habe ich bereits (@seafollych).
Auf der Website https://apps.twitter.com/ muss ich für mein Vorhaben eine Application anlegen. Name und Description (Beschreibung) sind frei wählbar, das Website Feld enthält die URL zum Ihrem Angebot. Ich arbeite auf unserem Testserver.

Twitter App erstellen
Twitter App erstellen

Die Callback URL kann in unserem Fall leer bleiben.
Sie müssen das „Developer Agreement“ bestätigen (und auch lesen) und können dann die Twitter Application erstellen.

Im nächsten Schritt müssen Sie sich Access Tokens erzeugen.

Twitter App Keys and Access Tokens
Twitter App Keys and Access Tokens

Die Keys (Schlüssel) und das Access Token (Zugriffscode) benötigen Sie für Ihre spätere Abfrage um sich gegenüber Twitter zu identifizieren.

Twitter API mit PHP abfragen

Ich nutze als Programmiersprache PHP und eine leere PHP Datei.

PHP-Datei erstellen

Legen Sie in einem Unterverzeichnis Ihrer Wahl eine Datei twitter.php mit folgendem Inhalt an.

<?php
echo "<h2>seafolly.ch Tweets</h2>";
?>

Wenn Sie die Datei in Ihrem Browser aufrufen (z.B. https://serverblogger.ch/seafolly/twitter.php) und den Text sehen, kann es weitergehen.

Twitter API für PHP

Sie benötigen eine passende PHP Bibliothek. Die wohl bekannteste ist die von J7mbo (https://github.com/J7mbo/twitter-api-php/).
Laden Sie sie herunter, packen Sie sie aus und kopieren Sie die Datei TwitterAPIExchange.php in das Verzeichnis, in dem auch Ihre twitter.php Datei liegt.

Das Programm

In Ihrer twitter.php Datei müssen Sie nun folgende Schritte in PHP codiert ausführen.

  1. Twitter API Bibliothek einbinden
  2. Twitter Access Token und Key angeben
  3. Art der Anfrage festlegen
  4. HTTP Methode festlegen
  5. Abfrage starten und die Rückgabe in einem Array speichern
  6. Array durchlaufen und die Tweets ausgeben

Hört sich doch gar nicht so kompliziert an.
In PHP-Code sieht das so aus:

1. Twitter API Bibliothek einbinden

Wenn die Datei im gleichen Verzeichnis liegt, läd die require_once() Funktion die gewünschte Datei.

require_once('TwitterAPIExchange.php');

Twitter Access Token und Key angeben

Die Variable $settings ist ein Array und es werden die vier Werte darin gespeichert

$settings = array(
  'oauth_access_token' => "IHR_WERT",
  'oauth_access_token_secret' => "IHR_WERT"
  'consumer_key' => "IHR_WERT",
  'consumer_secret' => "IHR_WERT"
);

Art der Anfrage festlegen

Man kann unterschiedliche Arten von Anfragen festlegen. In unserem Fall wollen wir die eigene Timeline auslesen. Dazu muss die entsprechende URL in einer Variable gespeichert werden. Zusätzlich speichere ich noch den gewünschten Usernamen in einer Variable um ihn später einfacher nutzen zu können.

$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$username= "seafollych";

HTTP Methode festlegen

Das HTTP Protokoll bietet unterschiedliche Methoden an, GET zum Lesen von Daten und POST zum posten von Daten.
Wir wollen lesen, also GET!

$requestMethod = "GET";

Abfrage starten und die Rückgabe in einem Array speichern

Die Variable $getfield enthält die Daten, die wir an die URL anhängen wollen, damit sie hinterher so aussieht:

https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=seaf…

Der angehängte Teil wird mit folgendem Befehl erzeugt:

$getfield = '?screen_name='.$username.'&count=5';

Für die Abfrage muss ein Objekt erstellt werden.
Wir übergeben dazu den Inhalt der Variable $settings an die TwitterAPIExchange Klasse und speichern das Ergebnis in der Variable $twitter.

$twitter = new TwitterAPIExchange($settings);

Um ein Ergebnis zu erhalten, müssen wir den Text für den URL Anhang, die URL und die Abfragemethode übergeben und dann die Abfrage starten.

$twitter->setGetfield($getfield)
        ->buildOauth($url, $requestMethod)
        ->performRequest()

Das Ergebnis ist ein JSON codierter Textstring, der für das menschliche Auge und PHP ein wenig unhandlich ist ;).
Daher bereiten wir ihn mit der Funktion json_decode() auf und speichern das Ergebnis in der Variablen $string.

$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

Ab hier könnte man sich das Ergebnis schon mal ausgeben lassen, der ganze Code sieht so aus:

<?php
require_once('TwitterAPIExchange.php');

$settings = array(
  'oauth_access_token' => "...",
  'oauth_access_token_secret' => "...",
  'consumer_key' => "...",
  'consumer_secret' => "..."
);

$username= "seafollych";
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name='.$username.'&count=5';
$twitter = new TwitterAPIExchange($settings);
$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

// Test ob ein Fehler vorliegt
if($string["errors"][0]["message"] != "") {
  echo "<h3>Problem</h3>
        <p>Twitter gibt die folgenden Fehlermeldung zurücke</p>
        <p><em>".$string[errors][0]["message"]."</em></p>";
  exit();
}

// Ausgabe
echo "<pre>";
print_r($string);
echo "</pre>";
?>

twitter.php

Die Ausgabe sieht etwa so aus:

Ergebnis der Abfrage
Ergebnis der Abfrage

Offensichtlich haben wir Daten erhalten und müssen diese nun noch formatieren.
Normalerweise macht man das in einer for each Schleife.
Im Antwort-Array hat jeder Tweet eine Nummer. Die Schleife geht Nummer für Nummer durch und speichert alle Daten zu einem Tweet in der Variable $items. Die einzelnen Werte werden dann aus der Variable $items extrahiert. Das Datum habe ich mit einer PHP Funktion umfomatiert date(‚H:i, d.m.Y‘, strtotime($items[‚created_at‘])); und den Text mit der PHP Funktion utf8_decode() bearbeitet, um eine richtige Darstellung der deutschen Umlaute zu erhalten. Der Rest sind HTML Tags. Sie können die Ausgabe beliebig komplex gestalten, meine Variante ist die Minimalversion.

echo "<ul>";
foreach($string as $items){
  echo '<li>';
  echo '<a href="https://twitter.com/';
  echo $items['user']['name'];
  echo '/status/';
  echo $items['id'];
  echo '"><small>';
  $fdate = date('H:i, d.m.Y', strtotime($items['created_at']));
  echo $fdate;
  echo '</small></a>: ';
  echo utf8_decode($items['text']);
  echo '</li>';
}
echo "</ul>";

Wenn Sie das Skript laufen lassen, erhalten Sie die folgende Ausgabe:

per PHP abgefragte Tweets
per PHP abgefragte Tweets

Hier nochmal der gesamte Quellcode:

<?php
require_once('TwitterAPIExchange.php');

$settings = array(
  'oauth_access_token' => "...",
  'oauth_access_token_secret' => "...",
  'consumer_key' => "...",
  'consumer_secret' => "..."
);

$username= "seafollych";
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name='.$username.'&count=5';
$twitter = new TwitterAPIExchange($settings);
$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

// Test ob ein Fehler vorliegt
if($string["errors"][0]["message"] != "") {
  echo "<h3>Problem</h3>
        <p>Twitter gibt die folgenden Fehlermeldung zurücke</p>
        <p><em>".$string[errors][0]["message"]."</em></p>";
  exit();
}

// Ausgabe
foreach($string as $items)
    {
        echo '<li>';
        echo '<a href="https://twitter.com/';
        echo $items['user']['name'];
        echo '/status/';
        echo $items['id'];
        echo '"><small>';
        $fdate = date('H:i, d.m.Y', strtotime($items['created_at']));
        echo $fdate;
        echo '</small></a>: ';
        echo utf8_decode($items['text']);
        echo '</li>';
    }
echo "</ul>";

?>

twitter.php

Wenn Sie bis hier gekommen sind, dann zunächst mal herzlichen Glückwunsch. Das war gar nicht schwer und der Erfolg ist doch ermutigend.

Im nächsten Schritt wollte ich die Twitter nach Tweets mit dem Hashtag #kunstprojekt suchen. Wenn ich einen entsprechenden Tweet finde, will ich ihn posten oder retweeten. Das ist grundsätzlich möglich, sprengt aber doch den Rahmen des Artikels hier.
Daher möchte ich an dieser Stelle erstmal aufhören und Ihnen noch ein paar Links zum weiterstöbern mit auf den Weg geben.

Links:


tl;dr: Tweets per API auslesen und verarbeiten ist nicht schwer

Kategorien
seafolly.ch

Ein Automat für #Kunstprojekt

Vor ein paar Wochen habe ich hier im Blog unser seafolly.ch Projekt angekündigt und wurde dann tatsächlich von mehreren Leuten darauf angesprochen. Bevor wir uns auf die Technik von seafolly.ch stürzen, einen Server aufsetzen und den Kunstmarkt revolutionieren, will ich die Zeit nutzen und mit den bereits existierenden Services experimentieren.

#kunstprojekt

seafolly.ch hat hat ausser dem Domainnamen bereits Benutzerkonten bei Twitter, Instagram, Pinterest und Facebook. Eine Idee, die ziemlich schnell entstand, war, diese Benutzerkonten automatisiert mit Informationen zu Kunstprojekten zu versehen. Wenn man sich für Kunstprojekte interessiert, dann sucht man vermutlich zunächst bei Google nach dem Begriff „Kunstprojekt“, dann bei Twitter, Instagram und Pinterest nach dem hashtag „#Kunstprojekt“ und vielleicht noch bei Facebook.

Eine grosse Herausforderung dabei ist die Sprache. Also suche ich nach dem deutschen Begriff „Kunstprojekt“ oder auf English nach „art project“ oder gar französisch nach „projét d’art“. In der Schweiz ist italienisch „progetto artistico“ wichtig und sehr schnell kommt man vom Hundertsten zum Tausendsten. Wenn wir etwas automatisieren wollen, muss es für alle Sprachen funktionieren.

Wie das oft so ist, habe ich beim Suchen auch nach „Kunscht“ gesucht und tatsächlich das Schweizer Projekt „Kunscht us dr Umgäbig“ gefunden. Von hier aus viel Erfolg, die Idee ist gut!

Da das Serverblogger-Blog auf Deutsch erscheint, habe ich beschlossen, zunächst den deutschen Begriff „Kunstprojekt“ zu verwenden.

Automaten

Um einen Prozess zu automatisieren, benötigt man einen Automaten. Der „beobachtet“ 24 Stunden pro Tag und 7 Tage die Woche und reagiert bei Bedarf. Bei einem Server handelt es sich um so einen Automaten. Der Apache Webserver macht nicht anderes als 24/7 zu lauschen, ob jemand eine Webseite ausgeliefert haben möchte. Er reagiert aud das Protokoll HTTP und wenn jemand etwas von ihm haben will, muss er das Protokoll einhalten.

Wenn Sie in Ihrem Browser http://seafolly.ch eingeben, schickt der Browser diese Befehle an die IP-Adresse und somit an den Server, der mit dem Domainnamen verbunden ist. Das sieht das so aus:

POST / HTTP/1.1
Host: seafolly.ch
Accept: */*
Content-Type: text/html
Content-Length: 0

Momentan erscheint folgende Antwort in HTTP

HTTP/1.1 200 OK
Date: Wed, 01 Jul 2015 10:53:06 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Mon, 06 May 2013 06:51:57 GMT
ETag: "3c0014-b1-4dc0723011d40"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug

Und als HTML dann das hier

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

Die Domain ist momentan mit einer Art Testserver verbunden, die genau diese eine Seite ausliefert.

Warum erzähle ich das?

Dienste wie Webserver gibt es schon sehr lange und das einfache Prinzip dahinter ist immer: Wenn dich jemand fragt (Client), dann antworte (Server). In unserem Fall muss ein Besucher expliziert eine Seite anfordern, die dann ohne Murren vom Webserver ausgeliefert wird.

Wenn ich für seafolly nun automatisiert auf Ereignisse wie die Erwähnung des Hasttags #kunstprojekt reagieren will, dann muss der Server in die Rolle des Clients schlüpfen und regelmässig bei allen relevanten Diensten nachfragen, ob etwas passiert ist. Wenn etwas passiert ist, dann tut er etwas, wenn nicht, dann eben nicht (if this, then that). Das Prinzip hört sich sehr einfach an, ist in der Realität aber gar nicht so einfach umsetzbar.

IFTTT

Da seafolly.ch noch keinen Root Server hat, schlage ich vor, wir machen ein paar Trockenübungen.

Der kostenlose Dienst IFTTT (http://ifttt.com) bietet genau das an, was wir benötigen. Wenn etwas passiert wird etwas ausgeführt. Alle 15 Minuten schaut IFTTT nach, ob etwas passiert ist.

Zum Hashtag #kunstprojekt gibt es tatsächlich mehr als 4000 Fotos auf Instagram.

#kunstprojekt

Unser erstes Ziel ist also:

Immer wenn jemand auf Instagram ein Foto postet, das den Hashtag #kunstprojekt enthält, dann soll ein Tweet mit Link zu diesem Foto gepostet werden.

Ich lege ein Benutzerkosto seafollych auf ifttt.com an und verbinde das Twitter und Instagram Konto mit dem Service.

Verbindung zu Twitter
Verbindung zu Twitter

Dann erstelle ich ein entsprechendes „Rezept“. Die Bedienung ist weitgehend selbsterklärend.
IFTTT Rezept
IFTTT Rezept

Als Text für den Tweet wähle ich

Ein #kunstprojekt {{Caption}} von {{Username}} {{Url}}

und nun schaut IFTTT etwa alle 15 Minuten nach, ob dieses Ereignis eingetreten ist.
Pro Hashtag müsste ein Rezept erstellt werden. Das Sprachenproblem wäre damit schon mal gelöst.

Bei der Twittersuche lässt sich auch so ein Rezept erstellen:

IFTTT Rezept
IFTTT Rezept

Die Ereignisse und Aktionen dieser Rezepte sind vordefiniert. Es gibt vermutlich Millionen von Kombinationen und es ist interessant die Möglichkeiten zu entdecken. Im Twitter Rezept ist es beispielsweise so, das man nicht so einfach einen Tweet mit einem Hashtag retweeten kann. Man kann nur die Variablen für Benutzername und Text neu tweeten. Bei mir sieht das so aus:

. {{UserName}}: {{Text}}

Als Test poste ich mal ein auf meinem Account ein Instagram Bild und es funktioniert tatsächlich :). IFTTT bemerkt das Foto und tweeted!

Allerdings muss ich noch etwas am Text ändern, sonst erscheint der Hashtag doppelt.
Prompt wurde auch das zweite Rezept ausgeführt, denn es gab ja nun einen Tweet mit dem Hashtag.

Auch hier muss der Text noch verbessert werden, denn der Benutzername erscheint ohne das führende @ Zeichen. Der Benutzer erhält dadurch keinen Hinweis, dass ich sein Posting erwähne.
Ausserdem sollte unser Tweet natürlich nicht geretweeted werden, weil wir sonst eine Endlosschleife erzeugen.

Ich ändere also den Instagram Rezepttext und nehme den statischen Hashtag wieder raus.

{{Caption}} von {{Username}} {{Url}}

Dem Twitter Rezepttext füge ich ein @ hinzu

. @{{UserName}}: {{Text}}

und dem Twitter Suchstring füge ich ein -seafollych hinzu, damit nur Tweets angesprochen werden, die nicht vom Benutzer seafollych stammen.

#kunstprojekt -seafollych

und mache einen weiteren Versuch.

Nun ist alles wie gewünscht. Das Instagram Foto wird getweetet, unser Tweet jedoch nicht

Falls Sie einen Instagram oder Twitter Account haben, nutzen Sie doch mal den Hashtag #kunstprojekt.
Sie landen dann auf der #kunstprojekt Liste 🙂

IFTTT Rezept
IFTTT Rezept

Mittlerweile erscheinen täglich ein paar #kunstprojekt Tweets auf @seafollych. Hier die Live Übersicht:

Links

http://ifttt.com

http://twitter.com/seafollych

Zusammenfassung

An den heutigen „Fingerübungen“ sehen Sie, dass es einfach möglich ist, automatisiert Ereignisse zu bemerken und darauf zu reagieren. Die Sache hat allerdings einen grossen Haken. Momentan sind wir abhängig von einem Service auf den wir keinen Einfluss haben und können die Ereignisse nicht selbst definieren.
Aber dazu später mehr, wenn wir unseren eigenen seafolly Server haben 🙂


tl;dr: Unser Kunstprojekt seafolly.ch macht erste Schritte mit Ereignissen und Aktionen in sozialen Medien.