忍者ブログ
プログラミングとか日常とかの覚書っぽいなにか
[28] [27] [26] [25] [24] [23] [22] [21] [20] [19] [18]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

iPhone用Twitterクライアント作成の真っ最中です。
今回はツイート投稿の方法を解説します。


(2011/07/26)
なぜか記事中のソースの fetchPostTweet: の中で、署名を付ける処理を忘れるという大ポカをやらかしてました・・・これで投稿できるはずがありませんね。修正しました。


(2012/06/19)
iOS5/ARC対応版の記事を書きましたので、そちらを参照してください。この記事の内容は古いです。


REST (Representational State Transfer) とTwitter API

RESTはWebアプリケーションに代表される分散ネットワークアプリケーションにおいて、主にHTTPを使用してネットワーク上のリソース(情報)にアクセスするソフトウェアアーキテクチャの1つ、またはそこで使われるインタフェース(API)の方式のことです。

といっても抽象的すぎてあいまいなので、Twitterの場合を例に取ってみましょう。

Twitter APIでは、以下のようないろいろな情報が「リソース」として管理されています。
  • 個別のツイート(Twitter APIではステータス(status)と呼ばれる)
  • 特定のツイートの集合であるタイムライン(timeline)
  • ユーザ情報(users)
  • フレンド情報(friendships)
  • お気に入り情報(favorites)

これらの情報は「URI」と呼ばれる識別子によって識別されます。
URLとほぼ同じようなものですが、URLが場所の識別子なのに対し、URIはさらに一般化されたリソースの識別子のことを示します。ただし、よく知られている「URL」や、「URLエンドポイント」という呼び方をすることも多いです。

Twitterでリソースにアクセスする(例えばツイートを投稿したり、タイムラインを取得したりする)には、アクセス対象リソースのURIに対してHTTPでアクセスをすることになります。

HTTPではアクセスの種類によって「GET」「POST」「PUT」「DELETE」というメソッド(操作)が定義されており、情報を取得する場合は「GET」を使用し、新しく作成する場合は「POST」を使用する、というようにメソッドを使い分ける必要があります。

例えばTwitter APIで自分のホームタイムラインを取得する場合には、

http://api.twitter.com/1/statuses/home_timeline.json

というURIに対して、HTTPの「GET」メソッドを使用してアクセスすることで、タイムライン情報を取得することができます。

いくつかのAPIではオプションパラメータを指定することができるようになっています。
HTTP GETにおいてパラメータを指定する場合、URIの後ろに「?」記号で区切って「パラメータ名=値」で指定します。パラメータが複数ある場合はそれぞれを「&」記号で区切ります。

URL?パラメータ1=値1&パラメータ2=値2&...

例えば、ホームタイムラインで先頭から最大10件の最新ツイートのみを取得したい場合には

http://api.twitter.com/1/statuses/home_timeline.json?count=10

というURIを使用することになります。


Twitter APIでは、上記のようなURI指定ではJSON形式の結果をHTTP応答として受け取りますが、「.json」の部分を「.xml」に変更することで、結果をXML形式で受け取ることもできます。

実際には、ここで指定したパラメータとは別にOAuth署名情報がパラメータとして追加されていなければなりません。ただし、以前にも説明した通り、その作業はGTMOAuthAuthenticationが行ってくれるので、私達は特に気にすることはないのですが。

一方、新しいツイートをポストする場合には、

http://api.twitter.com/1/statuses/update.json

というURIに対してHTTPの「POST」メソッドを使うことになります。

HTTP POSTの場合は新しい情報を渡す必要があるので必ずパラメータを指定することになりますが、GETメソッドの場合と異なり、GET以外のメソッド(POST, PUT, DELETE)ではパラメータをHTTP要求のBody部に含める必要があります。Body部に含めるデータはGETパラメータの場合と同じように

パラメータ=値

の形式です。複数ある場合は

パラメータ1=値1&パラメータ2=値2&...

とします。

このデータ形式は「application/x-www-form-urlencoded」と呼ばれるもので、この形式データを送るため、HTTP要求ヘッダに「Content-Type: application/x-www-form-urlencoded」が含まれるようにしなければいけません。これには NSMutableURLRequest オブジェクトの setValue:forHTTPHeaderField: メソッドを使うことになります。

また、パラメータの値に「=」記号や「&」記号が含まれていたとしたらデータが間違って解釈されてしまうであろうことは容易に想像がつくと思います。
そこで、パラメータとして渡される値を「URI符号化」と呼ばれる表現方法に変換して記述します。「URL符号化」「URLエンコード」などと呼ばれる場合もあります。

先ほどは説明を省きましたがGETメソッドのパラメータの値についても同様にURI符号化されている必要があります。

本来はパラメータの値だけでなく、パラメータ名についてもURI符号化の対象ですが、Twitter APIで使用されているパラメータ名は半角英数字とアンダースコアのみから成り、URI符号化を行っても元の名前と同じ文字列になるので、ここではあえてパラメータ名を符号化する必要はありません。また、パラメータの値についても、半角英数字でのみ構成される場合には、あえてURI符号化を行う必要はありません。

URI符号化を行う方法については、 GTMOAuthAuthentication クラスに encodedOAuthParameterForString: というクラスメソッドが用意されているので、ここではそれを使用することにします。


ツイートの投稿

ツイート投稿を行うAPIは「POST statuses/update」で、上でも書いたように

http://api.twitter.com/1/statuses/update.json

というURIに対してHTTP POSTメソッドを使用します。

ツイート本文をパラメータ名「status」のパラメータ値としてHTTP要求のBody部に渡すことになります。
これには、NSMutableURLRequest オブジェクトの setHTTPBody: メソッドを使いますが、Bodyデータを NSData 型で準備する必要があるので、パラメータ情報「status=XXXX」(XXXXはURI符号化した本文)の文字列(NSString)を作成し、その文字列の dataUsingEncoding: メソッドを使用して NSData を作成し、これを渡すことにします。

// ツイート投稿要求
- (void)fetchPostTweet:(NSString *)text
{
    // 要求を準備
    NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    // statusパラメータをエンコードしてbodyにセット
    NSString *encodedText = [GTMOAuthAuthentication encodedOAuthParameterForString:text];
    NSString *body = [NSString stringWithFormat:@"status=%@", encodedText];
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];

    // 要求に署名情報を付加
    [auth_ authorizeRequest:request];

    // 接続開始
    GTMHTTPFetcher *fetcher = [GTMHTTPFetcher fetcherWithRequest:request];
    [fetcher beginFetchWithDelegate:self
                  didFinishSelector:@selector(postTweetFetcher:finishedWithData:error:)];
}

// ツイート投稿要求に対する応答
- (void)postTweetFetcher:(GTMHTTPFetcher *)fetcher finishedWithData:(NSData *)data error:(NSError *)error
{
    if (error != nil) {
        // ツイート投稿取得エラー
        NSLog(@"Fetching statuses/update error: %d", error.code);
        return;
    }

    // タイムライン更新
    [self fetchGetHomeTimeline];
}


実際にはツイート入力画面を別に準備する必要がありますが、今回は省略します。


参考リンク

Twitter developers - REST API Resources (英語)
https://dev.twitter.com/docs/api

Twitter API 仕様書 日本語訳
http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt

拍手

PR

コメント
無題
ぱーっぱぱっぱぱっぱいのぱいぱいぱっぱぱーいぱーいぱぱーいぱいぱぱぱいぱいぱいぱぱいぱいぱぱーいぱいーぱいーぱぱーいぱいーぱぱぱぱいぱいほーむぱいーー


しおらーめんたべたい
【2011/08/10 03:32】 NAME[TIKA] WEBLINK[] EDIT[]


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


忍者ブログ [PR]
プロフィール
HN:
はむぱい
職業:
ソフト作ったりしてる人
Twitter
最新CM
[06/09 replica rolex oyster perpetual datejust]
[06/09 bracelets imitation cartier love]
[06/09 replica the oyster perpetual datejust]
[06/09 datejust rolex oyster perpetual]
[06/09 replica gold love bangle]
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
ブログ内検索
あ~いい漢字