Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/virtual/benny-baumann.de/blog/htdocs/wp-includes/post-template.php on line 316

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/virtual/benny-baumann.de/blog/htdocs/wp-includes/post-template.php on line 316

BenBE's humble thoughts Thoughts the world doesn't need yet …

20.11.2010

Türen öffnen

Filed under: Software — Schlagwörter: — BenBE @ 05:16:53

Böse Zungen behaupten ja immer, Twitter sei zu nix anderem gut, als der Welt mitzuteilen, welche Farbe der Output des eigenen Stoffwechsels besitzt. Nunja, das stimmt so nicht ganz. Neben der Färbung der Stoffwechselprodukte erfährt man noch zahlreiche Tipps, wie man die Produktion dieser verbessern, oder die Präsentation globaler gestalten kann, um auch jedem zu ermöglichen, die richtige Farbe für seine Stoffwechselendprodukte zu finden.

Was viele aber nicht wissen, ist, dass Twitter sogar noch mehr kann. Nein, keine Links zu niedlichem Katzencontent transportieren; das geht auch anders. Was ich meine ist: Türen öffnen!

Im konkreten Fall ging es um einen kleinen Hack, um mich in die Nutzung der Twitter-API einzuarbeiten. Als Grundlage hierzu habe ich die PEAR-Klassen von PHP verwendet, die bereits ein Interface zur Twitter-API bereitstellen, aber nunja: nicht die beste Dokumentation aufweisen. Von daher gibt es hier zwei kleine Projekte von mir, die die Nutzung der API recht einfach dokumentieren. Bevor ich aber zum Öffnen von Türen komme, präsentiere ich: Den OfflineTweeter!

Der OfflineTweeter entstand im Zuge meiner USA-Reise, um meine Follower auch ohne die Möglichkeit einer Internet-Verbindung über meinen ungefähren Aufenthaltsort und meine Tätigkeiten auf dem Laufenden zu halten. Hierzu wurden im Vorfeld eine Reihe von Nachrichten festgelegt, die später zu bestimmten Zeitpunkten automatisch gepostet wurden.

Um mit der Twitter-API zu arbeiten benötigt man neben einem Account bei Twitter einen API-Schlüssel. Diesen erhält man, indem man sein Projekt bei Twitter registriert. Zusätzlich benötigt man für OAuth noch einen Auth Token und das zugehörige Token Secret. Diese bekommt man für den eigenen Account direkt auf der Projekt-Seite seiner Twitter-App.

Hat man alle benötigten Daten beisammen, kann man diese in einer Datei zusammenfassen. Bei mir sieht diese Datei etwa wie folgt aus:

<?
 
// Offline Tweeter
// http://dev.twitter.com/apps/457571
 
$oa_access_token = "";
$oa_token_secret = "";
 
$twAPIKey = "";
 
$twConsumerKey = "";
$twConsumerSecret = "";
 
$twRequestTokenURL = "https://api.twitter.com/oauth/request_token";
$twAccessTokenURL = "https://api.twitter.com/oauth/access_token";
$twAuthorizeURL = "https://api.twitter.com/oauth/authorize";
 
?>

Wenn man diese Daten zusammengetragen hat, benötigt man als nächstes noch die Twitter-Bindings für PHP. Diese erhält man am einfachsten via PEAR:

pear upgrade
pear install -a -f Service_Twitter

Wichtig ist hierbei zudem, dass man zwingend die Klassen für OAuth benötigt, da die Twitter-API ansonsten nur für die unauthentifizierten Aufrufe verwendet werden kann. Ist die Installation abgeschlossen, kann es nun losgehen:

<?
 
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';
 
require_once 'twitter.OfflineTweeter.php'; //Load our authentication data
 
function myLog($message) {
    echo sprintf("[%s] %s\n", date('d.m.Y H:i:s'), $message);
}
 
// Offline Tweeter
 
try {
    //Connect to Twitter
    $twitter = new Services_Twitter();
    $oauth   = new HTTP_OAuth_Consumer(
        $twConsumerKey,                         // 'consumer_key',
        $twConsumerSecret,                      // 'consumer_secret',
        $oa_access_token,                       // 'auth_token',
        $oa_token_secret                        // 'token_secret'
        );
    $twitter->setOAuth($oauth);
 
    //Define our messages
    $times = array(
        mktime(00,00,00,12,25,2010,0) => 'Hello World!',
        );
 
    //Sort by time for convenience
    ksort($times);
 
    while(count($times)) {
        $k = array_keys($times);
        $k = $k[0];
        if(($k < time()) && (time() - $k < 120)) {
            myLog('Tweeting for: ' . date('d.m.Y H:i:s', $k) . ' at ' . date('d.m.Y H:i:s', time()) . ': ' . $times[$k]);
            $msg = $twitter->statuses->update($times[$k]);
            print_r($msg);
            unset($times[$k]);
        }
        sleep(1);
    }
} catch (Services_Twitter_Exception $e) {
    echo $e->getMessage()."\n";
}
 
?>

Die Funktionalität der Schleife ist nun recht einfach: Es wird die erste Nachricht aus dem Array gegriffen (daher das ksort, um nach dem Zeitpunkt zu sortieren) und wenn diese zu senden ist, wird sie versendet.

Okay, somit können wir der Welt schonmal mitteilen, wie unser Stoffwechsel arbeitet. Interessanter ist aber ein praktisches Real World-Beispiel, wie ich es selbst übrigens grad in San Francisco nutze.

Nächste App, wieder unsere Authentifizierungsdaten in eine Datei und los geht’s:

<?php
 
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';
 
require_once 'twitter.NBSesam.php';
 
// Noisebridge Sesam
 
try {
    $twitter = new Services_Twitter();
    $oauth   = new HTTP_OAuth_Consumer(
        $twConsumerKey,                         // 'consumer_key',
        $twConsumerSecret,                      // 'consumer_secret',
        $oa_access_token,                       // 'auth_token',
        $oa_token_secret                        // 'token_secret'
        );
    $twitter->setOAuth($oauth);
 
    // Read the current user's information
    $acc = $twitter->account->verify_credentials();
 
$last_dm_id = 0;
 
while (1) {
 
    // Rate limiting - IMPORTANT!
    sleep(15);
 
    // Read the recent direct messages
    $dm = $twitter->direct_messages();
 
    // Get the most recent direct message
    $dmrecent = $dm[0];
 
    //Limit the local load ...
    if($last_dm_id == $dmrecent->id) {
        continue;
    }
    $last_dm_id = $dmrecent->id;
 
    // Read sender and recipient of the most recent direct message
    $dms = $dmrecent->sender;
    $dmr = $dmrecent->recipient;
 
    // Okay, was it by us for us?
    if($dms->screen_name == $acc->screen_name && $dmr->screen_name == $acc->screen_name) {
        echo "Let's check the text!\n";
 
        //Display the text!
        echo $dmrecent->text."\n";
 
        //Display the id!
        echo $dmrecent->id."\n";
 
        //Was it our secret message?
        if("The magic text!" == $dmrecent->text) {
 
            $gate = file_get_contents($nbGateUrl);
 
            $dmtest = $twitter->direct_messages->new($acc->screen_name, 'Sesam will open now!');
            var_dump($dmtest);
 
            $twitter->direct_messages->destroy($dmrecent->id);
 
        }
 
    }
 
}    
 
} catch (Services_Twitter_Exception $e) {
    echo $e->getMessage()."\n";
}
 
?>

Und fertig sind wir. 36 LOC und unser Türöffner funktioniert. Nun ist die Sache, dass dieses Skript an sich recht unnütz ist, wenn man sowieso Internet-Zugriff hat, weil man dann auch einfach den Türöffner-Link selbst betätigen könnte. Nun ist es aber so, dass der Hackerspace in SF so gebaut ist, dass das WiFi meist nicht verbindet und das UMTS für Prepaid-Verträge eher ein Wunschtraum ist.

Twitter bietet nun aber an, dass man via SMS Tweets schreiben kann, bzw. anderweitig mit Twitter interagieren kann. Und genau hier setzt das Skript an: Da ich auf meinem Prepaid-Vertrag kostenlos SMS schreiben kann, sende ich an Twitter den magischen Text als Direktnachricht an mich selbst und warte etwa 5-30 Sekunden, bis der Türöffner – angestoßen durch meine App – mir die Tür öffnet.

Viel Spaß beim Arbeiten mit der API 😉

Flattr this!

Keine Kommentare »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress