[salesforce][twitter]Force.com APEXにおけるOauth認証を使用したTwitterAPIのアクセス方法について
TwitterのAPIをForce.com上で使用するため、Oauth認証を用いたAPEXのライブラリを探してみましたが
これといったライブラリが見つからなかったため、自前で作成しました。
Webアプリにおいて、Oauth認証を用いて、TwitterAPIを利用するには以下の手順が必要となります。
①Twitterにログインして、アプリ情報を登録する。
②登録したアプリの情報を使用し、Twitterに通信してRequest tokenを取得する。
③Request tokenを使用して、Twitter認証画面にリダイレクトする。
④Twitter認証画面から戻ってきた際に付加されたGETパラメータを使用してAccesstokenを取得する。
⑤Access tokenを使用して、各TwitterのAPIをコールする。
上記を踏まえて、下記に自分のタイムラインを表示する説明および例を記載します。
①Twitterにログインして、アプリ情報を登録します。
※こちらは参考サイトが多数ありますので説明は割愛します。
②アプリ登録画面に表示されたConsumer key、Consumer secret、Request token URLを使用してRequest tokenを取得します。Request token URLに対して、下記GETパラメータを付加して通信を行います。
パラメータ名 | 値 |
---|---|
oauth_callback | Twitterの認証画面からコールバックされる任意のURLをエンコードした文字列(アプリ登録時にも設定しますが、こちらが優先されます) |
oauth_consumer_key | アプリ登録画面に表示された文字列 |
oauth_nonce | ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています) |
oauth_signature_method | HMAC-SHA1’固定 |
oauth_timestamp | 現在時刻(UNIXタイムスタンプ形式) |
oauth_version | 1.0’固定 |
oauth_signature | 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値 |
[php]
Encodingutil.urlEncode(‘任意のURL’,’UTF8′)
[/php]
[php]
//1~9の値を使用して乱数を作成する
String CharList = ‘123456789’;
String Res = ”;
integer position;
//8桁の乱数を作成
for(Integer i = 0; i < 8; i++) {
position = Integer.valueof(String.valueof(Math.roundToLong(CharList.length()*Math.random()))) -1;
if(position==-1)position=0;
Res += CharList.substring(position,position+1);
}
//現在のミリ秒を戻す
DateTime d = System.now();
String now_mm_second = String.valueOf(d.year() + d.month() + d.day() + d.hour() + d.minute() + d.second() + d.millisecond());
//乱数と現在日時を繋げた値からMD5に変換し、この値をセットする
EncodingUtil.convertToHex(Crypto.generateDigest(‘MD5’, Blob.valueOf(now_mm_second + Res))) ;
[/php]
[php]
String.valueOf(Datetime.now().getTime()).substring(0, 10);
[/php]
[php]
//送信方式、送信URL、送信パラメータを&区切りでセットし、URLエンコードを行う
//注意点としてはoauth_callbackのURLは2回URLエンコードを行うイメージ
String sSignatureSource = ‘GET&
https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&
oauth_callback%3D【任意のURLを2回エンコードした文字列】%26
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【上記方法で作成した文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【上記方法で取得した文字列】%26
oauth_version%3D1.0′;
//アプリ登録画面で表示されたConsumer secretを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’;
//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]
https://api.twitter.com/oauth/request_token?
oauth_callback=http%3A%2F%2Fhogehoge.com%2F&
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=b1d9973f5b385f46aee43f8becbf79cc&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642915&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_callback_confirmed=true
[php]
//カスタムオブジェクトに登録
TwitterRequestToken__c oTwiOa_ins = new TwitterRequestToken__c();
oTwiOa_ins.token__c = oauth_token;
oTwiOa_ins.token_secret__c = oauth_token_secret;
insert oTwiOa_ins;
//ログイン画面にリダイレクト
PageReference pTwitterLogin = new PageReference(‘https://twitter.com/oauth/authenticate?oauth_token=’+oauth_token);
return pTwitterLogin.setRedirect(true);
[/php]
※アプリ登録画面のAuthorize URLではhttps://api.twitter.com/oauth/authorizeが表示されますが、上記のURL(/authenticate)を使用することで、既にTwtterにログイン済みでアプリの許可を行っている場合は認証画面が表示されず、コールバックに指定したURLに直接リダイレクトされます。
④コールバックされた際のGETパラメータであるoauth_token、oauth_verifierを使用してAccess tokenを取得します。アプリ登録画面に表示されたAccess token URLに対して、下記GETパラメータを付加して通信を行います。またoauth_token_secretも使用するので、先ほど登録したカスタムオブジェクトより、GETパラメータのoauth_tokenを条件に抽出します。
パラメータ名 | 値 |
---|---|
oauth_consumer_key | アプリ登録画面に表示された文字列 |
oauth_nonce | ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています) |
oauth_signature_method | HMAC-SHA1’固定 |
oauth_timestamp | 現在時刻(UNIXタイムスタンプ形式) |
oauth_version | 1.0’固定 |
oauth_token | コールバックされた際のGETパラメータ |
oauth_verifier | コールバックされた際のGETパラメータ |
oauth_signature | 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値 |
[php]
//Request token取得で作成した方法と基本的には同じ
//異なる点としてHMAC-SHA1ハッシュ変換で使用するキーにoauth_token_secretも使用
String sSignatureSource = ‘GET&
https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token&
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【コールバック後、再作成するnonce文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【コールバック後、再取得するtimestamp文字列】%26
oauth_token%3D【コールバックされた際のGETパラメータ】%26
oauth_verifier%3D【コールバックされた際のGETパラメータ】%26
oauth_version%3D1.0’;
//アプリ登録画面で表示されたConsumer secretおよびReqest tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’+【カスタムオブジェクトより取得したoauth_token_secret】;
//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]
https://api.twitter.com/oauth/access_token?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=c04cc4ffc2d54cec65246060aa20b145&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642918&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
user_id=XXXXXXXXX&
screen_name=ログインしたユーザ名
⑤Access tokenを使用して、ログインユーザのタイムライン情報を取得します。
※各APIのアクセスURLについては他サイトに多数ありますので、そちらを参照してください。
ユーザのタイムラインを取得するURL:http://api.twitter.com/1/statuses/home_timeline.xml
パラメータ名 | 値 |
---|---|
oauth_consumer_key | アプリ登録画面に表示された文字列 |
oauth_nonce | ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています) |
oauth_signature_method | HMAC-SHA1’固定 |
oauth_timestamp | 現在時刻(UNIXタイムスタンプ形式) |
oauth_token | ④で取得したAccess token |
oauth_version | 1.0’固定 |
oauth_signature | 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値 |
[php]
//Access token取得で作成した方法と基本的には同じ
//異なる点としてはHMAC-SHA1ハッシュ変換で使用するキーにRequest tokenのoauth_token_secretから
//Access tokenのoauth_token_secretに変更
String sSignatureSource = ‘GET&
http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【リクエスト時に再作成するnonce文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【リクエスト時に再取得するtimestamp文字列】%26
oauth_token%3D【Access token】%26
oauth_version%3D1.0%26
source_screen_name%3D【ユーザ名】’;
//アプリ登録画面で表示されたConsumer secretおよびAccess tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’+【Access tokenのoauth_token_secret】;
//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]
http://api.twitter.com/1/statuses/home_timeline.xml?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=718a0e118eed5d6c4dfa628a13b41b5b&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642919&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
source_screen_name=表示ユーザ&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<Twitterからの戻り値(テキスト形式)>
タイムラインのXML文字列
ここまでが一連の流れとなります。AccessTokenについてはユーザ・アプリ単位で一意となり
無期限で使用できるため、予め使用ユーザが分かっていれば上記④までの初回のみでOKです。
※RequestTokenについては1度しか使用できないようです。
また上記のサンプルソースをこちらで公開しています。