HttpClient, Twitter OAuth & die Twitter Timeline auslesen

image.png

Die Twitter Timeline eines Nutzers über die API auszulesen ist nicht ganz so trivial wie ein RSS Feed parsen. Größte Hürde ist, dass fast alle API Aufrufe bei Twitter eine Authentifizierung erfordern. Dabei kommt OAuth zum Einsatz, welches selbst nicht ganz so einfach zu verstehen ist. Aber der Reihe nach…

Zusätzlich nutzen wir den “neuen” HttpClient der mit .NET 4.5 integriert wurde.

Twitter API – App mit Secret und Consumer Key wird benötigt

imageDie REST API von Twitter ist mehr oder minder gut dokumentiert und bei fast allen API Aufrufen findet man den Hinweis dass eine Authentifizierung benötigt wird.

Für die Authentifizierung benötigt man eine App im Twitter API Universum.

 

 

 

 

 

 

 

 

 

 

Twitter API – App erstellen

Über die API Seite kann man eine neue App erstellen und nachdem man die benötigten Daten eingegeben hat, bekommt man auch die beiden interessanten Sachen zu sehen:

 

image

 

Der Consumer Key und das Secret sollte “geheim” bleiben – da ich die App direkt im Anschluss wieder lösche ist dies aber kein Problem.

Ab zum Code…

Es gibt eine ganze Reihe von .NET Bibliotheken zum Thema Twitter auf NuGet, aber wir nutzen die “pure” Variante über den HttpClient.

In dem Beispiel wollen wir die Tweets von meinem Twitter Profil abrufen. Dafür müssen wir erst bei Twitter anmelden und dann gegen diesen REST Service eine Anfrage stellen.

   1: class Program

   2:     {

   3:         public static string oAuthConsumerKey = "9jD2zxpqPF3zHRLnMek7Q";

   4:         public static string oAuthConsumerSecret = "yYSC6bRm50n2vvZOuVlSWtbk9B8lNImzjazyl5eYM";

   5:         public static string oAuthUrl = "https://api.twitter.com/oauth2/token";

   6:         public static string screenname = "robert0muehsig";

   7:  

   8:         public static async Task<string> GetTwitterAccessToken()

   9:         {

  10:             var client = new HttpClient();

  11:  

  12:             var authHeaderParameter = Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" +

  13:                                                              Uri.EscapeDataString((oAuthConsumerSecret))));

  14:  

  15:             var postBody = "grant_type=client_credentials";

  16:  

  17:             client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderParameter);

  18:  

  19:             var response = await client.PostAsync(oAuthUrl, new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded"));

  20:  

  21:             response.EnsureSuccessStatusCode();

  22:  

  23:             string oauthtoken = await response.Content.ReadAsStringAsync();

  24:             var jToken = JToken.Parse(oauthtoken);

  25:             var accessToken = jToken.SelectToken("access_token");

  26:  

  27:             return accessToken.Value<string>();

  28:         }

  29:  

  30:         public static async Task<IEnumerable<string>> GetTwitterTimeline(string oauthToken)

  31:         {

  32:             var client = new HttpClient();

  33:  

  34:             var timelineFormat = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&include_rts=1&exclude_replies=1&count=5";

  35:             var timelineUrl = string.Format(timelineFormat, screenname);

  36:  

  37:             client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", oauthToken);

  38:             var response = await client.GetAsync(timelineUrl);

  39:  

  40:             response.EnsureSuccessStatusCode();

  41:  

  42:             string timeline = await response.Content.ReadAsStringAsync();

  43:  

  44:             var jTimeline = JArray.Parse(timeline);

  45:             var textNodes = jTimeline.Children()["text"];

  46:  

  47:             var textValues = textNodes.Values<string>();

  48:  

  49:             return textValues;

  50:         }

  51:  

  52:         static void Main(string[] args)

  53:         {

  54:             var twitterAccessToken = GetTwitterAccessToken().Result;

  55:  

  56:             var timeline = GetTwitterTimeline(twitterAccessToken).Result;

  57:  

  58:             Console.WriteLine("Twitter Timeline from: " + screenname);

  59:             foreach (var timelineItem in timeline)

  60:             {

  61:                 Console.WriteLine(timelineItem);

  62:             }

  63:  

  64:             Console.ReadLine();

  65:         }

Im ersten Schritt holen wir den AccessToken von Twitter. Dabei wird der Cosumer Key und das Secret im HTTP Authorization Header mit. Wir nutzen dazu noch JSON.NET, da als Antwort der Token als JSON daherkommt.

image

Danach nutzen wir den Access Token und schicken diesen als Header in den anderen Requests mit.

Anschliessend nur noch die Response parsen und fertig.

image

Ergebnis:

image

Nicht ganz einfach – aber wenn man den Dreh raus hat, ist es gar nicht so schwierig.

“Login with Twitter”?

Wer nach dem “Login with Twitter” Thema sucht, der könnte hier fündig werden.

Quellen

Der Blogpost geht auf den HttpClient näher ein. Die Antwort in diesem Stackoverflow Thread ist die Quelle des Source Codes – allerdings mit der “alten” WebClient Variante.

Happy Coding!

Den Code gibt es natürlich ebenfalls auf GitHub.

Read more

Eigene Json-Web-Tokens (JWTs) erstellen und validieren

image.png

Wer sich mit Authentifizierung im Web befasst wird früher oder später auf den Begriff JSON Web Token treffen (JWT). Was ist ein JWT?Vermutlich nutze ich nicht die Security-Fach-Termini, aber seis drum: JWTs werden eingesetzt um Claims zwischen zwei Systemen auszutauschen. Beispiel: Über eine App möchte man sich an einem Dienst (Facebook, Twitter, etc.) einloggen und […]

Read more

Dateidownload über FTP am Beispiel von Azure Websites Diagnostics

Websites auf Azure legen Diagnoseinformationen (Fehler Berichte, IIS Logs, Git Logs oder eigene Logfiles) als Text-Datei auf dem Server ab. Diese lassen sich relativ einfach via FTP auslesen. Der FTP Endpunkt für eine Website in West-Europa sollte dieser sei: ftp://waws-prod-am2-001.ftp.azurewebsites.windows.net Zu sehen ist die natürlich auch im Azure Management:             […]

Read more

Unit Testing mit Entity Framework–über Effort

image.png

Das Entity Framework ist zwar nicht unumstritten, aber wird oftmals in Verbindung mit der Datenabfrage aus dem SQL Server eingesetzt. Solche Lösungen neigen allerdings oftmals dazu das Thema Unit-Testing zu vernachlässigen. Das Problem: Der SQL Server ist langsam und eine unangenehme Abhängigkeit bei Unit Tests Unit Tests – so steht es schon im Namen – […]

Read more

OWIN, WebAPI & RazorViewEngine

image_thumb.png

Die ersten Schritte mit OWIN sind recht schnell gemacht. In diesem Blogpost möchte ich über OWIN die WebAPI nutzen – allerdings nicht als REST Endpunkt, sondern um HTML zurückzugeben. Für alle die mit OWIN garnichts anfangen können, der könnte ein Blick auf meine Unterlagen werfen. Warum nicht ASP.NET MVC? Aktuell ist das MVC Framework sehr […]

Read more

Fix: CA0058 : The referenced assembly ‘System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ could not be found.

Ich hatte kürzlich mit FxCop bzw. der Code Analyse unter Visual Studio 2012 ein Problem. Eines der WebApi NuGet Packages enthielt die Assembly “System.Net.Http”, allerdings sprang hierauf die Code Analyse an: “CA0058 : The referenced assembly ‘System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ could not be found. This assembly is required for analysis and was referenced by: C:\…\bin\Web.dll, […]

Read more

Caller Information mit .NET 4.5 oder “Wer hat die Funktion aufgerufen?”

Debugging und Logging Code strotzt meist vor Funktionsnamen und co. – nur damit man am Ende im Log wieder die passende Stelle im Code findet. Natürlich gibt es noch weitere Gründe herauszufinden wer welchen Code aufgerufen hat. Das Interface INotifyPropertyChanged ist auch solch ein Beispiel. Hier wird der Name des Properties benötigt. Dies kann man […]

Read more

OWIN, Katana & One ASP.NET

Dies war das Thema bei der .NET User Group Zürich am letzten Mittwoch. Ich möchte hier meine Präsentationsunterlagen zur Verfügung stellen. Präsentation auf SpeakerDeck Link zur Präsentation. Demo Code Der gesamte Demo-Code ist auf GitHub zu finden. Weitere Links Eine gute Zusammenfassung des Katana/OWIN-Teils findet man auch als Video auf Channel 9 bzw. auf der […]

Read more

Interne Tools – billig und geschmacklos, richtig?

image.png

Es gibt ein tooles Sprichwort “Schuster haben die schlechtesten Schuhe” – sowas sieht man natürlich auch oft in der IT. Interne Tools oder Dienstleistungen zu eigenen, also internen, Zwecken werden meist halbherzig oder auch gar nicht mit der nötigen Professionalität betrieben und entwickelt. Die Grundidee – alles für den Kunden! Die Zeit die man fürs […]

Read more

Interaktionen zwischen Web und Windows Desktop/Windows Phone/WinRT mit ObjectForScripting & window.external.notify

Aus einer Desktop-Anwendung eine Web-Applikation aufzurufen ist trivial und es gibt je nach Art des Aufrufs unterschiedliche Wege. Man kann einen HTTP Request erzeugen, oder man verweisst einfach mit einem Link auf die Seite und der Browser geht auf oder man hat einen “embedded” Browser, der die Seite direkt im “App-Host” anzeigt. Recht einfach, aber […]

Read more

Letzte Posts

  • image.png
    Source Code veröffentlichen – aber bitte mit Lizenz

    Seit es den Blog gibt wird auch meist der gesamte Demo Source Code mit veröffentlicht. Das Ganze hatte ich am Anfang noch als .zip verteilt, später lag es mal auf Google Code und nun liegen alle Samples und sonstige Sachen auf GitHub. Beim letzten User Group Treffen in Zürich mit dem Titel “Open Source: Get […]

  • Fix: Cannot convert from ‘CConnectProxy::_ComMapClass *’ to ‘AddInDesignerObjects::IDTExtensibility2 *’

    Mal einen etwas esoterischer Blogpost, welcher auftaucht wenn man zu viel mit Office Addins rumspielt. Der Fehler passiert beim Bauen von C++ Projekten, welchen diesen Typ benötigen. Lösung (auf 64bit Systemen): C:\Program Files (x86)\Common Files\DESIGNER>regsvr32 MSADDNDR.DLL And Rebuild. Meine lieben Kollegen hatte mir dies schon mehrfach gesagt, allerdings hatte ich es immer wieder vergessen Das […]

  • Gegen das Gesetz verstoßen: X Jahre Haft. Gegen die Terms of Use verstoßen: Bann auf Lebenszeit. Danke Google & co.

    Bei fast allen Diensten die man im Internet nutzen kann muss man den “Terms of use” zustimmen. Völlig logisch dass da natürlich drin steht was erlaubt und was nicht. Wenn man gegen diese Regelungen verstößt hat das Unternehmen natürlich das Recht etwas dagegen zu unternehmen. In der heutigen Welt beherrschen einige wenige Unternehmen die digitale […]

  • image.png
    RSS Feed samt Kommentaranzahl und andere nicht Standard Elemente mit dem SyndicationFeed auslesen

    Jetzt mal ein Blogpost ohne ein fancy NuGet Package: Seit .NET 3.5 gibt es die SyndicationFeed Klasse. Eine schon etwas ältere API, reicht aber aus um Atom bzw. RSS Feeds zu lesen. In diversen RSS Feeds gibt es aber Erweiterungen, welche man natürlich auch auslesen möchte. So gibt WordPress z.B. auch die Anzahl der geposteten […]

  • image.png
    ASP.NET Bundling & Fontawesome

    Vor einer halben Ewigkeit hatte ich mal geschrieben wie man Fontawesome in ASP.NET nutzen kann. Aufgrund des Alters des Post und einem Kommentar ob man denn Fontawesome auch in das ASP.NET Bundling Framework integrieren kann möchte ich nur ein kurzes Update schreiben. TL;DR: NuGet Package “Fontawesome” runterladen und Pfad in der Bundleconfig angeben. Kurze Schritte […]

Amazon Shop

Facebook