強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2010年05月19日

[][]TwitterのOAuth認証を使う

(2010/06/18 追記)

OAuthのみへの移行がワールドカップによる負荷を理由に8月16日からに変更されました。

moving the OAuth switch over date to august 16, 2010 - Twitter Development Talk | Google グループ

http://groups.google.com/group/twitter-development-talk/browse_thread/thread/dfb89d9f29f339a2?pli=1

段階的に移行が行われ、8月31日からはBASIC認証が完全に使えなくなる様です。

Twitterブログ: Twitter APIデベロッパー・コミュニティへのお知らせ (oAuthへの移行に関しての期限延長)

http://blog.twitter.jp/2010/06/twitter-api-oauth.html

2010年6月30日でTwitterの認証が必要なTwitter APIBASIC認証を使ってアクセスする事ができなくなります。

TwitterBASIC認証廃止、企業ユーザーが知っておくべきこと - ITmedia エンタープライズ

http://www.itmedia.co.jp/enterprise/articles/1004/28/news012.html

それ以降にTwitter APIを使うにはOAuthかxAuthに対応する必要があります。

Twitterなどを見てるとなにやらxAuthを使う人が多いのですがxAuthは承認を受けるためのメールを送るなど手間も多いみたいです。

OAuthは難しそうと印象からxAuthにする人が多いのでしょうがOAuthもライブラリを使えばそんなには難しくありません。

また、OAuthであればTwitterで利用するために必要なアプリの登録申請が即、通るので素早いリリースが可能です。

という事でちょっと解説のエントリーを書いてみました。

この記事は 2010/05/20 時点での情報を元に書いています。将来的には変更が行われる部分も有るかもしれませんので閲覧の時期によってはその点ご注意下さい。

アプリの登録申請

まずは以下のページでtwitterでのOAuth利用のための登録申請を行います。

http://twitter.com/oauth_clients

f:id:nakamura001:20100520011327p:image:w320

ほとんどの項目は改めて説明する必要の無いものが多いので注意が必要なもののみ説明します。

【アプリケーションの説明】

短過ぎるとエラーとなります。ある程度長い文章を書きましょう。

【アプリケーションの種類】

選択項目説明
クライアントプリケーション実行ファイルを起動するようなディスクトップ系のアプリのときに選択します。
ブラウザアプリブラウザで動作するアプリのとき選択します。こちらを選択した場合、ユーザによるOauth認証の承認が完了した後に表示するURLを指定する事が出来ます。

なお、今回の解説では「クライアントプリケーション」で登録している事を前提に話を進めます。

※この設定を含む全ての項目は後で変更する事も可能です。

【Default Access type】

つぶやきの投稿やデータ更新を行う場合は「Read & Write」、データの取得のみを行う場合は「Read-only」を選択します。

f:id:nakamura001:20100520011410p:image:w320

なおユーザがOAuthによるユーザデータへのアクセスを許可をした場合はユーザの「設定」-「連携アプリ」の画面に以下の様に表示されます。この画面でユーザは許可を取り消す事もできます。

f:id:nakamura001:20100520012409p:image:w320

ライブラリ

OAuthは自前でやるとかなり大変なので以下のライブラリを使用します。

bengottlieb's Twitter-OAuth-iPhone at master - GitHub

http://github.com/bengottlieb/Twitter-OAuth-iPhone

ターミナルでDLしたいディレクトリに移動し、以下のコマンドを実行して下さい(gitがインストール済みで有る必要が有ります)。

git clone http://github.com/bengottlieb/Twitter-OAuth-iPhone.git

こちらのライブラリにはサンプルが付属しており、DLしたディレクトリ内の Demo というディレクトリに入っているプロジェクトがサンプルとなります。こちらを開いて下さい。

次に「Code」グループの中のファイル OAuthTwitterDemoViewController.m の先頭の以下の2つの定数に登録完了時に表示された「Consumer key」と「Consumer secret」の文字列を設定します。

#define kOAuthConsumerKey				@""		//REPLACE ME
#define kOAuthConsumerSecret			@""		//REPLACE ME

f:id:nakamura001:20100520012211p:image:w320

このサンプルの起点となる部分は OAuthTwitterDemoViewController.m の - viewDidAppear: になります。処理を追いたい場合はここから始めると良いでしょう。

ざっくりと解説しておくと _engine がメインの処理エンジンとなります。 SA_OAuthTwitterEngine クラスを追っかけると詳細が理解できます。

続いて、 SA_OAuthTwitterController の生成と表示が行われます。 SA_OAuthTwitterController の + controllerToEnterCredentialsWithTwitterEngine:delegate: ですがこのメソッドは認証済みの場合は nil を返します。

	UIViewController			*controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

そのため、続く以下の部分でまだOAuth認証のユーザからの承認が終わってない場合は認証用の画面が表示され、既に承認が終わってる場合にはつぶやきの投稿が行わる様に処理が分岐します。

	if (controller) 
		[self presentModalViewController: controller animated: YES];
	else {
		[_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];
	}

そのためこのアプリは1回目の起動で認証を終わらせた後に再度起動すると else のブロックの方に分岐しつぶやきの投稿が行われます。この動作が嫌な人はこの部分を NSLog などに書き換えておきましょう。

つぶやきの投稿以外に実行可能なものは MGTwitterEngine.h の以下の記述以降に記載があります。

#pragma mark REST API methods

自分が試したときは「つぶやきの検索」などが上手く動作しませんでした。深くは追ってないのですがOAuthの必要が無いので実装してないのかな?と思っています。まぁOAuthを使わないものは必要なパラメータを指定してアクセスするだけで良いので自前で準備してもそんなに負担になることも無いでしょう。

ビルド

それではビルドして動作させてみましょう。もし、以下の様なエラー文が表示される場合は使用しているXcodeがプレリリース(ベータ)版でないか確認して下さい。プレリリース版ではエラーとなる様なので正式(fainal)版を使用してビルドして下さい。

Undefined symbols:
  "_OBJC_CLASS_$_OAConsumer", referenced from:
      objc-class-ref-to-OAConsumer in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OAToken", referenced from:
      objc-class-ref-to-OAToken in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OAMutableURLRequest", referenced from:
      objc-class-ref-to-OAMutableURLRequest in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OADataFetcher", referenced from:
      objc-class-ref-to-OADataFetcher in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OARequestParameter", referenced from:
      objc-class-ref-to-OARequestParameter in SA_OAuthTwitterEngine.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

実際に試してみるとWebViewでのやりとりが続く事が確認できると思います。

なお、本来であれば最後の辺りでPINという7桁の数字をユーザにTextFieldなどにコピペして貰い、それをプログラムでTwitterのサーバへ投げる処理が必要なのですがこのライブラリではHTMLをパースしてその部分を自動的に取得して最終的なアクセストークン(twitterサーバにREST APIでアクセスするときにこの値をパラメータに含める)の取得するところまでやってくれます。

Twitter API Wiki / Authentication

http://apiwiki.twitter.com/Authentication

ユーザID、パスワードを入力してOAuthの許可が完了したらもう一度アプリを起動してみましょう。プログラムを変更していない場合は自分がOAuthの許可をしたユーザIDのつぶやきとして以下の様なつぶやきが投稿されているが確認できると思います。

f:id:nakamura001:20100520012433p:image:w320

おまけ

なお、twitterのサーバから返される情報のパースは以下の id:tomute さんのサイトで丁寧な解説が有るJSON Frameworkなどを使うと簡単に行えてオススメです。

Objective-CのJSON Frameworkを使ってTwitterの情報等を取得する方法 - Tomute’s Notes

http://d.hatena.ne.jp/tomute/20090518/1242687954

関連情報

OAuth関連の専門用語 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20100531/1275329032

やる夫で学ぶOAuth 〜やる夫がユニクロの行列に並んだようです〜 - くらげのBlog

http://d.hatena.ne.jp/ku__ra__ge+blog/20100531/1275331398

OAuthプロトコルの中身をざっくり解説してみるよ - ゆろよろ日記

http://d.hatena.ne.jp/yuroyoro/20100506/1273137673

Yahoo!デベロッパーネットワーク - OAuth - フロー

http://developer.yahoo.co.jp/other/oauth/flow.html

OAuth Core 1.0

http://oauth.net/core/1.0/#anchor9

iPhoneTwitter OAuth認証の流れについて » いとーけーのページ

http://itok.jp/blog/2010/01/13/iphone_twitter_oauth_gui/

OAuthやxAuthなどもについての解説が書いてあるTwitter APIの解説本。

日頃からTwitter APIをよく使っている方が書かれた本という印象で「twitterの負荷で挙動が…」などの体験に基づいた情報も有る実践的な内容でした。

Twitter API プログラミング

Twitter API プログラミング

xAuthの申請についてはこちらサイトが参考になります。最初は1週間の期限付きになるなど色々と注意すべき事が有る様です。

xAuthの申請方法をまとめました

http://blog.elearning.co.jp/?p=8909

Twitter-OAuth-iPhoneを使ってcocos2dプロジェクトからゲーム情報をpostする - 〜けものみちを目指して〜Only the Paranoid Survive

http://d.hatena.ne.jp/jarinosuke0808/20101019/1287496640

TwitPicのOAuthEcho対応 | iphoneアプリで稼げるのか

http://iphone.longearth.net/2010/08/05/twitpic%E3%81%AEoauthecho%E5%AF%BE%E5%BF%9C/

Twitter API を OAuth で認証するスクリプトを 0 から書いてみた - trial and error

http://techno-st.net/2009/11/26/twitter-api-oauth-0.html

hiroyahiroya 2010/09/15 10:37 初めまして。
OAuth認証の件を調べてここにたどり着きました。
質問なのですが、OAuth認証はしたみたいなのですが、[mentions]/[direct_messages]が取得できませんでした。
[user_timeline]/[friends]は取得できるのです。

そちらでは出来ましたでしょうか?

nakamura001nakamura001 2010/09/17 02:31 ライブラリの最新版で [_engine getDirectMessagesSinceID:0 startingAtPage:0] を実行してdirect_messages を取得してみたのですが特に問題無く取得出来るようです。

取得するタイミングによってはtwitter側の調子が悪い時も有るので「時間を開けて何回かテストしてみる」「何回かリトライしてみる」などについても試してみると良いかも知れません。

NaitoNaito 2010/10/07 16:47 OAuth認証をやろうとして、ここが一番良かったので質問させて頂きます。
Twitter-OAuth-iPhoneのサンプルをビルドしようとすると、
error: There is no SDK with the name or path 'iphoneos2.2.1'
と出てしまいました。
Xcodeは最新版のはずなのですが、どうしたらよいのでしょうか?

nakamura001nakamura001 2010/10/08 01:41 ビルドの設定のベースSDKが2.2.1に成っている事はないですか?

恐らく、これのサンプルがSDK 2.2.1向けに成っている為に発生しているエラーだと思います。

また、このサンプルでそのバージョンのSDK向けに作ってるとなると最新のSDKで使う場合は Twitter-OAuth-iPhone のライブラリについても最新のものに差し替えないと動かない可能性もあります。ベースSDKを変更しても上手く行かない場合はそちらも試してみて下さい。

NaitoNaito 2010/10/08 14:33 おっしゃる通りビルドの設定を訂正したら動きました。
ありがとうございます。

NaitoNaito 2010/10/11 16:09 再び失礼します。
Demoのほうが無事に動いたので、自分のプロジェクトにTwitter+Oauthフォルダをライブラリとして追加して動かそうとして失敗しています。
Twitter+Oauthのフォルダを追加→既存のファイル...から追加しようとすると、警告が出てコピーできないのですが、何がいけないのか分かりますでしょうか?

nakamura001nakamura001 2010/10/20 15:49 うーん、自分の環境ではその様な警告が出たことが無いのですがFinderから「グループとファイル」の所に直接ドラッグしてもダメですか?後、追加しようとしているファイルをFinder上でダブルクリックしたときはちゃんとXCodeに表示されますか?

はらだはらだ 2012/02/12 01:51 教えていただきたくてコメントします。
教えていただいたDemoフォルダ内のファイルを、自作アプリに組み込んで認証をしようとしています。すると、エラーが140件でて、どうも#include <libxml/xmlreader.h>がありません、という事のようです。Demoフォルダ内を探しても無く、それでもデバックはできたのに、他ファイルへ組み込もうとすると、なぜエラーになってしまうのでしょうか。教えて頂けますでしょうか。

nakamura001nakamura001 2012/02/13 14:41 一見、組み込んで無いのに何故か使える様なヘッダファイルやライブラリファイルが有る場合にはプロジェクト内で設定している事が多いです。今回の場合はプロジェクトの Build Settings のタブにこの様な記述が有りました http://f.hatena.ne.jp/nakamura001/20120213143808

エラーが発生した方のプロジェクトにこの記述を追加すると解消されるかと思われます。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元