C# 使用 Twitter API 1.1 oAuth 验证和请求用户的时间线

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17067996/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 08:30:32  来源:igfitidea点击:

Authenticate and request a user's timeline with Twitter API 1.1 oAuth

c#asp.nettwitterwebclienttwitter-oauth

提问by hutchonoid

This morning I have received the dreaded 'The Twitter REST API v1 is no longer active. Please migrate to API v1.1.' error in a few of my web sites.

今天早上我收到了可怕的“Twitter REST API v1 不再处于活动状态”的消息。请迁移到 API v1.1。我的一些网站出现错误。

Previously I have been using javascript/json to make these calls to http://api.twitter.com/1/statuses/user_timeline.json? to display a timeline.

以前我一直在使用 javascript/json 对http://api.twitter.com/1/statuses/user_timeline.json进行这些调用?以显示时间线。

As this is no longer available I need to adopt the new 1.1 API process.

由于这不再可用,我需要采用新的 1.1 API 流程。

I need to do the following using HttpWebRequest objects not a 3rd party application:

我需要使用 HttpWebRequest 对象而不是第 3 方应用程序执行以下操作:

  1. Authenticate using oauth key and secret
  2. Make an authenticated call to pull back to display users timeline
  1. 使用 oauth 密钥和秘密进行身份验证
  2. 进行经过身份验证的调用以撤回以显示用户时间线

采纳答案by hutchonoid

Here is what I did to get this working in a simple example.

这是我在一个简单的示例中为使其工作所做的工作。

I had to generate an oAuth consumer key and secret from Twitter at:

我必须从 Twitter 生成一个 oAuth 消费者密钥和秘密:

https://dev.twitter.com/apps/new

https://dev.twitter.com/apps/new

I deserialized the authentication object first to get the token and type back in order to authenticate the timeline call.

我首先反序列化身份验证对象以获取令牌并返回类型,以便对时间线调用进行身份验证。

The timeline call simply reads the json as that is all I need to do, you may want to deserialize it yourself into an object.

时间线调用只是读取 json,因为这就是我需要做的,您可能希望自己将其反序列化为一个对象。

I have created a project for this at : https://github.com/andyhutch77/oAuthTwitterWrapper

我为此创建了一个项目:https: //github.com/andyhutch77/oAuthTwitterWrapper

Update- I have updated the github project to include both asp .net web app & mvc app example demos and nuget install.

更新- 我已更新 github 项目以包含 asp .net web 应用程序和 mvc 应用程序示例演示和 nuget 安装。

// You need to set your own keys and screen name
var oAuthConsumerKey = "superSecretKey";
var oAuthConsumerSecret = "superSecretSecret";
var oAuthUrl = "https://api.twitter.com/oauth2/token";
var screenname = "aScreenName";

// Do the Authenticate
var authHeaderFormat = "Basic {0}";

var authHeader = string.Format(authHeaderFormat,
    Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" +
    Uri.EscapeDataString((oAuthConsumerSecret)))
));

var postBody = "grant_type=client_credentials";

HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(oAuthUrl);
authRequest.Headers.Add("Authorization", authHeader);
authRequest.Method = "POST";
authRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
authRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

using (Stream stream = authRequest.GetRequestStream())
{
    byte[] content = ASCIIEncoding.ASCII.GetBytes(postBody);
    stream.Write(content, 0, content.Length);
}

authRequest.Headers.Add("Accept-Encoding", "gzip");

WebResponse authResponse = authRequest.GetResponse();
// deserialize into an object
TwitAuthenticateResponse twitAuthResponse;
using (authResponse)
{
    using (var reader = new StreamReader(authResponse.GetResponseStream())) {
        JavaScriptSerializer js = new JavaScriptSerializer();
        var objectText = reader.ReadToEnd();
        twitAuthResponse = JsonConvert.DeserializeObject<TwitAuthenticateResponse>(objectText);
    }
}

// Do the timeline
var timelineFormat = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&include_rts=1&exclude_replies=1&count=5";
var timelineUrl = string.Format(timelineFormat, screenname);
HttpWebRequest timeLineRequest = (HttpWebRequest)WebRequest.Create(timelineUrl);
var timelineHeaderFormat = "{0} {1}";
timeLineRequest.Headers.Add("Authorization", string.Format(timelineHeaderFormat, twitAuthResponse.token_type, twitAuthResponse.access_token));
timeLineRequest.Method = "Get";
WebResponse timeLineResponse = timeLineRequest.GetResponse();
var timeLineJson = string.Empty;
using (timeLineResponse)
{
    using (var reader = new StreamReader(timeLineResponse.GetResponseStream()))
    {
         timeLineJson = reader.ReadToEnd();
    }
}


public class TwitAuthenticateResponse {
    public string token_type { get; set; }
    public string access_token { get; set; }
}

回答by Jason

Created a JS only solution to get Twitter posts on your site without using new API - can now specify number of tweets too: http://goo.gl/JinwJ

创建了一个仅限 JS 的解决方案,无需使用新 API 即可在您的网站上获取 Twitter 帖子 - 现在也可以指定推文数量:http: //goo.gl/JinwJ