C# + DotNetOpenAuthで、Twitter API のSingle-user Auth認証・ツイートを行い、その後にタイムラインのJSONを取得する

前回 はDotNetOpenAuthでタイムラインの取得を行いました。

そのため、今回はツイート&ツイート後のタイムラインの取得を試してみます。

 

環境

  • Windows7
  • NET Framework 4.5
  • DotNetOpenAuth OAuth 1.0(a) Consumer 4.3.4
  • DynamicJson 1.2.0.0

 

流れ

事前準備

以下の準備をしておきます。Permissions以外は、前回同様です。

  • Twitterへアプリを登録
    • Permissionsを Read and write へと変更
    • AccessTokenやAccessSecretを取得
  • NuGetパッケージのインストール
    • DotNetOpenAuth OAuth 1.0(a) Consumer (by Andrew Amott)
    • DynamicJson (by neuecc)

 

前回との差分

Twitter APIPOST statuses/update を使う場合、DesktopConsumer.PrepareAuthorizedRequestAndSend() メソッドではツイートする内容を設定できず、DesktopConsumer.PrepareAuthorizedRequest() メソッドを使いました。

 
そのため、

  1. PrepareAuthorizedRequestでリクエストを作成
  2. GetResponse()で、リクエストの送信とレスポンスを取得
  3. GetResponseStream()でストリームを取得
  4. StreamReaderでストリームを読み込む

という流れになり、手間が増えています。 また、それに合わせて、TwitterConsumerクラスに手を入れています。

 

TwitterConsumerクラス(上記1.部分)
public class TwitterConsumer
{
    public DesktopConsumer Consumer { get; private set; }


    public TwitterConsumer()
    {
        var serviceProviderDescription = new ServiceProviderDescription
        {
            UserAuthorizationEndpoint = new MessageReceivingEndpoint("https://api.twitter.com/oauth/authorize", HttpDeliveryMethods.GetRequest),
            TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
            ProtocolVersion = ProtocolVersion.V10a,
        };

        var tokenManager = new TwitterTokenManager(ApiKey, ApiSecret, new Dictionary<string, string>() { { AccessToken, AccessSecret } });
        Consumer = new DesktopConsumer(serviceProviderDescription, tokenManager);
    }


    public System.Net.WebRequest Post(MessageReceivingEndpoint endpoint, IEnumerable<MultipartPostPart> messages)
    {
        //  PrepareAuthorizedRequestAndSend()メソッドではPOSTのメッセージを送信できなかったことから、
        //  PrepareAuthorizedRequest()メソッドを使っている
        return Consumer.PrepareAuthorizedRequest(endpoint, AccessToken, messages);
    }
}

 

Programクラスの抜粋(上記2.~4.部分)
var consumer = new TwitterConsumer();


//  Twitter API: POST statuses/update の利用
var postEndpoint = new MessageReceivingEndpoint("https://api.twitter.com/1.1/statuses/update.json",
                                            HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
var messages = new[] { DotNetOpenAuth.Messaging.MultipartPostPart.CreateFormPart("status", "テスト:" + DateTime.Now.ToString("O")) };
var postRequest = consumer.Post(postEndpoint, messages);


using (var r = postRequest.GetResponse())
using (var rs = r.GetResponseStream())
using (var sr = new System.IO.StreamReader(rs))
{
    var json = DynamicJson.Parse(sr.ReadToEnd());
    Console.WriteLine(json.text);
}

 

実行結果

Twitterに現在時刻をポスト後にタイムラインを取得してみましたが、問題なく動作していました。

 

実行前

f:id:thinkAmi:20140724051249p:plain

 

実行後

f:id:thinkAmi:20140724051305p:plain

 

実行後のコンソール

f:id:thinkAmi:20140724051318p:plain

 

ソースコード

ソースコード全体はGistに上げました。
Twitter Single-user Auth sample: Using DotNetOpenAuth and DynamicJson

 

参考

Twitter API のドキュメント

 

Twitter API へのポスト

ほとんどこのままです...。GitHubにもコードがあるので、全体が分かりやすかったです。

 

その他