2014-09-06 2 views
0

я реализовал аутентификацию OAuth и хотел искать твиты, используя следующий код:Как искать твиты?

private void searchTweetsWithQuery(string query) 
     { 
      var oauth_token = xxx; 
      var oauth_token_secret = xxx; 
      var oauth_consumer_key = this.context.ConsumerKey; 
      var oauth_consumer_secret = this.context.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/statuses/user_timeline.json"; 
      var resource_url = "https://api.twitter.com/1.1/search/tweets.json"; 
      var screen_name = "nikogamulin"; 
      // 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}"; 

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



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

При попытке запуска кода я получаю исключение в request.GetResponse():

The remote server returned an error: (401) Unauthorized. 

Я пытался использовать тот же код для получения статусов пользователей («https://api.twitter.com/1.1/statuses/user_timeline.json»), и он работал нормально. Кто-нибудь знает, что вызывает исключение?

редактировать

Я попытался запустить следующую команду завиток, и он также работал хорошо:

curl --get 'https://api.twitter.com/1.1/search/tweets.json' --data 'q=ENGAGE' --header 'Authorization: OAuth oauth_consumer_key="xxx", oauth_nonce="xxx", oauth_signature="xxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="xxx", oauth_token="xxx", oauth_version="1.0"' --verbose 

Я попытался сделать эквивалентный объект WebRequest, но не удалось запустить его успешно. Если возможно, я также был бы признателен, если бы кто-нибудь мог показать, как сделать объект WebRequest, который делает тот же запрос, что и команда curl выше.

Спасибо!

+0

Meybe эта ссылка может помочь http://stackoverflow.com/questions/18803532/need-help-about-search-and-streaming-api- из-твиттер –

ответ

0

Решает проблему. Оказывается, важна последовательность параметров в базовой строке. Это то же самое с другими запросами GET API-интерфейса Twitter.

Это пример правильной базовой строки:

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

, тогда как следующие возвращает 401 Неавторизованными:

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

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

Ниже приводится полный рабочий метод, который возвращает результаты поиска:

private void searchTweetsWithQuery(string query) 
     { 
      var oauth_token = xxx; 
      var oauth_token_secret = xxx; 
      var oauth_consumer_key = xxx; 
      var oauth_consumer_secret = xxx; 

      // 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"; 
      //working example: https://dev.twitter.com/discussions/12758 
      var resource_url = "https://api.twitter.com/1.1/search/tweets.json"; 
      var screen_name = "ENGAGEinterreg"; 
      // 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}&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(); 
     } 
Смежные вопросы