2010-12-09 10 views
2

Ich habe dieses Stück Code:Beitrag twitter Update mit Twitterizer

var settings = WebConfigurationManager.AppSettings; 
    var consumerKey = settings["Twitter.ConsumerKey"]; 
    var consumerSecret = settings["Twitter.ConsumerSecret"]; 
    var authToken = settings["Twitter.OAuthToken"]; 
    var authVerifier = settings["Twitter.OAuthVerifier"]; 

    //var accessToken = GetAccessToken(
    // consumerKey, consumerSecret, authToken, string.Empty); 

    var tokens = new OAuthTokens() 
    { 
     AccessToken = authToken, 
     AccessTokenSecret = authVerifier, 
     ConsumerKey = consumerKey, 
     ConsumerSecret = consumerSecret 
    }; 

    TwitterStatus.Update(tokens, txtComment.Text); 

Alles, was ich es brauchen Update-Status Meine Twitter ist. Leider funktioniert es nicht. Es funktionierte nur einmal, als ich mich zum ersten Mal bei Twitter anmeldete, um der Anwendung Zugriff zu gewähren. Ich habe dann authToken und authVerifier gespeichert, damit ich sie für zukünftige Updates wiederverwenden kann.

Irgendeine Idee, was ist falsch?

UPDATE: Ich habe gerade den Code:

 TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, txtComment.Text); 
    if (tweetResponse.Result == RequestResult.Success) 
     lblMessage.Text = "Twitter status successfully posted."; 
    else 
     lblMessage.Text = string.Format("Twitter status update failed with Error: '{0}'", 
      tweetResponse.ErrorMessage); 

und ich erhalte eine Fehlermeldung: "Ungültige/abgelaufene Token".

+0

Sie gesagt haben, es nicht funktioniert, aber gab uns keine Informationen darüber, was es * macht *. –

+0

Es tut nichts. Die Statusmeldung ändert sich nicht und es wird keine Ausnahme ausgelöst. –

Antwort

3

Sie speichern die falschen Werte. Die authToken- und Verifier-Werte müssen schnell mit OAuthUtility.GetAccessToken (...) gegen ein Zugriffstoken ausgetauscht werden. Das Zugriffstoken, das von dieser Methode zurückgegeben wird, sollte gespeichert und an Twitterizer bereitgestellt werden.

-Ricky
Die Twitterizer Autor

+0

Hallo Ricky, Danke für deine Antwort. Wenn ich versuche, 'GetAccessToken' aufzurufen, erhalte ich leider einen 401-Fehler, obwohl die App bereits berechtigt ist, auf mein Konto zuzugreifen. Irgendwelche Ideen? –

+0

Sie müssen den Vorgang in kurzer Zeit abschließen: 1) Anforderungstoken abrufen. 2) Senden Sie den Benutzer, um Ihre Anwendung auf twitter.com zu autorisieren. 3) Tauschen Sie das Anfrage-Token gegen ein Zugriffstoken aus. Sobald Sie das Zugriffstoken haben, speichern Sie es. Sie müssen den Prozess nicht erneut ausführen, es sei denn, der Benutzer widerruft den Zugriff. Das Anforderungs-Token läuft nach einigen Minuten ab, sodass Sie die zuvor gespeicherten nicht verwenden können, um ein Zugriffstoken zu erhalten. –

1

ich einen einfachen Status-Update von C# /. NET zu machen in der Lage sein wollte, konnte aber eine große Bibliothek einzubetten.

Also schrieb ich eine kleine OAuth.Manager class, die dieses Zeug tut.

Es ist hier beschrieben:
OAuth with Verification in .NET

Beispielcode Status zu aktualisieren:

var oauth = new OAuth.Manager(); 
oauth["consumer_key"] = CONSUMER_KEY; 
oauth["consumer_secret"] = CONSUMER_SECRET; 
oauth["token"] = your_stored_access_token; 
oauth["token_secret"] = your_stored_access_secret; 
var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World"; 
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 

var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "POST"; 
request.Headers.Add("Authorization", authzHeader); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    if (response.StatusCode != HttpStatusCode.OK) 
     MessageBox.Show("There's been a problem trying to tweet:" + 
         Environment.NewLine + 
         response.StatusDescription + 
         Environment.NewLine + 
         Environment.NewLine + 
         "You will have to tweet manually." + 
         Environment.NewLine); 
} 

Zum ersten Mal durch, müssen Sie einen Zugriffstoken und Geheimnis zu bekommen. Dies wird in einem mehrstufigen Verfahren durchgeführt, mit diesem Code Start:

var oauth = new OAuth.Manager(); 
oauth["consumer_key"] = MY_APP_SPECIFIC_KEY; 
oauth["consumer_secret"] = MY_APP_SPECIFIC_SECRET; 
oauth.AcquireRequestToken("https://api.twitter.com/oauth/request_token", "POST"); 

Schritt 2 ist, dem Benutzer zu sagen ** https://api.twitter.com/oauth/authorize?oauth_token=XXXX zu besuchen, wo xxxx mit dem tatsächlichen Token ersetzt empfangen wird, zugänglich in diesem Fall durch oauth["token"] . Schritt 3 besteht darin, dem Benutzer mitzuteilen, dass er die PIN von der Webseite (ctrl-c) übernehmen und in Ihre App einfügen soll, wo Sie den Pin verwenden, um einen anderen Tokentyp zu erhalten.

Eine bessere Möglichkeit besteht darin, diese Web-UI-Sequenz zu automatisieren, indem Sie ein Windows Form mit einem eingebetteten WebBrowser-Steuerelement verwenden. Wenn Sie die Url-Eigenschaft dieses Steuerelements auf den entsprechenden Wert festlegen, wird diese Webseite für Sie im Hauptformular Ihrer eigenen App angezeigt. Sie können auch den Teil automatisieren, von dem Sie die PIN abrufen. Dies reduziert Kontextwechsel für Ihren Benutzer und erleichtert das Verständnis.

Wie auch immer, mit dem Stift Sie tun, Schritt 4:

oauth.AcquireAccessToken("https://api.twitter.com/oauth/access_token", 
    "POST", 
    pin); 

..., die eine andere HTTP REST Anfrage sendet, und wenn er zurückkehrt werden Sie ein accesss Token und Geheimnis haben, in oauth["token"] und oauth["token_secret"].

Diese Autorisierung Zeug mit der Web-UI muss nur einmal passieren; Nachdem Sie das Zugriffs-Token und das geheime einmal erhalten haben, können Sie sie speichern und sie erneut verwenden. Sie laufen nie ab, sagt Twitter.

Sie können dann zum Senden des Status-Update gehen ...

var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World"; 
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 
... 

... wie oben.

+0

Danke, ich schätze deine Hilfe. Ich werde den Code ausprobieren und sehen, ob es für mich funktioniert. –

1

Ich weiß, ich bin zu spät zum Spiel, aber ich habe ein Ende-zu-Ende-Video-Tutorial erstellt, das genau zeigt, wie das geht: Ich erstelle eine Anwendung auf dev.twitter.com, installiere twitterizer mit nuget, schreibe den Code um den OAuth zu behandeln und schließlich den Code zu schreiben, um die Zugriffstoken zu verwenden, die von Twitter empfangen wurden, um einen Tweet zu machen.

Video: http://www.youtube.com/watch?v=TGEA1sgMMqU

Tutorial: http://www.markhagan.me/Samples/Grant-Access-And-Tweet-As-Twitter-User-ASPNet

-Code (falls Sie wan nicht diese Seite verlassen):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

using Twitterizer; 

namespace PostFansTwitter 
{ 
    public partial class twconnect : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      var oauth_consumer_key = "YOUR_CONSUMER_KEY_HERE"; 
      var oauth_consumer_secret = "YOUR_CONSUMER_SECRET_KEY_HERE"; 

      if (Request["oauth_token"] == null) 
      { 
       OAuthTokenResponse reqToken = OAuthUtility.GetRequestToken(
        oauth_consumer_key, 
        oauth_consumer_secret, 
        Request.Url.AbsoluteUri); 

       Response.Redirect(string.Format("http://twitter.com/oauth/authorize?oauth_token={0}", 
        reqToken.Token)); 
      } 
      else 
      { 
       string requestToken = Request["oauth_token"].ToString(); 
       string pin = Request["oauth_verifier"].ToString(); 

       var tokens = OAuthUtility.GetAccessToken(
        oauth_consumer_key, 
        oauth_consumer_secret, 
        requestToken, 
        pin); 

       OAuthTokens accesstoken = new OAuthTokens() 
       { 
        AccessToken = tokens.Token, 
        AccessTokenSecret = tokens.TokenSecret, 
        ConsumerKey = oauth_consumer_key, 
        ConsumerSecret = oauth_consumer_secret 
       }; 

       TwitterResponse<TwitterStatus> response = TwitterStatus.Update(
        accesstoken, 
        "Testing!! It works (hopefully)."); 

       if (response.Result == RequestResult.Success) 
       { 
        Response.Write("we did it!"); 
       } 
       else 
       { 
        Response.Write("it's all bad."); 
       } 
      } 
     } 
    } 
}