2 votes

Requêtes simples avec l'API Twitter en utilisant uniquement un access_token

Je code une application C#.Net WPF 4.0 qui se connecte à Facebook et Twitter via oauth. Avec l'API graphique de Facebook, je suis en mesure d'autoriser, de me connecter avec oauth, d'échanger un jeton d'accès temporaire contre un jeton d'accès presque permanent, et ensuite, de récupérer n'importe quelle donnée en ajoutant le jeton d'accès à côté de ma requête, ou en postant sur le mur, comme ceci : [http://Url/query/access\_token], et tout cela sans aucun SDK ni aucune autre bibliothèque.

J'ai essayé de faire la même chose avec Twitter mais je me suis embrouillé. J'ai cherché des exemples sur la façon de récupérer des données Json de la même manière que pour Facebook, mais je n'ai rien trouvé, probablement parce que je ne sais pas quoi chercher. Quel est le flux que je dois suivre pour être capable de faire des requêtes avec seulement une url directe et un jeton ?

2voto

avs099 Points 4455

Vous devez faire ce qui suit :

  1. Obtenir le jeton d'accès pour l'utilisateur : https://dev.twitter.com/docs/auth/obtaining-access-tokens

  2. Utilisez l'une des API REST : https://dev.twitter.com/docs/api

  3. Générer l'en-tête OAuth et l'insérer dans votre requête. Ci-dessous le code de mon application qui télécharge un tweet et des images dans twitter - mais les requêtes GET seront similaires. NOTE : J'utilise une classe OAuth tierce partie de https://cropperplugins.svn.codeplex.com/svn/Cropper.Plugins/TwitPic/OAuth.cs

    var oauth = new OAuth.Manager();
    oauth["consumer_key"] = Settings.TWITTER_CONSUMER_KEY;
    oauth["consumer_secret"] = Settings.TWITTER_CONSUMER_SECRET;
    oauth["token"] = item.AccessToken;
    oauth["token_secret"] = item.AccessSecret;
    
    var url = "https://upload.twitter.com/1/statuses/update_with_media.xml";
    var authzHeader = oauth.GenerateAuthzHeader(url, "POST");
    
    foreach (var imageName in item.Images.Split('|'))
    {
        var fileData = PhotoThubmnailBO.GetThumbnailForImage(imageName, ThumbnailType.FullSize).Photo;
    
        // this code comes from http://cheesoexamples.codeplex.com/wikipage?title=TweetIt&referringTitle=Home
        // also see http://stackoverflow.com/questions/7442743/how-does-one-upload-a-photo-to-twitter-with-the-api-function-post-statuses-updat
        var request = (HttpWebRequest) WebRequest.Create(url);
    
        request.Method = "POST";
        request.PreAuthenticate = true;
        request.AllowWriteStreamBuffering = true;
        request.Headers.Add("Authorization", authzHeader);
    
        string boundary = "~~~~~~" +
                          Guid.NewGuid().ToString().Substring(18).Replace("-", "") +
                          "~~~~~~";
    
        var separator = "--" + boundary;
        var footer = "\r\n" + separator + "--\r\n";
        string shortFileName = imageName;
        string fileContentType = GetMimeType(shortFileName);
        string fileHeader = string.Format("Content-Disposition: file; " +
                                          "name=\"media\"; filename=\"{0}\"",
                                          shortFileName);
        var encoding = Encoding.GetEncoding("iso-8859-1");
    
        var contents = new StringBuilder();
        contents.AppendLine(separator);
        contents.AppendLine("Content-Disposition: form-data; name=\"status\"");
        contents.AppendLine();
        contents.AppendLine(item.UserMessage);
        contents.AppendLine(separator);
        contents.AppendLine(fileHeader);
        contents.AppendLine(string.Format("Content-Type: {0}", fileContentType));
        contents.AppendLine();
    
        // actually send the request
        request.ServicePoint.Expect100Continue = false;
        request.ContentType = "multipart/form-data; boundary=" + boundary;
    
        using (var s = request.GetRequestStream())
        {
            byte[] bytes = encoding.GetBytes(contents.ToString());
            s.Write(bytes, 0, bytes.Length);
            bytes = fileData;
            s.Write(bytes, 0, bytes.Length);
            bytes = encoding.GetBytes(footer);
            s.Write(bytes, 0, bytes.Length);
        }
    
        using (var response = (HttpWebResponse) request.GetResponse())
        {
            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception(response.StatusDescription);
            }
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X