1

我从上一篇文章中获得了一些 Twitter 流 API 的代码。我根据该帖子中接受的答案添加了一些代码片段。但是,当我尝试将其转换为流 api 时,我仍然得到 401:“ https://stream.twitter.com/1/statuses/filter.json ”。我将不胜感激。请参见下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Security.Cryptography;
using System.IO;

public class TwitterTest
{
public void Authenticate()
{
    // oauth application keys
    var oauth_consumer_key = " ";
    var oauth_consumer_secret = " ";
    var oauth_token = "   ";
    var oauth_token_secret = " ";

    // 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 resource_url = "https://stream.twitter.com/1/statuses/filter.json?track=obama&include_entities=1&language=en";
    //var resource_url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
    var resource_url = "https://stream.twitter.com/1.1/statuses/filter.json";
    //var screen_name = "femitfash";
    // create oauth signature

    var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
               "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&track={6}";
    var baseString = string.Format(baseFormat,
                                        oauth_consumer_key,
                                        oauth_nonce,
                                        oauth_signature_method,
                                        oauth_timestamp,
                                        oauth_token,
                                        oauth_version,
                                        Uri.EscapeDataString("twitter")
                                        );

    baseString = string.Concat("POST&", Uri.EscapeDataString(resource_url), "&", 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)));
    }

    // create the request header
    var headerFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", " +
    "oauth_timestamp=\"{4}\", oauth_token=\"{5}\", oauth_version=\"{6}\"";



    var authHeader = string.Format(headerFormat,
    Uri.EscapeDataString(oauth_consumer_key),
    Uri.EscapeDataString(oauth_nonce),
    Uri.EscapeDataString(oauth_signature),
    Uri.EscapeDataString(oauth_signature_method),
    Uri.EscapeDataString(oauth_timestamp),
    Uri.EscapeDataString(oauth_token),
    Uri.EscapeDataString(oauth_version)
    );


    // make the request

    ServicePointManager.Expect100Continue = false;

    var postBody = "track=obama"; // "screen_name=" + Uri.EscapeDataString(screen_name);//
    resource_url += "?" + postBody;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
    request.Headers.Add("Authorization", authHeader);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.PreAuthenticate = true;
    request.AllowWriteStreamBuffering = true;

    WebResponse response = request.GetResponse();
    string responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();
}

}

4

0 回答 0