سؤال

لدي هذا القطعة من الكود:

    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 لمنح الوصول إلى التطبيق. ثم قمت بتخزين 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);

وأتلقى رسالة خطأ: "رمز غير صالح / منتهي الصلاحية".

هل كانت مفيدة؟

المحلول

أنت تقوم بتخزين القيم الخاطئة. يجب تبادل قيم AuthToken و Vearive بسرعة لرمز الوصول باستخدام Oauthutility.getAccessToken (...). رمز الوصول الذي يتم إرجاعه من هذه الطريقة هو ما ينبغي تخزينه وتزويده بتويتر.

-RICKY
مؤلف Twitterizer

نصائح أخرى

أردت أن أكون قادرًا على إجراء تحديث بسيط للحالة من شبكة C#/. ، لكنني لم أرغب في تضمين مكتبة كبيرة.

لذلك كتبت صغيرة Oauth.Manager فئة هذا يفعل هذه الأشياء.

تم وصفه هنا:
OAUTH مع التحقق في .NET

نموذج رمز لتحديث الحالة:

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 هي إخبار المستخدم بالاستيلاء على (CTRL-C) دبوس من صفحة الويب ولصقه في تطبيقك ، حيث تستخدم رقم التعريف الشخصي للحصول على نوع آخر من الرمز المميز.

هناك طريقة أفضل هي أتمتة تسلسل واجهة المستخدم على الويب باستخدام نموذج Windows مع عنصر تحكم WebBrowser مضمن. عندما تقوم بتعيين خاصية عنوان URL لعنصر التحكم هذا على القيمة المناسبة ، فسيظهر أن صفحة الويب لك ، داخل الشكل الرئيسي لتطبيقك الخاص. يمكنك أيضًا أتمتة الجزء الذي تقوم فيه باسترداد الدبوس. هذا يقلل من مفاتيح السياق للمستخدم الخاص بك ويجعل الأمور أكثر بساطة لفهمها.

على أي حال ، مع الدبوس الذي تفعله ، الخطوة 4:

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

... الذي يرسل طلبًا آخر لـ HTTP REST ، وعندما يتم إرجاعه ، سيكون لديك رمز وصول سري ، متاح في oauth["token"] و oauth["token_secret"].

يجب أن يحدث هذا التفويض مع واجهة المستخدم على الويب مرة واحدة فقط ؛ بعد أن تحصل على رمز الوصول وسري بمجرد, ، يمكنك تخزينها وإعادة استخدامها. يقول Twitter إنه لا ينتهي صلاحيته أبدًا.

يمكنك بعد ذلك المتابعة إلى إرسال تحديث الحالة ...

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

...على النحو الوارد أعلاه.

أعلم أنني تأخرت عن اللعبة ، لكنني أنشأت برنامجًا تعليميًا من طرف إلى طرف يوضح بالضبط كيفية القيام بذلك: أقوم بإنشاء تطبيق على dev.twitter.com ، وتثبيت Twitterizer باستخدام Nuget ، واكتب الرمز للتعامل مع Oauth وأخيراً اكتب الرمز لاستخدام رموز الوصول المستلمة من Twitter لإجراء تغريدة.

فيديو: http://www.youtube.com/watch؟v=tgea1sgmmqu

درس تعليمي: http://www.markhagan.me/samples/grant-access-and-tweet-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.");
                }
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top