2009-07-30 10 views
5

Próbuję zaktualizować status Twittera użytkownika z poziomu aplikacji C#.Zaktualizuj status Twittera w języku C#

Przeszukałem internet i znalazłem kilka możliwości, ale jestem nieco zdezorientowany ostatnią (?) Zmianą procesu uwierzytelniania na Twitterze. Znalazłem też coś, co wydaje się być relevant StackOverflow post, ale po prostu nie odpowiada na moje pytanie, ponieważ jest wyjątkowo precyzyjny, ponieważ nie działa fragment kodu.

Próbuję połączyć się z interfejsem API REST, a nie z interfejsem API wyszukiwania, co oznacza, że ​​powinienem sprostać bardziej rygorystycznemu uwierzytelnianiu OAuth.

Spojrzałem na dwa rozwiązania. Twitterizer Framework działało dobrze, ale jest to zewnętrzna biblioteka DLL i wolałbym używać kodu źródłowego. Tylko jako przykład, kod używając go jest bardzo jasne i wygląda tak:

Twitter twitter = new Twitter("username", "password"); 
twitter.Status.Update("Hello World!"); 

ja również zbadane Yedda's Twitter library, ale ta nie powiodła się na tym, co uważam za proces uwierzytelniania, gdy próbuje w zasadzie taki sam kod jak powyżej (Yedda oczekuje nazwy użytkownika i hasła w samej aktualizacji statusu, ale wszystko inne ma być takie samo).

Ponieważ nie mogłem znaleźć jednoznacznej odpowiedzi w sieci, przenosiłem ją do StackOverflow.

Jaki jest najprostszy sposób, aby zaktualizować status Twittera w aplikacji C# bez zewnętrznej zależności DLL?

Dzięki

Odpowiedz

10

Jeśli lubisz ramowa Twitterizer ale po prostu nie lubię, nie mający źródło, dlaczego nie download the source? (Lub browse it, jeśli chcesz tylko zobaczyć, co robi ...)

+0

Cóż, myślę, że głupie pytanie zasługuje na prostą odpowiedź ... W pewnym momencie przegapiłem fakt, że ich źródła były dostępne. Dzięki :) –

7

Nie jestem fanem ponownego wynajdywania koła, szczególnie jeśli chodzi o produkty, które już istnieją, które zapewniają 100% poszukiwanej funkcjonalności . Właściwie mam kod źródłowy dla Twitterizer działającego równolegle z moją aplikacją ASP.NET MVC tylko po to, abym mógł wprowadzić niezbędne zmiany ...

Jeśli naprawdę nie chcesz, aby odniesienie DLL istniało, oto przykład jak kodować aktualizacje w C#. Sprawdź to od dreamincode.

/* 
* A function to post an update to Twitter programmatically 
* Author: Danny Battison 
* Contact: [email protected] 
*/ 

/// <summary> 
/// Post an update to a Twitter acount 
/// </summary> 
/// <param name="username">The username of the account</param> 
/// <param name="password">The password of the account</param> 
/// <param name="tweet">The status to post</param> 
public static void PostTweet(string username, string password, string tweet) 
{ 
    try { 
     // encode the username/password 
     string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password)); 
     // determine what we want to upload as a status 
     byte[] bytes = System.Text.Encoding.ASCII.GetBytes("status=" + tweet); 
     // connect with the update page 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml"); 
     // set the method to POST 
     request.Method="POST"; 
     request.ServicePoint.Expect100Continue = false; // thanks to argodev for this recent change! 
     // set the authorisation levels 
     request.Headers.Add("Authorization", "Basic " + user); 
     request.ContentType="application/x-www-form-urlencoded"; 
     // set the length of the content 
     request.ContentLength = bytes.Length; 

     // set up the stream 
     Stream reqStream = request.GetRequestStream(); 
     // write to the stream 
     reqStream.Write(bytes, 0, bytes.Length); 
     // close the stream 
     reqStream.Close(); 
    } catch (Exception ex) {/* DO NOTHING */} 
} 
+1

To niesamowite, że istnieją platformy programistyczne dla Twittera, gdy tylko 10 linii C# jest wystarczających do zrobienia tego! +1 – nbevans

+5

@NathanE: Istnieje wiele rzeczy, które mają tylko około 10 linii kodu, ale które dobrze mieć w bibliotece. To powstrzymuje cię od robienia głupich pomyłek, na przykład zapominania o użyciu instrukcji '' 'dla strumieni i przełykania wyjątków, na przykład ... –

+3

@NathanE: Nadal trzymam się wierności mojej rekomendacji, którą Jon powtórzył, używając Biblioteki, gdzie to możliwe i tworząc Jeśli potrzebujesz ... – RSolberg

3

innej biblioteki Twitter Użyłem powodzeniem jest TweetSharp, która zapewnia płynny API.

Kod źródłowy jest dostępny pod adresem Google code. Dlaczego nie chcesz użyć biblioteki dll? Jest to zdecydowanie najłatwiejszy sposób włączenia biblioteki do projektu.

1

Najprostszym sposobem publikowania rzeczy na twitterze jest użycie niezbyt mocnego kodu basic authentication.

static void PostTweet(string username, string password, string tweet) 
    { 
     // Create a webclient with the twitter account credentials, which will be used to set the HTTP header for basic authentication 
     WebClient client = new WebClient { Credentials = new NetworkCredential { UserName = username, Password = password } }; 

     // Don't wait to receive a 100 Continue HTTP response from the server before sending out the message body 
     ServicePointManager.Expect100Continue = false; 

     // Construct the message body 
     byte[] messageBody = Encoding.ASCII.GetBytes("status=" + tweet); 

     // Send the HTTP headers and message body (a.k.a. Post the data) 
     client.UploadData("http://twitter.com/statuses/update.xml", messageBody); 
    } 
0

Wypróbuj TweetSharp. Znajdź TweetSharp update status with media complete code example współpracuje z REST API dla Twittera 1.1. Rozwiązanie jest również dostępne do pobrania.

Kod TweetSharp Próbka

//if you want status update only uncomment the below line of code instead 
     //var result = tService.SendTweet(new SendTweetOptions { Status = Guid.NewGuid().ToString() }); 
     Bitmap img = new Bitmap(Server.MapPath("~/test.jpg")); 
     if (img != null) 
     { 
      MemoryStream ms = new MemoryStream(); 
      img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
      ms.Seek(0, SeekOrigin.Begin); 
      Dictionary<string, Stream> images = new Dictionary<string, Stream>{{"mypicture", ms}}; 
      //Twitter compares status contents and rejects dublicated status messages. 
      //Therefore in order to create a unique message dynamically, a generic guid has been used 

      var result = tService.SendTweetWithMedia(new SendTweetWithMediaOptions { Status = Guid.NewGuid().ToString(), Images = images }); 
      if (result != null && result.Id > 0) 
      { 
       Response.Redirect("https://twitter.com"); 
      } 
      else 
      { 
       Response.Write("fails to update status"); 
      } 
     } 
1

Spróbuj LINQ To Twitter.Znajdź stan aktualizacji LINQ To Twitter z pełnym przykładem kodu nośnika, który działa z interfejsem API REST aplikacji w wersji 1.0. Rozwiązanie jest również dostępne do pobrania.

LINQ do Twittera Kod próbki

var twitterCtx = new TwitterContext(auth); 
string status = "Testing TweetWithMedia #Linq2Twitter " + 
DateTime.Now.ToString(CultureInfo.InvariantCulture); 
const bool PossiblySensitive = false; 
const decimal Latitude = StatusExtensions.NoCoordinate; 
const decimal Longitude = StatusExtensions.NoCoordinate; 
const bool DisplayCoordinates = false; 

string ReplaceThisWithYourImageLocation = Server.MapPath("~/test.jpg"); 

var mediaItems = 
     new List<media> 
     { 
      new Media 
      { 
       Data = Utilities.GetFileBytes(ReplaceThisWithYourImageLocation), 
       FileName = "test.jpg", 
       ContentType = MediaContentType.Jpeg 
      } 
     }; 

Status tweet = twitterCtx.TweetWithMedia(
    status, PossiblySensitive, Latitude, Longitude, 
    null, DisplayCoordinates, mediaItems, null); 
0

Oto kolejny rozwiązanie przy minimalnym użyciu kodu znakomitą AsyncOAuth pakiet Nuget i Microsoft HttpClient. To rozwiązanie zakłada również, że publikujesz we własnym imieniu, dzięki czemu masz już klucz/klucz dostępu do tokenu, nawet jeśli nie jest to łatwe (zobacz Dokumenty AsyncOauth).

using System.Threading.Tasks; 
using AsyncOAuth; 
using System.Net.Http; 
using System.Security.Cryptography; 

public class TwitterClient 
{ 
    private readonly HttpClient _httpClient; 

    public TwitterClient() 
    { 
     // See AsyncOAuth docs (differs for WinRT) 
     OAuthUtility.ComputeHash = (key, buffer) => 
     { 
      using (var hmac = new HMACSHA1(key)) 
      { 
       return hmac.ComputeHash(buffer); 
      } 
     }; 

     // Best to store secrets outside app (Azure Portal/etc.) 
     _httpClient = OAuthUtility.CreateOAuthClient(
      AppSettings.TwitterAppId, AppSettings.TwitterAppSecret, 
      new AccessToken(AppSettings.TwitterAccessTokenKey, AppSettings.TwitterAccessTokenSecret)); 
    } 

    public async Task UpdateStatus(string status) 
    { 
     try 
     { 
      var content = new FormUrlEncodedContent(new Dictionary<string, string>() 
      { 
       {"status", status} 
      }); 

      var response = await _httpClient.PostAsync("https://api.twitter.com/1.1/statuses/update.json", content); 

      if (response.IsSuccessStatusCode) 
      { 
       // OK 
      } 
      else 
      { 
       // Not OK 
      } 

     } 
     catch (Exception ex) 
     { 
      // Log ex 
     } 
    } 
} 

Działa to na wszystkich platformach ze względu na naturę HttpClient. Używam tej metody samodzielnie na Windows Phone 7/8 dla zupełnie innej usługi.