Frage

Ich versuche, einen Benutzer Twitter-Status von meiner C # Anwendung zu aktualisieren.

ich suchte im Internet und verschiedene Möglichkeiten gefunden, aber ich bin ein bisschen durch die jüngste (?) Änderung in Twitters Authentifizierungsprozess verwechselt. Ich fand auch, was ein relevant Stackoverflow Post zu sein scheint, aber es einfach meine Frage nicht beantworten, weil es ultra-spezifische ist ein Code-snippet regading, das funktioniert nicht.

Ich versuche, das REST-API und nicht der Such-API, zu erreichen, was bedeutet, dass ich auf die strengeren OAuth-Authentifizierung leben soll.

ich an zwei Lösungen gesucht. Der Twitterizer Rahmen hat gut funktioniert, aber es ist eine externe DLL und ich würde lieber Quellcode verwenden. Nur als Beispiel, der Code es verwendet, ist sehr klar und sieht so aus:

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

Ich untersuchte auch Yedda Twitter-Bibliothek , aber dieser fehlgeschlagen, was ich der Authentifizierungsprozess zu glauben, wenn sie wie oben im Grunde den gleichen Code versucht (Yedda erwartet in den Status aktualisieren sich der Benutzername und das Passwort, aber alles andere soll gleich sein).

Da ich keine eindeutige Antwort auf dem Netz finden konnte, ich bringe es zu Stackoverflow.

Was ist der einfachste Weg, ein Twitter-Status-Update arbeitet in einer C # -Anwendung, ohne externe DLL-Abhängigkeit zu erhalten?

Danke

War es hilfreich?

Lösung

Wenn Sie wie die Twitterizer Rahmen aber einfach nicht mag nicht die Quelle, warum nicht es sehen wenn Sie wollen einfach nur sehen, was es tut .. ).

Andere Tipps

Ich bin kein Fan von neu zu erfinden das Rad, vor allem, wenn es um Produkte geht, die bereits, dass 100% der gesuchten Funktionalität existieren. Ich habe tatsächlich den Quellcode für Twitterizer nebeneinander laufen meine ASP.NET MVC-Anwendung einfach so dass ich die erforderlichen Änderungen vornehmen könnte ...

Wenn Sie wirklich nicht die DLL Referenz wollen, hier zu existieren, ist ein Beispiel dafür, wie der Updates in C # codieren. Check this out von DreamInCode .

/*
 * A function to post an update to Twitter programmatically
 * Author: Danny Battison
 * Contact: gabehabe@hotmail.com
 */

/// <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 */}
}

Eine weitere Twitter-Bibliothek die ich verwendet habe erfolgreich ist TweetSharp , die ein fließend API bereitstellt.

Der Quellcode ist unter Google Code zur Verfügung. Warum wollen Sie nicht eine DLL benutzen? Das ist bei weitem der einfachste Weg, eine Bibliothek in einem Projekt aufzunehmen.

Der einfachste Weg, Sachen zu Twitter posten benutzen Standardauthentifizierung , die isn‘ t sehr stark.

    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);
    }

Versuchen Sie LINQ to Twitter . Finden LINQ to Twitter Update Status mit Medien vollständige Codebeispiel, das mit Twitter REST API V1.1 arbeitet. Die Lösung ist auch zum Download zur Verfügung.

LINQ to Twitter Code-Beispiel

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);

Versuchen Sie TweetSharp . Finden TweetSharp Update-Status mit Medien vollständige Codebeispiel arbeitet mit API V1.1 Twitter REST. Die Lösung ist auch zum Download zur Verfügung.

TweetSharp Code-Beispiel

//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");
            }
        }

Hier ist ein andere Lösung mit minimalem Code der hervorragende AsyncOAuth Nuget Paket und Microsofts HttpClient. Diese Lösung auch voraus, dass Sie in Ihrem eigenen Namen sind zu veröffentlichen, so dass Sie Ihr Access-Token Schlüssel / Geheimnis, bereits aber auch, wenn Sie nicht die Strömung recht einfach ist (siehe AsyncOauth docs).

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
        }
    }
}

Dies funktioniert auf allen Plattformen aufgrund Httpclient der Natur. Ich benutze diese Methode selbst auf Windows Phone 8.7 für einen ganz anderen Service.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top