Need help about Search and Streaming Api of Twitter

≯℡__Kan透↙ 提交于 2019-12-25 06:46:44

问题


I'm a newbie in C# and asp.net. I'm trying to create a simple web(run on localhost) which use streaming and search API of Twitter.

I've tried some query like: "https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=2&since_id=14927799" but it got some error about "Bad Authentication data".

May be I don't know how to get Authentication. So could anyone help me? THanks a lots.


回答1:


What you have shown is not the search functionality, rather is the stream functionality. Here is a complete example of working twitter stream search

private void SearchTweetsWithQuery(string query)
{
    var oauth_token = System.Configuration.ConfigurationManager.AppSettings["accessToken"];
    var oauth_token_secret = System.Configuration.ConfigurationManager.AppSettings["accessTokenSecret"];
    var oauth_consumer_key = System.Configuration.ConfigurationManager.AppSettings["consumerKey"];
    var oauth_consumer_secret = System.Configuration.ConfigurationManager.AppSettings["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();

    // message api details
    var status = "Updating status via REST API if this works";
    var resource_url = "https://api.twitter.com/1.1/search/tweets.json";
    var screen_name = "TODO : UPDATE THIS OR LEAVE BLANK";

    var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                    "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&q={6}";

    var baseString = string.Format(baseFormat,
                                oauth_consumer_key,
                                oauth_nonce,
                                oauth_signature_method,
                                oauth_timestamp,
                                oauth_token,
                                oauth_version,
                                query
                                );

    baseString = string.Concat("GET&", 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=\"{3}\", oauth_nonce=\"{0}\", oauth_signature=\"{5}\", oauth_signature_method=\"{1}\", " +
                       "oauth_timestamp=\"{2}\",  " +
                       "oauth_token=\"{4}\", " +
                       "oauth_version=\"{6}\"";

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

    // make the request

    ServicePointManager.Expect100Continue = false;

    var postBody = "screen_name=" + Uri.EscapeDataString(screen_name);
    resource_url += "?q=" + query;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
    request.Headers.Add("Authorization", authHeader);
    request.Method = "GET";
    request.ContentType = "application/x-www-form-urlencoded";

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



回答2:


First you should create an application. https://dev.twitter.com/apps . Then you can use Twitterizer's WebRequestBuilder class to form your request. ( http://svn.twitterizer.net/twitterizer/trunk/Twitterizer2/OAuth/ )

var tokens = new Twitterizer.OAuthTokens
{
    ConsumerKey = "....",
    ConsumerSecret = "....",
    AccessToken = "....",
    AccessTokenSecret = "......"
};

string url = "https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=2&since_id=14927799";

var builder = new Twitterizer.WebRequestBuilder(new Uri(url), Twitterizer.HTTPVerb.GET, tokens);
var req = builder.PrepareRequest();

var resp = req.GetResponse();
var json = new StreamReader(resp.GetResponseStream()).ReadToEnd();
resp.Close();


来源:https://stackoverflow.com/questions/18803532/need-help-about-search-and-streaming-api-of-twitter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!