Ich habe den folgenden Code schamlos von dev.twitter genommen, um die Zeitlinie von einem bestimmten Benutzer zu erhalten:Warum wird mein Aufruf, die Twitter-Benutzerzeitachse zurückzugeben, "401 Unauthorized" zurückgegeben?
string endpoint = "https://api.twitter.com/1.1/statuses/user_timeline.json";
string user_name = ".....";
string ConsumerKey = "....";
string ConsumerSecret = "........";
string Token = ".......";
string TokenSecret = "........";
// oauth application keys
var oauth_token = Token;
var oauth_token_secret = TokenSecret;
var oauth_consumer_key = ConsumerKey;
var oauth_consumer_secret = ConsumerSecret;
// oauth implementation details
var oauth_version = "1.0";
var oauth_signature_method = "HMAC-SHA1";
// unique request details
var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
var timeSpan = DateTime.UtcNow
- new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&screen_name={6}";
var baseString = string.Format(baseFormat,
oauth_consumer_key,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_token,
oauth_version,
user_name
);
//&include_rts=true &exclude_replies=false
baseString = string.Concat("GET&", Uri.EscapeDataString(endpoint), "&", Uri.EscapeDataString(baseString));
var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
"&", Uri.EscapeDataString(oauth_token_secret));
string oauth_signature;
using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
{
oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
}
string headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
"oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
"oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
"oauth_version=\"{6}\",screen_name=\"{7}\"";
var authHeader = string.Format(headerFormat,
Uri.EscapeDataString(oauth_nonce),
Uri.EscapeDataString(oauth_signature_method),
Uri.EscapeDataString(oauth_timestamp),
Uri.EscapeDataString(oauth_consumer_key),
Uri.EscapeDataString(oauth_token),
Uri.EscapeDataString(oauth_signature),
Uri.EscapeDataString(oauth_version),
Uri.EscapeDataString(user_name)
);
// make the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint);
request.Headers.Add("Authorization", authHeader);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
var response = (HttpWebResponse)request.GetResponse();
var reader = new StreamReader(response.GetResponseStream());
var objText = reader.ReadToEnd();
Aber ich bin immer ein 401 Unauthorized Fehler auf dieser Linie:
var response = (HttpWebResponse)request.GetResponse();
(wie auch die letzten paar Poster in diesem Twitter-Entwickler-Thread).
Gibt es eine Möglichkeit, schnell zu überprüfen, dass meine verschiedenen Token, Schlüssel und Geheimnisse gültig sind und sollte die Daten, die ich suche, zurückgeben?
Der Grund, warum dies funktioniert, ist, weil (wie ich begann zu verdächtigen) Sie den Aufruf "diese Anwendungsinstanz autorisieren" (aus Mangel an einem besseren Begriff) machen müssen, bevor Sie den eigentlichen "get timeline" -Aufruf machen. – ChrisF
Nice one. Ich habe deine Frage markiert. – hutchonoid