HttpClient, Twitter OAuth & die Twitter Timeline auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • <p>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 <a href="https://dev.twitter.com/docs/auth/oauth">OAuth</a> zum Einsatz, welches selbst nicht ganz so einfach zu verstehen ist. Aber der Reihe nach…</p>


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


    Twitter API – App mit Secret und Consumer Key wird benötigt
    <p><a href="http://code-inside.de/blog/wp-content/uploads/image1931.png"></a>Die <a href="https://dev.twitter.com/docs/api/1.1">REST API</a> von Twitter ist mehr oder minder gut dokumentiert und bei fast allen API Aufrufen findet man den Hinweis dass eine Authentifizierung benötigt wird.</p>


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


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    <p>&nbsp;</p>


    Twitter API – App erstellen
    <p>Ü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:</p>


    <p>&nbsp;</p>


    <p><a href="http://code-inside.de/blog/wp-content/uploads/image1932.png"></a></p>


    <p>&nbsp;</p>


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


    Ab zum Code…
    <p>Es gibt eine ganze Reihe von .NET Bibliotheken zum <a href="http://www.nuget.org/packages?q=twitter">Thema Twitter auf NuGet</a>, aber wir nutzen die “pure” Variante über den HttpClient.</p>


    <p>In dem Beispiel wollen wir die Tweets von <a href="https://twitter.com/robert0muehsig">meinem Twitter Profil</a> abrufen. Dafür müssen wir erst bei Twitter anmelden und dann <a href="https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline">gegen diesen REST Service eine Anfrage stellen</a>.</p>




    1: class Program
    <p>
    2: {
    <p>
    3: public static string oAuthConsumerKey = "9jD2zxpqPF3zHRLnMek7Q";
    <p>
    4: public static string oAuthConsumerSecret = "yYSC6bRm50n2vvZOuVlSWtbk9B8lNImzjazyl5eYM";
    <p>
    5: public static string oAuthUrl = "https://api.twitter.com/oauth2/token";
    <p>
    6: public static string screenname = "robert0muehsig";
    <p>
    7:&nbsp;
    <p>
    8: public static async Task&lt;string&gt; GetTwitterAccessToken()
    <p>
    9: {
    <p>
    10: var client = new HttpClient();
    <p>
    11:&nbsp;
    <p>
    12: var authHeaderParameter = Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" +
    <p>
    13: Uri.EscapeDataString((oAuthConsumerSecret))));
    <p>
    14:&nbsp;
    <p>
    15: var postBody = "grant_type=client_credentials";
    <p>
    16:&nbsp;
    <p>
    17: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderParameter);
    <p>
    18:&nbsp;
    <p>
    19: var response = await client.PostAsync(oAuthUrl, new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded"));
    <p>
    20:&nbsp;
    <p>
    21: response.EnsureSuccessStatusCode();
    <p>
    22:&nbsp;
    <p>
    23: string oauthtoken = await response.Content.ReadAsStringAsync();
    <p>
    24: var jToken = JToken.Parse(oauthtoken);
    <p>
    25: var accessToken = jToken.SelectToken("access_token");
    <p>
    26:&nbsp;
    <p>
    27: return accessToken.Value&lt;string&gt;();
    <p>
    28: }
    <p>
    29:&nbsp;
    <p>
    30: public static async Task&lt;IEnumerable&lt;string&gt;&gt; GetTwitterTimeline(string oauthToken)
    <p>
    31: {
    <p>
    32: var client = new HttpClient();
    <p>
    33:&nbsp;
    <p>
    34: var timelineFormat = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&amp;include_rts=1&amp;exclude_replies=1&amp;count=5";
    <p>
    35: var timelineUrl = string.Format(timelineFormat, screenname);
    <p>
    36:&nbsp;
    <p>
    37: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", oauthToken);
    <p>
    38: var response = await client.GetAsync(timelineUrl);
    <p>
    39:&nbsp;
    <p>
    40: response.EnsureSuccessStatusCode();
    <p>
    41:&nbsp;
    <p>
    42: string timeline = await response.Content.ReadAsStringAsync();
    <p>
    43:&nbsp;
    <p>
    44: var jTimeline = JArray.Parse(timeline);
    <p>
    45: var textNodes = jTimeline.Children()["text"];
    <p>
    46:&nbsp;
    <p>
    47: var textValues = textNodes.Values&lt;string&gt;();
    <p>
    48:&nbsp;
    <p>
    49: return textValues;
    <p>
    50: }
    <p>
    51:&nbsp;
    <p>
    52: static void Main(string[] args)
    <p>
    53: {
    <p>
    54: var twitterAccessToken = GetTwitterAccessToken().Result;
    <p>
    55:&nbsp;
    <p>
    56: var timeline = GetTwitterTimeline(twitterAccessToken).Result;
    <p>
    57:&nbsp;
    <p>
    58: Console.WriteLine("Twitter Timeline from: " + screenname);
    <p>
    59: foreach (var timelineItem in timeline)
    <p>
    60: {
    <p>
    61: Console.WriteLine(timelineItem);
    <p>
    62: }
    <p>
    63:&nbsp;
    <p>
    64: Console.ReadLine();
    <p>
    65: }
    <p>

    <p>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 <a href="http://www.nuget.org/packages/Newtonsoft.Json/">JSON.NET</a>, da als Antwort der Token als JSON daherkommt.</p>


    <p><a href="http://code-inside.de/blog/wp-content/uploads/image1933.png"></a></p>


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


    <p>Anschliessend nur noch die Response parsen und fertig.</p>


    <p><a href="http://code-inside.de/blog/wp-content/uploads/image1934.png"></a></p>


    Ergebnis:
    <p><a href="http://code-inside.de/blog/wp-content/uploads/image1935.png"></a></p>


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


    “Login with Twitter”?
    <p>Wer nach dem “Login with Twitter” Thema sucht, der könnte <a href="http://code-inside.de/blog/2012/10/14/twitter-login-in-asp-net-mvc-4-ohne-membership-co-nutzen/">hier</a> fündig werden.</p>


    Quellen
    <p>Der <a href="http://www.jayway.com/2012/03/13/httpclient-makes-get-and-post-very-simple/">Blogpost geht auf den HttpClient näher</a> ein. Die <a href="http://stackoverflow.com/questions/17067996/authenticate-and-request-a-users-timeline-with-twitter-api-1-1-oauth">Antwort in diesem Stackoverflow Thread</a> ist die Quelle des Source Codes – allerdings mit der “alten” WebClient Variante.</p>


    <p>Happy Coding!</p>


    <p>Den Code gibt es natürlich ebenfalls auf <a href="https://github.com/Code-Inside/Samples/tree/master/2013/TwitterApiTest">GitHub</a>.</p>


    1.825 mal gelesen