Feb
13

Twitter Timeline und Twitter Search-Api-Component

Sehr schöne Anwendung der Javascript Timeline Bibliothek zur Darstellung von CakePHP Nachrichten die auf Twitter erscheinen.

Eine Cake Componente für die Twitter Search API habe ich vorkurzem zusammengeschrieben.

//  Twitter Search API (Json)
//
    App::import('Core', array('HttpSocket'));
    /**
     * Twitter Search
     * Documentation can be found on:
     * http://apiwiki.twitter.com/
     * http://apiwiki.twitter.com/Search+API+Documentation
     */
    class TwitterSearchComponent extends Object {
        var $Http = null;
        var $apiUrl = 'http://search.twitter.com/search.json';
 
        function __construct() {
            $this->Http =& new HttpSocket();
        }
 
        function query($url = null, $rpp = 25)
        {
            if (!empty($url)) {
                $params = array(
                    'q'=>$url,
                    'rpp'=>$rpp
                    );
                $response = $this->Http->get($this->apiUrl, $params);
                if (function_exists('json_deconde')) {
                    return json_decode($response);
                } else if (App::import('Vendor', 'json', array('file'=>'JSON.php'))) {
                    $json = new Services_JSON();
                    return $json->decode($response);
                }
                return false;
            }
        }
    }
Feb
11

21tweets.com jetzt online

In den letzten zwei Tagen hab ich mit Hilfe der Twitter-Komponente und ein paar Cake Shell-Skripten die Seite 21tweets online gebracht. Die Idee dahinter war eine Möglichkeit zu bauen, mit der man via Twitter neue Gewohnheiten in 21 Tagen - daher 21tweets - erlernen kann.

Die Anwendung sammelt also Tweets auf Twitter ein, die an den Account @21T gehen und eine Gewohnheit mit einem Hashtag # markieren. Damit aber nicht jeder Tweet aufgenommen wird, muss zunächst die neue Gewohnheit bei 21tweets angemeldet werden. Ab dann kann gesammelt und angezeigt werden. Nur Tweets die an aufeinander folgenden Tagen getwittert werden, werden zur Statistik für die Gewohnheit gezählt. Falls man einen Tag auslässt, dann verfallen alle vorher gesammelten Tweets für die Zählung der 21-Tage-Statistik. Klar ?

Ein paar Problemchen und wie ich die umschifft habe, will ich hier kurz erklären:

  • Ich wollte kein Login und keine Anmeldung
  • Erkennung von neuen Anwendern durch die Prüfung, ob der Twitterati dem Account von 21tweets @21T folgt.
  • Ausschließen von Twitter-Bots mit Hilfe eines Validate-Links, wie es bei normalen Accounts gemacht wird.
  • Abfrage von direct-messages zur Erkennung der Gewohnheit, die in den nächsten 21 Tagen praktiziert werden soll. Einfach via #hashtag in der DirectMessage

Eines der Probleme war die Erkennung von neuen Twitterati, die dem Account folgen. Mittlerweile hatte aber Twitter zwei neue Funktionen, die ich in einem der letzten Posts schon beschrieben habe, bereitgestellt. Damit lassen sich die neuen Follower recht einfach ermitteln, indem man einfach einen array_diff() auf die beiden Listen anwendet.

Es laufen insgesamt drei Backgroundjobs, die über crontab angestossen werden und dafür verantwortlich sind:

  1. Die neuen Follower einzutragen und ebenfalls als Follower aufnehmen
  2. Neue Habits aus den Direct Messages zu filtern
  3. Neue Tweets aus den normalen Twitter-Meldungen zu filter, die an @21T gesendet werden und die praktizierte Gewohnheit mit einem Hashtag enthalten.

Jetzt fehlt eigentlich nur noch ein wenig Statistik und Auswertungen, damit das Ganze rund wird. Bis dahin

happy baking

Feb
09

Twitter API Neuigkeiten

Hängt jetzt zwar nicht direkt mit CakePHP zusammen, aber da ich im Augenblick gerade eine kleine Twitter-App schreibe, hab ich gerade festgestellt, dass die Twitter-API mittlerweile zwei Funktionen unterstützt, die unter dem Stichwort Social Graph Methods laufen. Dabei lassen sich damit die ids der Friends und der Follower abholen. Die Funktion ist in der Twitter-Componente bisher wohl nicht drin gewesen.

Ich hab die zwei Methoden einfach mal für die Komponente erstellt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        /* social graph methods */
        /**
         * Returns an array of numeric IDs for every user the specified user is following.
         *
         */
        function friendsids() {
            $url = "http://twitter.com/friends/ids.xml";
 
            return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
        }
        /**
         * Returns an array of numeric IDs for every user the specified user is followed by.
         *
         * @param string id optional.  The ID of follower from whom to get the followers.
         */
        function followerids($id = null) {
            if (is_null($id)) {
                $url = "http://twitter.com/followers/ids.xml";
            } else {
                $url = "http://twitter.com/followers/ids/{$id}.xml";
            }
 
            return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
        }

Viel Spass beim Twittern mit CakePHP

Feb
02

Twitter - Component oder Datasource

Für Twitter gibts in CakePHP bereits eine Komponente. Die Twitter-Komponente bietet einen Großteil der Twitter-API ab - allerdings könnte die Komponente auch einen Update vertragen, da sich die API von Twitter mittlerweile wieder geändert hat.

Wenn man aus dem Controller heraus mit einer API arbeiten will, dann sind Komponenten ja bereits recht hilfreich. Allerdings haben Komponenten den Nachteil, dass man aus Shell-Scripten, also Consolen-Anwendungen nur recht umständlich auf die Komponente zugreifen kann. Für ein Shell-Script muss nämlich eine Task erstellt werden, die wiederum mit der Komponenten kommuniziert.

Deshalb scheint es mir eindeutig praktischer, wenn ein Dienst wie Twitter, der ja über eine API verfügt, über eine Datasource angesprochen werden kann. Für CSV-Dateien habe ich mir eine erste DataSource geschrieben, die auf der Bakery auch zur Verfügung steht. Damit lassen sich CSV-Dateien aus Shell-Scripten recht einfach einlesen und weiterverarbeiten. Das wird vorallem dann nötig, wenn man CSV-Dateien immer wieder laden muss - oder wenn die CSV-Datei einen Umfang erreicht hat, der einen Timeout auslöst, wenn man es über einen Controller auf der Website versucht. Der Timeout ist zwar einstellbar, aber meist sind Obergrenzen von 30 Sekunden üblich, wenn der Provider die Einstellungen vornimmt.

Was ich also gerne hätte, wäre eine Implementierung der Twitter-API via DataSource. Da hat nicht schon jemand zufällig was gemacht?

Oben