„Twitterprinter“

Update: Das Projekt läuft, unter http://flomei.de/specials/twitterprinter/ ist ein Bild davon zu sehen.

Haha, heute habe ich meinen persönlichen Nerdfaktor eine ganz ordentliche Nummer gesteigert. Dazu etwas Vorgeschichte und dann Einzelheiten… ;-D

Die Tage tauchte hier beim Aufräumen auf dem Dachboden eine Kiste auf. In der Kiste befand sich neben einem Atari 1040 ST samt Monitor (möchte den irgendwer haben?) auch ein alter Nadeldrucker. Ein Star LC-10 von 1988 (zumindest ist das Handbuch von ’88, also dürfte der Rest auch daher sein).

Den Atari will ich noch versuchen bei ebay zu verkaufen, bei dem Drucker war ich mir nicht sicher, ob das noch sinnvoll ist. Der ist noch vergilbter und dreckiger als der Atari, die Abdeckklappe ist gebrochen und, neben allem anderen, … er ist von 1988.

Naja, ich dachte ich schau wenigstens mal ob er überhaupt noch läuft. Also hab ich ihn an mein T60 angeschlossen, das hat nämlich noch eine Parallelschnittstelle, finde die mal heute an einem PC oder gar einem Laptop. Und dann hab ich den Drucker ganz normal über den Windows-Dialog zum Hinzufügen eines neuen Druckers eingerichtet. Das es kein Plug&Play-Gerät ist und damit automatisch erkannt wird, dürfte einleuchten…

Als Erstes hab ich eine Testseite gedruckt und die kam gar nicht übel raus. Dafür, dass der Drucker schon zig Jahre hier in der Kiste rumgestanden hat wirklich nicht übel. Nadeldrucker eben… ;-D

Davon war ich schonmal recht angetan, ich hab dann noch dies und jenes ausprobiert und ihn gedanklich auch schon auf ebay eingestellt. Und dann kam mir gestern eine großartige Idee.

Ich bin ja auch auf twitter zu finden und ich dachte, man könne vielleicht irgendwas Cooles mit dem „Oldschool-Drucker“ und einem so modernen Medium wie twitter anfangen. Schnell war der Entschluss gefallen tweets auszudrucken.

Nach einigem Überlegen stellte sich dann für mich als einfachste Variante (es geht hier ums Basteln und nicht um eine perfekte, geschlossene Lösung) ein Auslesen von twitter-Daten über PHP und eine Ausgabe über ein kleines C++-Programm dar. Mein C++ ist nämlich einfach zu schlecht um die twitter-Bibliotheken zu nutzen die es da so gibt.

Im Folgenden also eine kleine Aufführung was da wie ineinander greift und das Gesamtbild erzeugt. Apropos Gesamtbild. Ich hab mal ein Foto von der Konstruktion gemacht, damit man sich einen Eindruck von der lustigen Bastelstunde machen kann…

Zu sehen sind der Drucker und (unten in der Mitte, unscharf) die Webcam die Bilder ins Netz „streamt“. Dazu später mehr.

Kommen wir erstmal zur Software.

C++-Programm zur Druckersteuerung

Dankenswerterweise stolperte ich recht schnell über diesen Beitrag im C/C++ Forum.

Ich war auf der Suche nach der „Ansteuerung“ von Druckern und mir fiel mehr als nur ein Stein vom Herzen als ich sah, dass sich das in meinem Fall (alter Drucker mit LPT-Anschluss) so schön einfach gestalten lässt.

Ich habe da also auch nicht weiter rumgezaubert und auf Basis dieses Quellcodes ein kleines Programm geschrieben, dessen Quellcode folgt:

#include <iostream>
#include <fstream>
using namespace std;

int main (int argc, char* argv[])
{
  ofstream printer("LPT1");
  if(!printer)
  {
    cerr << "Drucker konnte nicht gefunden werden, bzw. ist nicht eingeschaltet." << endl;
    return 1;
  }

  printer << argv[1];
  printer << "\n";
  printer << argv[2];
  printer << "\n\n\n";

  printer.close();

  return 0;
}

Wie man sieht, nichts Großes. Es werden die Inhalte von argv[1] und argv[2] ausgegeben, das sind die beiden ersten Parameter die beim Aufruf an das Programm übergeben werden. In diesem Beispiel sind das Autor + Datum und die Nachricht.

PHP-Skript zum Erfassen der Daten und Aufruf des Druckprogramms

Wie bereits erwähnt, stellt sich PHP als einfachste Möglichkeit dar Daten zu empfangen und zu verarbeiten. Das Ganze läuft über die „twitter Search API“, auf die man auch ohne relativ komplexe Authentifizierung (oAuth) zugreifen kann, indem man sich über Nutzername und Passwort ausweist.

Auch hier folgt jetzt zunächst der Quelltext.

<?php
// Authentifizierungsdaten
$username = 'flomei_test';
$password = 'sagichnichtistnaemlichgeheim';

// URL, die die Aktion definiert
$strAufrufURL = 'http://search.twitter.com/search.json?q=%23flomeidruckt';

// cURL initiieren
$curl = curl_init();

// URL angeben
curl_setopt($curl, CURLOPT_URL, $strAufrufURL);

// Wichtig für Anfragen bei denen der Rückgabewert verarbeitet werden soll
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// Authentifizierung setzen
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");

// Rückgabe holen und dekodieren
$Rueckgabe = json_decode(curl_exec($curl),false);

// cURL schließen
curl_close($curl);

$last_tweet = $_COOKIE["last_tweet"];
setcookie("last_tweet",substr($Rueckgabe->results[0]->created_at,5,20), time()+3600);

$anzahl = count($Rueckgabe->results);

$gedruckt = false;

for($i=($anzahl-1); $i>=0; $i--)
{
  if(substr($Rueckgabe->results[$i]->created_at,5,20) > $last_tweet)
  {
    // Zeitverschiebung ausgleichen, deshalb 7200 Sekunden addieren
    $timestamp = (strtotime(substr($Rueckgabe->results[$i]->created_at,5,20))+7200);
    $datum = date('j.n.Y - G:i:s',$timestamp);

    $string1 = $Rueckgabe->results[$i]->from_user.' ('.$datum.')';
    $string2 = mb_convert_encoding($Rueckgabe->results[$i]->text, "ISO-8859-1", "UTF-8");
    $string2 = str_replace('#flomeidruckt', '', $string2);

    $umlaute = array('ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü', '@', '&quot;', '´', '&amp;');
    $ersetzung = array('ae', 'oe', 'ue', 'ss', 'Ae', 'Oe', 'Ue', '(at)', '\'', '\'', '(et)');
    $string2 = str_replace($umlaute, $ersetzung, $string2);

    $string1 = escapeshellarg($string1);
    echo $string1.'<br />';
    $string2 = escapeshellarg($string2);
    echo $string2.'<br /><br />';

    exec("druckertest.exe $string1 $string2");
  }
}

?>

Auch dies ist eigentlich nichts fürchterlich Besonderes.

Wie man sieht wird hier mit einem JSON-Objekt hantiert, das hat sich als einfachster Weg herausgestellt, da PHP5 da bereits Funktionen dafür mitbringt. So entfällt der Einsatz eines zusätzlichen Feed-Parsers oder ähnlicher Softwareteile. Die curl-Sachen habe ich von hier übernommen, da gibt es einen schönen Artikel darüber. Lohnt sich, wenn man sich etwas über die Vorgänge informieren wil.

Das Cookie nutze ich, wie man sehen kann, um zu prüfen ob der aktuelle Tweet aus dem JSON-Objekt bereits ausgegeben wurde oder eben noch nicht. Sollte das nicht der Fall sein, dann wird da etwas mit dem Inhalt rumgespielt: Entfernen des gesuchten Hashtags, ersetzen einiger Sonderzeichen, Formatieren der Ausgabe, das übliche halt.

Das Script erzeugt über den echo-Befehl noch ein wenig Ausgabe, das ist recht praktisch, wenn man sehen will wie da was verarbeitet wurde.

Zu guter Letzt erfolgt der Aufruf des Druckprogramms samt Parameterübergabe.

Ausgabe

Das PHP-Skript wird hier auf dem lokalen XAMMP-Webserver in einem Firefox-Tab ausgeführt. Der Tab lädt sich dank „Reload Every“ alle 60 Sekunden automatisch neu, prüft damit den Feed auf neue Einträge und gibt diese ggf. aus.

Ich hatte das Ganze auch versucht über eine Batch-Datei zu machen die von einem „Geplanten Task“ (Windows-Funktion ähnlich wie Cronjobs) aufgerufen wird, aber dabei wurde interessanterweise die Prüfung des tweet-Alters übergangen. Seltsam…

Nunja, wenn das soweit erledigt ist, dann legt praktisch zeitgleich der Drucker los und jagt die Nadeln durchs Farbband und damit die Zeichen auf Papier. Das funktioniert auch recht super, einige kleine Dinge gibt es allerdings noch…

Probleme

Das Hauptproblem, und eigentlich auch so das einzige für mich „echte“ Problem ist der Zeichensatz den der Drucker verwendet. Ich bekomme zum Beispiel keine Anführungszeichen dargestellt, obwohl der Drucker die kann. Auf der Selbsttestseite sind zum Beispiel welche abgebildet. Ähnlich mit dem Ampersand-Zeichen (&) und dem Paragraphen-Symbol. Ich hab da eine Menge durchprobiert und jetzt etwas resigniert. Irgendwie möchte er einige Zeichen nicht darstellen.

Sonst funktioniert die Ausgabe recht gut, einziges Manko sind die erzwungenen Zeilenumbrüche, bei denen dann die Wörter zerfetzt werden. Vielleicht gibts ein Steuersignal um dem Drucker das auszutreiben, aber die akzeptiert er irgendwie auch nicht… Naja, übertreibts einfach nicht beim…

Mitmachen

Ja, das hier ist nicht nur als „Technologie-Demo“ gedacht, nein, ich will den Spaß an der Sache teilen. Mitmachen ist also ganz einfach. Wer einen twitter-Account hat, ist schon dabei. Einfach ein „#flomeidruckt“ ans Ende des Tweets setzen (da stört es nicht, wenn es entfernt wird) und schon wird es gedruckt, wenn es im Feed auftaucht (was relativ schnell geht – etwa 10 bis 20 Sekunden hab ich Nachmittags gemessen).

Ich fände es schön, wenn auf diesem Wege etwas „Gemeinschaft“ und Spaß an der Sache rumkommt. Grüße an Follower (Achtung, @ wird zu (at)), Grüße an die Welt, Werbung (wenig!), alles Mögliche. Ich bin mir sicher, dass ihr alle kreativ genug seid, um etwas Schönes damit anzufangen.

Momentan suche ich noch nach einer Möglichkeit (Live-)Bilder ins Netz zu streamen, bzw. per FTP hochzuladen. Leider will das noch nicht so wie ich möchte.

Deshalb läuft der Drucker momentan auch noch nicht. Wenn ich eine Lösung gefunden habe und morgen Zeit habe das Ganze etwas zu „betreuen“, dann werde ich es laufen lassen. Ich werde dann über twitter entsprechend bekannt geben, wann der Spaß anfängt…

Florian Meier

Florian Meier

Florian Meier ist ausgebildeter Mediengestalter und hat sich selbst digitale Fotografie und Webentwicklung beigebracht. Er hat Druck- und Medientechnik studiert und ist wohl das, was man Digital Native nennt. Sein Geld verdient er mit Medien, aktuell als E-Business Print Manager bei der Longo Deutschland GmbH in Augsburg. In diesem Blog schreibt er über private Basteleien und Meinungen.

4 Gedanken zu „„Twitterprinter““

  1. Hi Florian,
    ich weiß nicht ob du mich noch kennst, bin der Daniel aus der Berufsschule *g* und hab da noch nen Tipp für dich :)

    Probier mal aus ob du hiermit:
    c:\php\php.exe -r ‚echo „test\r\n“;‘ > LPT1
    eine Ausgabe auf den Drucker bekommst.

    Wenn das klappt dann kannst du komplett auf deinen C++ Part verzichten und deine PHP Ausgabe einfach auf den Drucker umleiten.

    Ich hatte mal mit Michael zusammen ein Barcode Drucksystem in PHP gebastelt, das hat so ähnlich funktioniert.

    1. Vielen Dank für diesen Tipp Daniel. Ich habe das gerade mal ausprobiert, aber irgendwie möchte er damit keine Ausgabe erzeugen. Da meine Lösung aber ja auch funktioniert, werde ich deinen Ansatz auch erstmal nicht weiter verfolgen… ;-D

      Und keine Angst, ich hab nicht vergessen wer du bist… ;-D

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.