iPhoneアプリからTwitpicに画像をアップロードする方法

Twitterに画像をポストする事が出来るTwitpicというサービスがあるが、このTwitpicにiPhoneアプリから画像をアップロードする方法を以下に記載する。

まずTwitpicのAPIドキュメントを見ると、画像のアップロードはHTTPのPOSTを利用して出来ることが分かる。そこで、以前に紹介したCFNetwork APIのラッパーフレームワークASIHTTPRequestに、ASIFormDataRequestという便利なクラスがあるので、これを利用した方法を紹介したいと思う。


[事前準備]
1. ASIFormDataRequestクラスを使えるようにする
以下の記事内の[設定]に従いXCodeのプロジェクトを設定する。

2. XPathQueryを使えるようにする
TwitpicのAPIはレスポンスがXML形式のデータとなるため、今回はXMLをパースするためのライブラリXPathQueryを利用する。そこで、以下の記事内の[設定]に従いXCodeのプロジェクトを設定する。

以上で準備は終了である。


[実装方法]
今回はiPhoneアプリ内にバンドルした画像(test.jpg)をTwitpicにアップロードする方法を示す。具体的な実装は以下のような形になる。

#import "ASIFormDataRequest.h"
#import "XPathQuery.h"

- (void)uploadPhoto {
    NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/upload"];
    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
    NSData *twitpicImage = [NSData dataWithContentsOfFile:path];
    
    // 送信メッセージに認証情報、画像データをセット
    [request setPostValue:@"tomute" forKey:@"username"];
    [request setPostValue:@"mypassword" forKey:@"password"];
    [request setData:twitpicImage forKey:@"media"];
    
    // 画像のアップロード(同期処理)
    [request start];
    
    // アップロード結果を確認
    NSData *response = [request responseData];
    NSArray *results = PerformXMLXPathQuery(response, @"/rsp/@stat");
    if ([results count] != 0) {
        NSString *stat = [[results objectAtIndex:0] objectForKey:@"nodeContent"];
        if ([stat isEqualToString:@"ok"]) {
            NSLog(@"%@", @"Succeeded in posting a photo!");
        } else {
            NSLog(@"%@", @"Failed attempt to post a photo!");
        }
    }
}


また、Twitpicに画像を送信すると同時に、Twitterにもポストする事が可能なのだが、その場合には以下のように変更する。

- (void)uploadPhoto {
    //NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/upload"];
    NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/uploadAndPost"];
    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
        (snip)
    [request setPostValue:@"tomute" forKey:@"username"];
    [request setPostValue:@"mypassword" forKey:@"password"];
    [request setData:twitpicImage forKey:@"media"];
    // 以下の行を追加してTwitterに投稿するメッセージを付加する
    [request setPostValue:@"This is a test to post an image to Twitter via TwitPic." forKey:@"message"];
        (snip)
}


[備考]
今回紹介した方法は画像のアップロードを同期処理で行うため、画像のアップロード中にアプリが固まってしまう。これを回避するためにはマルチスレッド化する必要があるのだが、その方法に関してはまた後日紹介したいと思う。

あと、投稿した画像をTwitpicでチェックしてみると、投稿元が"from api"と表示されていると思う。これを自分のアプリの名前に変更したい場合には、Twitpicのサポートチームにメールすれば良いようだ。詳しい情報は以下。

またimg.lyという写真共有サイトはTwitpicのAPIと完全互換のようなので(img.ly API Document)、上記方法がそのまま利用出来ると思われる(実際に試してはいない)。


[関連記事]