toscho.design

Twitter: Einen Tweet formatieren

Twitter bietet Feeds für fast alles an. Prima.
Ohne jegliches Markup. Auch prima.

Denn wenn wir Twitter per Webinterface erleiden, sehen wir schnell: Mit Umlauten in Hashtags kommt Twitter schlecht zurecht, ebenso mit URLs, denen kein Leerzeichen vorangeht. Und so richtig viele Protokollbezeichner kennt der Parser auch nicht.

Wollen wir also einen Twitterfeed per RSS einbinden, müssen wir die Links selbst erzeugen. Auf Twegolicious, wo ich nur meine eigene Timeline einbinde, entferne ich auch noch meinen Nutzernamen.

Der einzelne Tweet sieht im Quelltext so aus:

<item>
    <title>toscho: Informieren statt Sperren: http://toscho.de/p1609 #gebloggt</title>
    <description>toscho: Informieren statt Sperren: http://toscho.de/p1609 #gebloggt</description>
    <pubDate>Tue, 19 Jan 2010 21:44:21 +0000</pubDate>
    <guid>http://twitter.com/toscho/statuses/7960752682</guid>
    <link>http://twitter.com/toscho/statuses/7960752682</link>
</item>

title und description unterscheiden sich also nicht. Ich finde, daß man zumindest in einem von beiden den Nutzernamen hätte entfernen können …

Den Feed hole ich mit SimplePie, und den einzelnen Tweet werte ich mit dieser Funktion auf:

function format_tweet($content, $user = NULL)
{
    $uri_schemes = array (
        'mailto', 'news', 'nntp', 'callto', 'ed2k', 'irc', 'ssh', 'svn',
        's?ftps?', 'https?' );
    $regex['url'] = '(' . implode('|', $uri_schemes)
            . ')://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?';
    $regex['username'] = "@([a-zA-Z_\d]+)";
    $regex['hashtag']  = "([^\pL]){0,1}(#([-_\pL\d]+))";

    if ( ! is_null($user) )
    {
        // Usernamen + ': ' aus Text entfernen
        $content = substr( $content, ( strlen($user ) + 2 ) );
    }
    // Hyperlinks umwandeln
    $content = preg_replace(
        '~' . $regex['url'] . '~u', '<a href="${0}">${0}</a> ', $content);
    // Usernamen verlinken
    $content = preg_replace(
        '~' . $regex['username'] . '~u',
        '<a class="user" href="http://twitter.com/${1}">${0}</a>',
        $content);
    // Hashtags verlinken
    $content = preg_replace(
        '~' . $regex['hashtag'] . '~u',
        ' ${1}<a class="tag" href="http://twitter.com/search?q=%23${3}">${2}</a>',
        $content);

    return $content;
}

Das hätte ich wesentlich kompakter schreiben können, aber die Übersicht geht vor.

Aus dem oben gezeigten Quelltext wird per …

echo format_tweet($item, 'toscho');

… dieses Markup:

Informieren statt Sperren: 
<a href="http://toscho.de/p1609">http://toscho.de/p1609</a>
<a class="tag" 
    href="http://twitter.com/search?q=%23gebloggt"
>#gebloggt</a>

In einem Projekt, das ich hier nicht nennen kann, habe ich Feeds zu bestimmten Suchworten eingebunden. Um Spam herauszufiltern, habe ich die Hashtags und die URLs eines Tweets gezählt, und den Tweet beim Überschreiten bestimmter Grenzen verworfen. Das funktioniert zwar nicht sehr zuverlässig, aber wer darauf verzichtet, holt sich schnell viel Schund auf die eigene Seite.

4 Kommentare

  1. 555nasenzwerg am 28.05.2010 · 22:00

    Kann ich mit HTML Codes auf der normalen Twitter Seite mit meinem Account arbeiten? Oder brauche ich für die hier beschriebenen Sachen extra Software?

  2. Thomas Scholz am 28.05.2010 · 22:07

    @555nasenzwerg: Das hier vorgestellte PHP-Script ist für den Einsatz auf einer eigenen Website gedacht. Twitter läßt dich keinen Code einbetten; weder HTML noch PHP. Du brauchst also einen Webserver mit PHP.

  3. Daniel am 16.08.2010 · 14:18

    @Thomas: Vielen Dank für den Code! Hat super geklappt bei mir!
    @555nasenzwerg: Müsste bei jedem gängigen Hoster funktionieren.

  4. nox am 11.11.2010 · 18:59

    u are fukken awsome! just what i needed