2016-02-13 63 views
0

我想使用下面的代码,但由于某种原因,我得到一个无效或过期的令牌,它似乎一次工作,但从来没有再次。Twitter API无效或过期令牌

任何想法? (consumerKey和consumerSecret是在类生成的常量。)

public ActionResult Index() 
    { 
     string twitterAccount = System.Configuration.ConfigurationManager.AppSettings["twitterAccount"]; 
     JsonDeserializer jsonDeserializer = new JsonDeserializer(); 
     var model = new TwitterVM.LandingModel(); 

     var qs = GetToken(); 
     string oauthToken = qs["oauth_token"]; 
     string oauthTokenSecret = qs["oauth_token_secret"]; 

     RestClient client = new RestClient("https://api.twitter.com/1.1") 
     { 
      Authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey, consumerSecret, oauthToken, oauthTokenSecret) 
     }; 
     RestRequest request = new RestRequest("statuses/user_timeline", Method.GET); 

     request.Parameters.Add(new Parameter() 
     { 
      Name = "screen_name", 
      Value = twitterAccount, 
      Type = ParameterType.GetOrPost 
     }); 

     request.Parameters.Add(new Parameter() 
     { 
      Name = "count", 
      Value = 10, 
      Type = ParameterType.GetOrPost 
     }); 

     request.Parameters.Add(new Parameter() 
     { 
      Name = "include_rts", 
      Value = true, 
      Type = ParameterType.GetOrPost 
     }); 

     request.Parameters.Add(new Parameter() 
     { 
      Name = "include_entities", 
      Value = true, 
      Type = ParameterType.GetOrPost 
     }); 

     IRestResponse response = client.Execute(request); 

     model.Tweets = 
      jsonDeserializer.Deserialize<List<TwitterVM.Tweet>>(response); 

     return View(model); 
    } 


    private NameValueCollection GetToken() 
    { 
     RestClient client = new RestClient("https://api.twitter.com") { Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) }; 
     //Do the auth shit... 
     RestRequest request = new RestRequest("oauth/request_token", Method.POST); 
     IRestResponse response = client.Execute(request); 

     return HttpUtility.ParseQueryString(response.Content); 
    } 
+0

我使用* oauth2 * api和* HttpClient *(没有RestSharp)..我可以发布一个示例代码,如果你有兴趣.. – Eser

+0

是的请,如果你可以那将是很棒 – Zhorian

+0

行..我作为回答张贴..... – Eser

回答

1

使用Twitter的API的OAuth2(https://api.twitter.com/oauth2/token

https://dev.twitter.com/oauth/application-only的细节....

var client = await CreateHttpClient("....", "...."); 
//don't dispose this client and use for subsequent API calls 

var screenName = "...."; 
var count = 10; 
var include_rts = true; 
var url = $"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={screenName}&include_rts={include_rts}&count={count}"; 

var json = await client.GetStringAsync(url); 

public static async Task<HttpClient> CreateHttpClient(string consumerKey, string consumerSecret) 
{ 
    var bearerToken = Convert.ToBase64String(Encoding.UTF8.GetBytes(consumerKey + ":" + consumerSecret)); 
    string url = "https://api.twitter.com/oauth2/token"; 


    HttpClient client = new HttpClient(); 

    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Basic " + bearerToken); 

    var resp = await client.PostAsync(url, new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded")).ConfigureAwait(false); 
    resp.EnsureSuccessStatusCode(); 
    var result = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); 
    var jObj = new JavaScriptSerializer().Deserialize<Dictionary<string,string>>(result); 

    if (jObj["token_type"] != "bearer") throw new Exception("Invalid Response From Twitter/OAuth"); 

    client.DefaultRequestHeaders.Remove("Authorization"); 
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer " + jObj["access_token"]); 
    return client; 
} 
+0

我的应用程序锁定在这一行'var resp = await client.PostAsync(url,new StringContent(“grant_type = client_credentials”,Encoding.UTF8,“application/x-www-form-urlencoded”));' – Zhorian

+0

@Zhorian我在发布前测试过它...可能是死锁案例(http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)。你可以测试它在干净的应用程序? – Eser

+0

@Zhorian BTW:我用'ConfigureAwait(false)'更新了代码' – Eser

相关问题