Vor einiger Zeit hatte ich ein kleines Tutorial geschrieben, das beschreibt, wie man mit Visual Basic auf die Twitter API zugreift um z. B. Tweets oder direct messages zu posten. Da Mitte des Jahres die Authentifizierung für Twitter von Basic Auth auf OAuth umgestellt wurde ist jedoch das in dem Tutorial beschriebene Vorgehen nicht mehr möglich. Vor Kurzem habe ich bereits gepostet, wie man mit C# und OAuth die Twitter API nutzen kann (und jedem, der C# beherrscht sei auch diese Variante zu empfehlen). Wegen der vielen Anfagen aber heute nun noch die Variante mit Visual Basic (für alle, die keine C# Kenntnisse mitbringen).
Zuerst müssen Sie Ihre Anwendung bei Twitter registrieren. Dies ist identisch mit dem im C#-Tutorial beschriebenen Schritten 1-5, die Sie hier nachlesen können. Starten Sie dann Visual Basic (ich haben die Version Visual Basic 2008 Express Edition verwendet, mit allen anderen müsste dies ähnlich funktionieren)
6. Für die OAuth Signatur habe ich die von Eran Sandler eigentlich für C# erstellte Klasse OAuthBase in Visual Basic übertragen (zu größten Teil automatisiert). Sie können diese Klasse hier downloaden. Binden Sie diese dann in Ihr Projekt ein. Btw: Ich habe die in Visual Basic übertragene Klasse nicht ausführlich getestet. Wie bereits oben beschrieben empfehle ich deshalb allen, die nicht unbedingt VB verwenden möchten, die C# Version vorzuziehen oder die C# Klassen in das VB-Projekt einzubinden.
7. Legen Sie nun ein Textfeld (txtTweet) und eine Button (cmdSenden) an:
8. Der Code sieht dann folgendermaßen aus:
Dim req As [Byte](), Antwort As Byte()
'WebClient anlegen
Dim myWebClient As New WebClient()
'oAuth anlegen
Dim oAuth As New OAuthBase()
'Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
System.Net.ServicePointManager.Expect100Continue = False
'Für direct message werden die Parameter text (Nachricht)
'und user (Empfänger) benötigt
Dim TwitterReqParameters As String = "user=Simon_A_Frank"
' Diese Zeile lösen das Umlaute- und Sonderzeichen-Problem - Details siehe:
' http://wp.me/pAc37-5E
Dim UriRfc3986CharsToEscape As String() = {"!", "*", "'", "(", ")"}
Dim escaped As _
New StringBuilder(Uri.EscapeDataString(txtTweet.Text.ToString()))
For i As Integer = 0 To UriRfc3986CharsToEscape.Length - 1
escaped.Replace(UriRfc3986CharsToEscape(i), _
Uri.HexEscape(UriRfc3986CharsToEscape(i)(0)))
Next
TwitterReqParameters += "&text=" & escaped.ToString()
'die OAuth ReqParameters - sind noch leer, werden unten generiert
Dim OAuthReqParameters As String = ""
'Sonstiges
Dim RequestMethod As String = "POST"
'die Tokens und Keys (vgl. Schritt 1-5)
Dim AccessToken As String = "?"
Dim AccessSecret As String = "?"
Dim ConsumerKey As String = "?"
Dim ConsumerSecret As String = "?"
'Zeit und Nonce lassen sich mit Hilfe von OAuthBase einfach generieren
Dim Nonce As String = oAuth.GenerateNonce()
Dim Zeitstempel As String = oAuth.GenerateTimeStamp()
'Die URL muss mit Parametern (auch bei POST!) als String und
'URI vorligene - etwas verwirrend, aber so will es OAuthBAse
Dim APIUrl As String = "https://twitter.com/direct_messages/new.xml" _
& "?" & TwitterReqParameters
Dim APIUri As New Uri(APIUrl)
'Zum Test können Sie vorher und nacher die Parameters ausgeben:
Console.WriteLine("OAParameters - noch leer: " & OAuthReqParameters)
'Jetzt die Signature generieren
'außerdem wird hier die APIUrl normalisiert
'und OAuthReqParameters generiert
Dim signature As String = oAuth.GenerateSignature(APIUri, ConsumerKey, _
ConsumerSecret, AccessToken, AccessSecret, RequestMethod, _
Zeitstempel, Nonce, APIUrl, OAuthReqParameters)
Console.WriteLine("OAuthReqParameters - mit oauth_ Parameters: " _
& OAuthReqParameters)
'die Signatur fehlt noch im vorbereiteten Request
OAuthReqParameters = OAuthReqParameters & "&" _
& "oauth_signature=" & signature
Console.WriteLine("OAuthReqParameters - mit Signatur: " _
& OAuthReqParameters)
' Jetzt in byte umwandeln:
req = Encoding.UTF8.GetBytes(OAuthReqParameters)
' Senden ...
Try
Antwort = myWebClient.UploadData(APIUrl, "POST", req)
'Die Antwort von Twitter ausgeben (XML-Daten):
MessageBox.Show("Erfolg: " & _
System.Text.Encoding.ASCII.GetString(Antwort))
Catch ex As Exception
'Wenn es nicht klappt Fehler ausgeben
MessageBox.Show("Geht nicht: " & ex.Message)
End Try




Pingback: Tweets mit VB.NET senden (Visual Basic 2008) « Frank IT Consulting&Training
Leider wirft der nen Fehler aus:
Fehler bei der Überladungsauflösung, da keine zugreifbare ‘GenerateSignature’ diese Anzahl von Argumenten akzeptiert
Kann mir da jemand nen Tip geben?
Gruß
André
Leider wird der Code hier unglücklich dargestellt, das muss ich mal optimieren. Der Bereich “Dim signature As String = oAuth.GenerateSignature(APIUri, ConsumerKey, ConsumerSecret, AccessToken, AccessSecret, RequestMethod, _
Zeitstempel, Nonce, APIUrl, OAuthReqParameters)” sollte in einer Zeile (oder man fügt nach “ConsumerKey,” ein “_” ein). Ich hoffe, so geht’s?
Jetzt habe ich die Darstellung des Codes etwas optimiert, so müsste es gehen.
Ich habe folgendes Problem:
Das Programm funktioniert an sich und es teilt mir auch mit, dass der Tweet erfolgreich gesendet wurde, aber in Twitter erscheint kein neuer Tweet.
Im übrigen steht, dass man bei der Registrierung der Applikation den Typ “Browser” auswählen soll. Sofern man dies tut muss man aber eine Callback URL angeben!
Würde mich über eine Antwort freuen
Sorry, bei der Beschreibung der Registrierung war ein Fehler, den ich ausgbessert habe: Es muss natürlich “Client” heißen, sonst kann man gar nicht “Read&Write” auswählen. Eine Callback URL braucht man nicht.
Zu dem anderen Problem: Wenn in der XML-Response eine ID des Tweets steht vermute ich fast, das ist ein temporäres Problem bei Twitter ist. Ist das Tweet so aufrufbar?
http://twitter.com/TwitterUsername/statuses/TweetID
Pingback: Tutorial: Die FriendFeed API mit C# (oder Visual Basic) « Frank IT Consulting&Training
Kennt jemand eine entsprechende Klasse für VB6? Will mir möglichst die Arbeit sparen und eine eigene Klasse schreiben
Nein, kenne ich nicht – ich würde hier einen Umstieg auf Visual Basic 2010 empfehlen.