An einschlägigen IT-Stammtischen kreisen immer wieder Witze mit der Quintessenz: das Internet backupen, das Internet löschen oder das Internet ausdrucken. Mit dem letzteren habe ich mich beschäftigt. Völlig am Zeitgeist vorbei, wird mit einem Thermodrucker und Visual Basic Winforms ein Twitter Stream gedruckt.
Dafür habe ich mich wirklich in Unkosten gestürzt und den Thermopapier-Drucker Modell D10 aus dem Hause Celectronic für 11,90€ bestellt.
Der Drucker kommt mit einer Parallelschnittstelle und einem USB Adapter. Windows 8.1 erkennt diesen und trägt in den Gerätemanager ein USB Device ein.
Als nächstes wird manuell ein Drucker hinzugefügt, der ebendiese Schnittstelle nutzt.
Der Thermotransferdrucker kann eigentlich nur ASCII Zeichen mit vordefiniertem Zeichensatz. Deshalb wird der generische Text Only Drucker Treiber gewählt.
Im nächsten Schritt wird mit Visual Studio 2013 ein Visual Basic Winforms Projekt erstellt. Die Twitter REST API 1.1 erfordert einen OAuth autorisierten Zugriff. Dazu muss man mit einem Twitter Account die Applikation im Web Interface anlegen und erhält Token und Security Credentials. Diese insgesamt vier Parameter werden von der Anwendung bei jedem Abruf benötigt.
Um mit Twitter, der Authentifizierung und der API so wenig Aufwand wie möglich zu haben, wurde die Library Tweetinvi per Nuget zum Projekt hinzugefügt. Ein Test mit einer alternativen Library LINQ2Twitter schlug fehl.
Es wird die Twitter Search API genutzt, um alle 15 Sekunden eine Suche auf einen Hashtag abzusetzen. Um auf jeden Fall die wichtigen Nachrichten im Fehlerfall nicht zu verpassen, werden immer einfach alle Tweets, die Twitter hergibt, geladen. Mit Hilfe einer separaten Liste, in der anhand der Tweet ID doppelte Einträge vermieden werden, werden dann die Einträge eindeutig gehalten. Diese Liste weiß auch, ob der Eintrag bereits gedruckt wurde. Für die Persistenz wird beim Beenden und Starten die Liste serialisiert bzw. deserialisiert , so dass niemals etwas doppelt gedruckt werden sollte..
Wer schon einmal mit XAML gedruckt hat, wird völlig entgeistert feststellen, wie einfach das unter Winforms läuft.
Der Testaufbau mit einem Acer W3 Tablet mit Windows 8.1:
nun noch der VB.NET Beispiel Code
1: Imports Newtonsoft.Json
2: Imports System.IO
3: Imports Microsoft.VisualBasic.PowerPacks.Printing
4: Imports System.Drawing.Printing
5: Imports Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6
6:
7: Public Class Form1
8: Dim key As String = "oY...............3"
9: Dim secret As String = "rqV..................................u"
10: Dim atoken As String = "155...........................CB"
11: Dim stoken As String = "y9.................................bx"
12: Dim tweetlist As New List(Of twittermsg)
13:
14:
15:
16: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
17: On Error Resume Next
18: tweetlist = JsonConvert.DeserializeObject(
Of List(Of twittermsg))(File.ReadAllText("daten.json"))
19: End Sub
20: Private Sub Form1_Closing(sender As Object,
e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
21: File.WriteAllText("daten.json", JsonConvert.SerializeObject(tweetlist))
22: End Sub
23:
24: Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
25: TwitterCredentials.SetCredentials(atoken, stoken, key, secret)
26: Dim tweets = Search.SearchTweets(TextBox1.Text)
27: Dim n = tweets.Count
28: For Each t In tweets
29: If IsNothing(tweetlist.Find(Function(c) c.id = t.IdStr)) Then
30: tweetlist.Add(New twittermsg With
{.id = t.IdStr, .text = t.Text, .printed = False})
31: End If
32: Next
33: Dim nn = tweetlist.Count
34: For Each x In tweetlist
35: If x.printed = False Then
36: ListBox1.Items.Add(x.text)
37: Dim Printer As New Printer()
38: Printer.PrintQuality = vbPRPQDraft
39: Printer.Print(x.text)
40: Printer.EndDoc()
41: x.printed = True
42: End If
43: Next
44: End Sub
45: Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
46: Timer1.Enabled = True
47: ListBox1.Visible = True
48: End Sub
49: End Class
50: Class twittermsg
51: Public Property id As String
52: Public Property printed As Boolean
53: Public Property text As String
54: End Class