Question

J'essaie de mettre à jour le statut Twitter d'un utilisateur à partir de mon application C #.

J'ai cherché sur le Web et trouvé plusieurs possibilités, mais je suis un peu dérouté par le récent changement (?) du processus d'authentification de Twitter. J'ai également trouvé ce qui semble être un article StackOverflow pertinent , mais il Tout simplement ne répond pas à ma question car il est ultra-spécifique régnant un extrait de code qui ne fonctionne pas.

J'essaie d'atteindre l'API REST et non l'API de recherche, ce qui signifie que je devrais respecter l'authentification OAuth plus stricte.

J'ai examiné deux solutions. Le Framework Twitterizer a bien fonctionné, mais c'est une DLL externe et je préfère utiliser le code source. A titre d'exemple, le code qui l'utilise est très clair et ressemble à ceci:

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

J'ai également examiné la bibliothèque Twitter de Yedda , mais celle-ci a échoué sur ce que je crois être le processus d'authentification, en essayant essentiellement le même code que ci-dessus (Yedda attend le nom d'utilisateur et le mot de passe dans la mise à jour du statut lui-même, mais tout le reste est censé être identique).

Comme je ne trouvais pas de réponse claire sur le Web, je la porte à StackOverflow.

Quel est le moyen le plus simple de faire fonctionner une mise à jour de statut Twitter dans une application C #, sans dépendance de DLL externe?

Merci

Était-ce utile?

La solution

Si vous aimez le cadre Twitterizer mais que vous n'aimez tout simplement pas ne pas avoir le code source, pourquoi ne pas télécharger la source ? (Ou parcourez-le si vous voulez simplement voir ce que vous faites. .)

Autres conseils

Je ne suis pas partisan de la réinvention de la roue, en particulier pour les produits existants qui fournissent 100% des fonctionnalités recherchées. En fait, le code source de Twitterizer est exécuté parallèlement à mon application ASP.NET MVC afin que je puisse apporter les modifications nécessaires ...

Si vous ne voulez vraiment pas que la référence de la DLL existe, voici un exemple sur la manière de coder les mises à jour en C #. Découvrez-le à partir de code de rêve .

/*
 * 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 */}
}
Une autre bibliothèque Twitter que j’ai utilisée avec succès est TweetSharp , qui fournit une API fluide.

Le code source est disponible sur code Google . Pourquoi ne voulez-vous pas utiliser une DLL? C’est de loin le moyen le plus simple d’inclure une bibliothèque dans un projet.

Le moyen le plus simple de publier des éléments sur Twitter consiste à utiliser l ' authentification de base , qui est' t très fort.

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

Essayez LINQ To Twitter . Recherchez LINQ To Twitter . status with media complete exemple de code qui fonctionne avec Twitter REST API V1.1 de Twitter. La solution est également disponible au téléchargement.

Exemple de code LINQ To Twitter

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

Essayez TweetSharp . Trouvez le statut de la mise à jour de TweetSharp avec l'exemple de code complet du média fonctionne avec l'API REST Twitter V1.1. La solution est également disponible au téléchargement.

Exemple de code TweetSharp

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

Voici une autre solution avec un code minimal utilisant l'excellent paquet AsyncOAuth Nuget et le HttpClient . Cette solution suppose également que vous publiez en votre propre nom, de sorte que vous avez déjà votre clé / secret de jeton d'accès, mais même si vous ne le faites pas, le flux est assez facile (voir la documentation 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
        }
    }
}

Cela fonctionne sur toutes les plateformes en raison de la nature de HttpClient. J'utilise cette méthode moi-même sur Windows Phone 7/8 pour un service complètement différent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top