您确实需要一个 Twitter 帐户,并且您需要获取“消费者密钥”和“消费者秘密”。您可以通过在https://dev.twitter.com/apps创建一个应用程序来做到这一点。
这是 IHttpHandler 中的一种方法,一旦您拥有这些方法,您就可以对其进行调整。它为客户端脚本提供了与https://api.twitter.com/1/statuses/user_timeline.json端点相同的功能。它在身份验证后请求该数据的 1.1 版本,因此它仅适用于您的应用程序。
对于比获取推文更复杂的事情,应该使用适当的 OAuth 握手 - 尝试 TweetSharp 库:https ://github.com/danielcrenna/tweetsharp
下面的代码遵循https://dev.twitter.com/docs/auth/application-only-auth中描述的过程,但它没有执行此处描述的所有 SSL 检查 - https://dev.twitter.com/文档/安全/使用-ssl。
public void ProcessRequest(HttpContext context)
{
// get these from somewhere nice and secure...
var key = ConfigurationManager.AppSettings["twitterConsumerKey"];
var secret = ConfigurationManager.AppSettings["twitterConsumerSecret"];
var server = HttpContext.Current.Server;
var bearerToken = server.UrlEncode(key) + ":" + server.UrlEncode(secret);
var b64Bearer = Convert.ToBase64String(Encoding.Default.GetBytes(bearerToken));
using (var wc = new WebClient())
{
wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
wc.Headers.Add("Authorization", "Basic " + b64Bearer);
var tokenPayload = wc.UploadString("https://api.twitter.com/oauth2/token", "grant_type=client_credentials");
var rgx = new Regex("\"access_token\"\\s*:\\s*\"([^\"]*)\"");
// you can store this accessToken and just do the next bit if you want
var accessToken = rgx.Match(tokenPayload).Groups[1].Value;
wc.Headers.Clear();
wc.Headers.Add("Authorization", "Bearer " + accessToken);
const string url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=YourTwitterHandle&count=4";
// ...or you could pass through the query string and use this handler as if it was the old user_timeline.json
// but only with YOUR Twitter account
var tweets = wc.DownloadString(url);
//do something sensible for caching here:
context.Response.AppendHeader("Cache-Control", "public, s-maxage=300, max-age=300");
context.Response.AppendHeader("Last-Modified", DateTime.Now.ToString("r", DateTimeFormatInfo.InvariantInfo));
context.Response.AppendHeader("Expires", DateTime.Now.AddMinutes(5).ToString("r", DateTimeFormatInfo.InvariantInfo));
context.Response.ContentType = "text/plain";
context.Response.Write(tweets);
}
}
你可以:
- 将获取到的值存储起来,供以后使用,不需要每次都获取。
- 通过查询字符串上的参数 - 我认为 user_timeline.json 接受与 v1 版本相同的参数。
- 根据需要设置与缓存相关的 HTTP 标头 - 必须缓存此响应以避免遇到请求限制。
- 反序列化服务器上的 JSON 并用它做一些不同的事情。但如果你这样做,也许直接使用 TweetSharp。这实际上是为了向以前使用 API v1 的客户端脚本提供相同的 JSON 数据。