前回 は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を取得
- Permissionsを
- NuGetパッケージのインストール
- DotNetOpenAuth OAuth 1.0(a) Consumer (by Andrew Amott)
- DynamicJson (by neuecc)
前回との差分
Twitter APIの POST statuses/update
を使う場合、DesktopConsumer.PrepareAuthorizedRequestAndSend()
メソッドではツイートする内容を設定できず、DesktopConsumer.PrepareAuthorizedRequest()
メソッドを使いました。
そのため、
- PrepareAuthorizedRequestでリクエストを作成
GetResponse()
で、リクエストの送信とレスポンスを取得GetResponseStream()
でストリームを取得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に現在時刻をポスト後にタイムラインを取得してみましたが、問題なく動作していました。
実行前
実行後
実行後のコンソール
ソースコード
ソースコード全体はGistに上げました。
Twitter Single-user Auth sample: Using DotNetOpenAuth and DynamicJson
参考
Twitter API のドキュメント
Twitter API へのポスト
ほとんどこのままです...。GitHubにもコードがあるので、全体が分かりやすかったです。