ikarosの作業場

飛行機の設計もできる系のCshaper。「なおこの記事は個人的見解であり、所属する組織の意見とは一切関係がありません」と書かざるを得なくなった悲しみを知れ

Windows Store Apps(C#)でTwitterを使う:第三回

前回はAccessToken/Secretを取得しました。では今回はAPIを使用してタイムラインを取得したりつぶやいたりしてみましょう。
手順は基本的にはRequestToken/Secret,AccessToken/Secretを取得するときと同じです。

コードを書く前に・・・
0.RestAPIとStreamingAPIってどう違うの?
RestAPIはTwitter側に何かデータを頂戴(こういうのをGETリクエストといいます)とか、データを送るからTwitter側で何か作業してね(こういうのをPOSTリクエストといいます)と請求(リクエスト)してTwitter側からタイムラインの情報を受け取ったりつぶやいたりしてもらうのを操作毎に送り付けるのが特徴です。
一方StreamAPIはそのAPIに接続していればTwitter側からイベントがあったごとに何かしらの文字列としてアプリ側に情報を送り付けてくるというAPIです。
一つのアプリにつき一つのAPIしか接続できません。
またRestAPIは時間あたりの要求回数が決められていて、その限界を超えてしまうとリクエストを送信しても403エラーが返ってきます。

二つのお寿司屋さんに例えると
RestAPI・・・回らないお寿司屋さん。板前に何か注文してお寿司を出してもらう。あまり連続して注文はできない。
StreamAPI・・・回転寿司。よくわからないけどいっぱいお寿司が流れてくる。それをどう加工するかはアプリにゆだねられている。
こんな感じでしょうか。

今日はそのうちRestAPIを使います。

まずは自分のタイムラインを取得してみましょう
1.タイムラインの取得(GET系RestAPIの使い方)
APIURLはhttps://api.twitter.com/1.1/statuses/home_timeline.json
API詳細はこちらGET statuses/home_timeline | Twitter Developers

signatureを取得するところまではAccessToken/Secretの時と一緒です。

Uri url = new Uri("https://api.twitter.com/1.1/statuses/home_timeline.json");
string normalizedUrl = APIURL;
string normalizedRequestParameters = null;

string nonce = GenerateNonce();
string timestamp = GenerateTimeStamp();

var parameters =  new SortedDictionary<string, string>();
parameters.Add("oauth_consumer_key", ConsumerToken);
parameters.Add("oauth_token", AccessToken);
parameters.Add("oauth_nonce", nonce);
parameters.Add("oauth_timestamp", timestamp);
parameters.Add("oauth_version", "1.0");
parameters.Add("oauth_signature_method", "HMAC-SHA1");

foreach (string key in parameters.Keys)
{
    normalizedRequestParameters += key + "=" + parameters[key] + "&";
}
normalizedRequestParameters = normalizedRequestParameters.Remove(normalizedRequestParameters.Length - 1);

StringBuilder signatureBase = new StringBuilder();
signatureBase.AppendFormat("{0}&", Method.ToString());
signatureBase.AppendFormat("{0}&", WebUtility.UrlEncode(normalizedUrl));
signatureBase.AppendFormat("{0}", WebUtility.UrlEncode(normalizedRequestParameters));
string SignatureBase = signatureBase.ToString();


string Key = string.Format("{0}&{1}", WebUtility.UrlEncode(ConsumerSecret), WebUtility.UrlEncode(AccessSecret));

var crypt = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
var keyBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(Key));
var cryptKey = crypt.CreateKey(keyBuffer);

var dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(SignatureBase));
var signBuffer = CryptographicEngine.Sign(cryptKey, dataBuffer);

byte[] value;
CryptographicBuffer.CopyToByteArray(signBuffer, out value);

string signature = Convert.ToBase64String(value);
signature = WebUtility.UrlEncode(signature);
//パラメーター完成!
parameters.Add("oauth_signature",signature);

前回と若干コードが違うのは前回のコードと今回のコードを書いた時期に半年ぐらいずれがあるからです。やってることは同じです。

パラメーターを完成させたらURLと認証ヘッダーを加工してリクエストを送り付けます

string posturl = "https://api.twitter.com/1.1/statuses/home_timeline.json?";

string authorizationHeaderParams = null;

foreach (string key in parameters.Keys)
{
    posturl += key + "=" + parameters[key] + "&";
    authorizationHeaderParams += key + "=\"" + parameters[key] + "\", ";
}
posturl = posturl.Remove(posturl.Length - 1);
authorizationHeaderParams = authorizationHeaderParams.Remove(authorizationHeaderParams.Length - 2);

var request = new HttpRequestMessage();

var client = new HttpClient();
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(posturl);
request.Headers.Authorization = new AuthenticationHeaderValue("OAuth", authorizationHeaderParams);

var response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();

やってることはあんまりRequestToken/Secret取得と本当に変わり映えありません。変わったことといえばAccessToken/Secretの処理が入ったぐらい
さてさて、ここまで無事に行くとresultにはこんな文字列が入っているはずです。

[
  {
    "coordinates": null,
    "truncated": false,
    "created_at": "Tue Aug 28 21:16:23 +0000 2012",
    "favorited": false,
    "id_str": "240558470661799936",
    "in_reply_to_user_id_str": null,
    "entities": {
      "urls": [
 
      ],
      "hashtags": [
 
      ],
      "user_mentions": [
 
      ]
    },
    "text": "just another test",
    "contributors": null,
    "id": 240558470661799936,
    "retweet_count": 0,
    "in_reply_to_status_id_str": null,
    "geo": null,
    "retweeted": false,
    "in_reply_to_user_id": null,
    "place": null,
    "source": "<a href="//realitytechnicians.com\"" rel="\"nofollow\"">OAuth Dancer Reborn</a>",
    "user": {
      "name": "OAuth Dancer",
      "profile_sidebar_fill_color": "DDEEF6",
      "profile_background_tile": true,
      "profile_sidebar_border_color": "C0DEED",
      "profile_image_url": "http://a0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg",
      "created_at": "Wed Mar 03 19:37:35 +0000 2010",
      "location": "San Francisco, CA",
      "follow_request_sent": false,
      "id_str": "119476949",
      "is_translator": false,
      "profile_link_color": "0084B4",
      "entities": {
        "url": {
          "urls": [
            {
              "expanded_url": null,
              "url": "http://bit.ly/oauth-dancer",
              "indices": [
                0,
                26
              ],
              "display_url": null
            }
          ]
        },
        "description": null
      },
      "default_profile": false,
      "url": "http://bit.ly/oauth-dancer",
      "contributors_enabled": false,
      "favourites_count": 7,
      "utc_offset": null,
      "profile_image_url_https": "https://si0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg",
      "id": 119476949,
      "listed_count": 1,
      "profile_use_background_image": true,
      "profile_text_color": "333333",
      "followers_count": 28,
      "lang": "en",
      "protected": false,
      "geo_enabled": true,
      "notifications": false,
      "description": "",
      "profile_background_color": "C0DEED",
      "verified": false,
      "time_zone": null,
      "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/80151733/oauth-dance.png",
      "statuses_count": 166,
      "profile_background_image_url": "http://a0.twimg.com/profile_background_images/80151733/oauth-dance.png",
      "default_profile_image": false,
      "friends_count": 14,
      "following": false,
      "show_all_inline_media": false,
      "screen_name": "oauth_dancer"
    },
    "in_reply_to_screen_name": null,
    "in_reply_to_status_id": null
  }
  {
  (中略)
  }
]

GET statuses/home_timeline | Twitter Developersの例より1ツイートのみ抜粋

これがタイムラインにを表す中身です。JSON形式で書かれています。あとはこのデータを煮るなり焼くなりすればいいというわけです。
TweetJSON形式の詳しい中身はこちらTweets | Twitter Developers
加工については次回暇があれば一例でも載せようかなと思います。

2.つぶやく(POST系RestAPIの使い方)
APIURLはhttps://api.twitter.com/1.1/statuses/update.json
API詳細はこちらPOST statuses/update | Twitter Developers

基本的にRestAPIと変わり映えがないです
ヘッダーにパラメーター名"status",値につぶやきたい文字列を追加しそれをリクエストのコンテントにいれるだけの簡単なお仕事

あとは先ほどのGET系RestAPIと同じコードで動きます

なお返ってくるデータはタイムラインを読み込むときと同じ形式(Tweets)で返ってきます

その他RestAPIについてはこちらのほうに一覧がありますのでそちらをご覧くださいdx.24-7.co.jp


文字数制限が来そうなので今日はここまで。
次回は加工とかパラメーターの扱いについてお話しするのかなぁと思います。

当サイトのソースコード及びその他の情報は個人・商用問わず自由に使っていただいてかかまいませんが、当サイトの情報が元で発生したいかなる結果・不利益については責任を負いかねますのでご了承ください