Subscribed unsubscribe Subscribe Subscribe

Objective-C向けOAuthライブラリ"OAuthCore"を使ってTwitter APIを叩いてみる

Twitter Objective-C iPhone

Sabotter for iPhoneのアップデートに向けてTwitterOAuth認証の部分の実装をどうするか検討していて。
Google Code Archive - Long-term storage for Google Code Project Hosting.にあるライブラリだとなんだか巨大すぎて、もっと軽く扱えるもの無いのかなーとhttp://dev.twitter.com/pages/oauth_libraries#objectivecをみてたらこんなのがあるらしい。
atebits / OAuthCore — Bitbucket
たったの6ファイル! これだけでOAuthのための基本的なことはできるようだ。試しにxAuthでtokenを取得してそれを使ってTweetする、というのを書いてみた。簡単にするため非同期じゃなくHTTPリクエスト処理してます

#import "Hoge.h"
#import "OAuthCore.h"
#import "OAuth+Additions.h"

#define CONSUMER_KEY        @"***************************"
#define CONSUMER_KEY_SECRET @"***************************"

@implementation Hoge

+ (void)authenticateAndTweet:(NSString *)status username:(NSString *)username password:(NSString *)password {
    // xAuth
    NSData *xauth_response = [Hoge request:[NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]
                                    method:@"POST"
                                      body:[[NSString stringWithFormat:@"x_auth_username=%@&x_auth_password=%@&x_auth_mode=client_auth", username, password] dataUsingEncoding:NSUTF8StringEncoding]
                               oauth_token:@""
                        oauth_token_secret:@""];
    NSDictionary *dict = [NSURL ab_parseURLQueryString:[[[NSString alloc] initWithData:xauth_response encoding:NSUTF8StringEncoding] autorelease]];
    NSString *oauth_token        = [dict objectForKey:@"oauth_token"];
    NSString *oauth_token_secret = [dict objectForKey:@"oauth_token_secret"];
    // xAuthで得たtokenを利用してTweet
    NSData *tweet_response = [Hoge request:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"]
                                    method:@"POST"
                                      body:[[NSString stringWithFormat:@"status=%@", status] dataUsingEncoding:NSUTF8StringEncoding]
                               oauth_token:oauth_token
                        oauth_token_secret:oauth_token_secret];
    NSLog(@"response: %@", [[[NSString alloc] initWithData:tweet_response encoding:NSUTF8StringEncoding] autorelease]);
}

+ (NSData *)request:(NSURL *)url method:(NSString *)method body:(NSData *)body oauth_token:(NSString *)oauth_token oauth_token_secret:(NSString *)oauth_token_secret {
    NSString *header = OAuthorizationHeader(url, method, body, CONSUMER_KEY, CONSUMER_KEY_SECRET, oauth_token, oauth_token_secret);
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:method];
    [request setValue:header forHTTPHeaderField:@"Authorization"];
    [request setHTTPBody:body];
    NSURLResponse *response = nil;
    NSError       *error    = nil;
    return [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
}

@end

ちゃんとTweetできた!(もちろんxAuthはメールで申請済み)
うーん、これはお手軽でいいなぁ。