2

私はこのコードを持っています:

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

必要なのは、Twitterのステータスを更新することだけです。残念ながら、それは機能していません。アプリケーションへのアクセスを許可するために最初にTwitterにログインしたときに1回だけ機能しました。次に、authTokenとauthVerifierを保存して、将来の更新に再利用できるようにしました。

何が悪いのか分かりますか?

更新:コードを次のように変更しました:

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

「無効/期限切れのトークン」というエラーメッセージが表示されます。

4

3 に答える 3

3

間違った値を保存しています。authTokenとverifierの値は、OAuthUtility.GetAccessToken(...)を使用してアクセストークンとすばやく交換する必要があります。そのメソッドから返されるアクセストークンは、保存されてTwitterizerに提供されるものです。

-リッキーTwitterizer
作者

于 2010-12-11T22:03:52.580 に答える
1

C#/。NETから簡単なステータス更新を行えるようにしたかったのですが、大きなライブラリを埋め込みたくありませんでした。

そこで、このようなことを行う小さなOAuth.Managerクラスを作成しました。

ここで説明します:
.NETでの検証を使用したOAuth

ステータスを更新するためのサンプルコード:

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

初めて、アクセストークンとシークレットを取得する必要があります。これは、次のコードから始まる複数のステップのプロセスで実行されます。

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

ステップ2は、ユーザー**にhttps://api.twitter.com/oauth/authorize?oauth_token=XXXX、xxxxが実際に受信したトークン(この場合は。によってアクセス可能)に置き換えられる場所にアクセスするように指示することoauth["token"]です。ステップ3は、ユーザーにWebページからPINを取得(ctrl-c)してアプリに貼り付けるように指示することです。ここで、PINを使用して別の種類のトークンを取得します。

より良い方法は、WebBrowserコントロールが埋め込まれたWindowsフォームを使用して、そのWebUIシーケンスを自動化することです。そのコントロールのUrlプロパティを適切な値に設定すると、独自のアプリのメインフォーム内にそのWebページが表示されます。PINを取得する部分を自動化することもできます。これにより、ユーザーのコンテキストスイッチが減り、理解しやすくなります。

とにかく、あなたがするピンで、ステップ4:

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

...これは別のHTTPRESTリクエストを送信し、それが返されると、とで利用可能なアクセストークンとシークレットがありoauth["token"]ますoauth["token_secret"]

Web UIでのこの承認作業は、一度だけ行う必要があります。アクセストークンとシークレットを一度取得したら、それらを保存して再利用できます。期限切れになることはない、とツイッターは言う。

その後、ステータス更新の送信に進むことができます...

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

...上記のように。

于 2010-12-21T22:39:26.527 に答える
1

ゲームに遅れていることはわかっていますが、これを行う方法を正確に示すエンドツーエンドのビデオチュートリアルを作成しました。dev.twitter.comでアプリケーションを作成し、nugetを使用してtwitterizerをインストールし、oauthを処理するコードを記述します。最後に、Twitterから受け取ったアクセストークンを使用してツイートを作成するコードを記述します。

ビデオ:http ://www.youtube.com/watch?v = TGEA1sgMMqU

チュートリアル:http ://www.markhagan.me/Samples/Grant-Access-And-Tw​​eet-As-Twitter-User-ASPNet

コード(このページを離れたくない場合):

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.");
                }
            }
        }
    }
}
于 2012-12-06T15:09:01.023 に答える