TumblrでOAuth認証をする

Tumblrでアプリを登録する

tumblr_OAuthここで情報頂きました。
http://ameblo.jp/itboy/entry-10660222356.html

Tumblrのアプリを登録するのは以下のURLになります。自分のTumblrアカウントでログインしてからアクセスしてみてください。
Tumblrのアプリを登録する

登録内容は簡単で、

  • Application name (アプリの名前):
  • Application website (あなたのWEBサイトとか):
  • App Store URL:(あなたのWEBサイトとか)
  • Google Play Store URL(私の場合は空です):
  • Application description(わかりやすい説明をつけておきます):
  • Administrative contact email(あなたのEmail):
  • Default callback URL(後から修正するのでとりあえずはあなたのWEBサイトで):
  • Icon(お好みでアップロードしてください):

のです。

登録が完了すると50桁のランダムな英字が出てきます。これがOAuthのキーになるので、どっかにメモしておきます。
特にOAuth consumer secretはセキュリティー上大切なので秘密にしておいてください。
OAuth consumer key: xxxxxOkIJTxxxxxfmbUUxxxxxgFSFixxxxxs0MuyBE8Ljxxxxx
OAuth consumer secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

このKeyからアクセストークンを取得します。

登録したアプリの確認はこちら。作成したアプリがリストになっています。また新規でアプリを追加する際もこのページから。

PHPでTumblrアプリを通してOAuth認証

まず、アクセストークン発行までの流としては、

  1. 「consumer key」と「consumer secret」をセットして、
  2. HTTP_OAuth(PEARのライブラリ)を使って、
  3. Tumblrアカウントのリクエストトークンを取得して、
  4. リクエストトークンでアプリの認証画面に行く。
  5. アプリの認証を承認すると、アクセストークン(これ大事)が発行される。

という風になります。

PHPでアクセストークンを取得します。OAuthは自分でコード書いて実装するのは非常に面倒なのでPEARのライブラリのHTTP_OAuthを使います。自鯖や専用サーバーやVPSだと各OSのコマンドでPEARをインストールできると思います。しかしレンタルサーバーだと非常に厄介でした。(ロリポサーバーでインクルードパスを使う)知識のある方は、A Day In The Boy's Life様のソースをそのまま使えるので、それを使った方が早いですが、一応メモ。

  • リクエストトークンの発行先:http://www.tumblr.com/oauth/request_token
  • 認証先:http://www.tumblr.com/oauth/authorize

になっています。
<?php

# インクルードパスを設定
# (php.iniなどで直接設定できる場合はいらないです。)
ini_set("include_path", ".:/home/users/1/lolipop.jp-XXXX/web/omnioo/lib/PEAR/");

/*
Tumblrのアプリでアクセストークンを取得するPHPです。
2013-01-08
*/

include 'HTTP/OAuth/Consumer.php';

# Key setting
$consumer_key = 'xxxxxOkIJTZxxxxxmbUU8hxxxxxSFiUnxxxxxMuyBE8LxxxxxC';
$consumer_secret = 'xxxxxM68CaxxxxxbZLDtxxxxx0f8pOHxxxxxr5NgZqkxxxxxse';

$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);

$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

session_start();

if (empty($_GET['oauth_verifier'])) { # First contact

#リクエストトークンの発行
$consumer->getRequestToken('http://www.tumblr.com/oauth/request_token');

# リクエストトークンを取得
$_SESSION['request_token'] = $consumer->getToken();
$_SESSION['request_token_secret'] = $consumer->getTokenSecret();

$auth_url = $consumer->getAuthorizeUrl('http://www.tumblr.com/oauth/authorize');

# Tumblrのアプリケーションの認証を行うページへリダイレクト
header("Location: $auth_url");

} else {
/*
認証完了後には、oauth_verifierパラメータを付けてデフォルトのコールバックURLへ返ってくる。
コールバックURLはこのファイルが置かれているURLです。
$_GET['oauth_verifier']がない場合がFirst contactになります。
*/

# リクエストトークン セット
$consumer->setToken($_SESSION['request_token']);
$consumer->setTokenSecret($_SESSION['request_token_secret']);

$consumer->getAccessToken('http://www.tumblr.com/oauth/access_token', $_GET['oauth_verifier']);

# やっとアクセストークンを取得
$_SESSION['access_token'] = $consumer->getToken();
$_SESSION['access_token_secret'] = $consumer->getTokenSecret();

# アクセストークンをブラウザ上に表示
print "AccessToken:" . $_SESSION['access_token'] . "";
print "AccessTokenSecret:" . $_SESSION['access_token_secret'] . "<br>
";
}

tumblr_apps_allow上記ソースをPHPで作成して適当なWEBサーバーにアップします。それから、そのアップした先((例)http://www.omnioo.com/tumblr_apps/get_accesstoken.phpとか)を先程アプリを登録した際の「Default Callback URL」に登録します。これやらないとアプリの認証しても返ってこないのでご注意。

アプリを作成してコンシューマーキーを取得したら、ここからアクセストークンを発行できます。

しかし、英語の認証画面と日本語の認証画面と出る時があってまちまちなんですがどうしてでしょうか。言語設定の問題ですかね。

というわけで、アクセストークンは、一度取得するとその後はそのアクセストークンを使ってTumblrにログインすることができるので、何度も取得する必要はありません。

Tumblrのアカウント情報を取得する

Tumblrもその他のソシャルメディアと同様、そのアカウント個人の様々な情報が格納されています。TumblrのOAuth認証を通したアプリはその情報を取得していろいろできます。例えば、

  • ダッシュボード以外からダッシュボードの情報を取得するとか。
  • ポストした画像だけ取得するとか。
  • CMSの記事をポストするとか。
  • フォローワーの情報を取得する(?できるんですかね。FaceBook Graphみたいの。)とか。

そんなようなことです。要するにログインしてからできるようなことをスクリプト(API)を叩いて自動的にやってくれるというわけです。

そんなこんなであれなんですが、もうだいぶ前にapi v1は終了したみたいです。今はv2だけしかやってないみたいです。v2はjsonでいろいろデータのやり取りをするらしいです。とりいそぎ

があったので読んでみてください。やたら難しいということはないけれど市役所の手続きみたいで面倒くさい。

Tumblrのアカウント情報を取得する(余談)

基本的なアカウント情報を取得するには、APIキーだけでその情報にアクセスできます。APIキーはTumblrアプリを作成した際に取得した「コンシューマーキー」になります。このAPIキーをくっつけてAPIをたたけば基本情報がjsonで返ってきます。
http://api.tumblr.com/v2/blog/[tumblrのbasename]/info?api_key=[APIキー]

という感じになります。私のTumblrにアクセスする際には、
http://api.tumblr.com/v2/blog/osamuya.tumblr.com/info?api_key=xxxxxOkIJTxxxxxfmbUU8xxxxxFSFiUxxxxx0MuyBE8Ljxxxxx

というような感じです。返ってきた値は、
{"meta":{"status":200,"msg":"OK"},"response":{"blog":{"title":"osamuya","posts":5508,"name":"osamuya","url":"http:¥/¥/osamuya.tumblr.com¥/","updated":1357658482,"description":"","ask":false,"share_likes":true,"likes":414}}}

APIの成功ステータスは200が基本。ブログの情報としてブログタイトル、記事数、作者名、URL、アップデートした日(エポック秒かな)、ブログの説明…などの情報です。たいし情報じゃないのでアクセストークンまで必要としないわけです。公開しているTumblrブログだったら誰のものでもアクセスできます。
基本的にはこんな風な方法になるみたいです。

TumblrにOAuth認証でPOSTする

最後になってしまいましたが、例としてOAuth認証を使って記事をPOSTします。全体の流としては、

  1. Tumblrアプリの登録、コンシューマーキーの取得
  2. アクセストークンの取得
  3. アクセストークンのセットとAPI接続でPOST

という感じになっています。

PHP自体のコードは以下のようになります。

<?php

ini_set("include_path", ".:/home/users/1/lolipop.jp-XXXX/web/omnioo/lib/PEAR");
include 'HTTP/OAuth/Consumer.php';

$consumer_key = 'xxxxxOkIJTxxxxxfmbUUxxxxxgFSFixxxxxs0MuyxxxxxzMNuC';
$consumer_secret = 'xxxxxM68CaxxxxxbZLDtxxxxx0f8pOxxxxxvr5NgxxxxxddLse';

$access_token = 'xxxxxLABiTxxxxx6vk8sxxxxxmuB5ExxxxxWwzBGxxxxxZGue3';
$access_token_secret = 'xxxxxMWE4XxxxxxcmDGGxxxxxywOdPxxxxxSkUmaxxxxxTpKR0';

$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);

$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

$consumer->setToken($access_token);
$consumer->setTokenSecret($access_token_secret);

// post type quote
$params = array(
'type' => 'quote',
'quote' => "TumblrのOAuthで自動的にPOSTする。¥nhttp://www.omnioo.com/record/", #post本文
'source' => 'http://www.omnioo.com/record/sns/tumblr_oauth_apps01/'
);

$api_url = 'http://api.tumblr.com/v2/blog/osamuya.tumblr.com/post';
$response = $consumer->sendRequest($api_url, $params);
print "<h1>Posted!</h1>";

やっていることは複雑ですが、PEARライブラリーがやってくれているので殆ど何もしなくていい感じです。keyのセットとPOSTする内容を用意するだけです。
includeするConsumer.phpはPEARから引っ張ってきますが、自分で設定する場合はini_set()でphp.iniの内容を一部書き換えないと駄目なのでご注意。PEARライブラリーの使い方は割愛します。

必要なkeyは、
consumer key: コンシューマーキー
consumer secret: コンシューマーキーシークレット
access token: アクセストークン
access token secret: アクセストークンシークレット
です。〜シークレットは是非秘密にしておいてください。パスワードと同様の意味をもっています。

ポストの方法は、配列にいろいろ突っ込んでリクエストに渡してやるだけなんですが、Tumblrは投稿するものの種類を区別しないと駄目です。以下のパラメータを連想配列で指定してゆくんですが、私も全部やってないのでわからないですが、テキスト、写真ぐらい投稿できればいいではないかと。上記ソースでは、

$params = array(
'type' => 'quote',
'quote' => "TumblrのOAuthで自動的にPOSTする。¥nhttp://www.omnioo.com/record/", #post本文
'source' => 'http://www.omnioo.com/record/sns/tumblr_oauth_apps01/'
);

で大丈夫なので、いろいろ省略できます。日付なんかは自動的に入っているみたいです。

最後に叩くAPIは、
http://api.tumblr.com/v2/blog/osamuya.tumblr.com/post
となってます。v1が廃止になってしまったので、http://www.tumblr.com/api/writeは使えません。
http://api.tumblr.com/v2/blog/{ Blog base name }/{method}
みたいな形式になっているのかな。

リクエストのパラメーターは以下です。

パラメータ 説明 デフォルト 必須
type 文字列 作成する投稿の種類。次のいずれかを指定します:text, photo, quote, link, chat, audio, video text はい
state 文字列 投稿の状態。次のいずれかを指定します:published, draft, queue published いいえ
tags 文字列 カンマ区切りで投稿に付けるタグ なし いいえ
tweet 文字列 この投稿についての自動Tweet(有効化されていれば)の使用:Tweetをしたくないときはoff、デフォルトのTweetを上書きしたい時はテキストを入力 なし いいえ
date 文字列 投稿のGMTでの日時文字列 POSTリクエストの日付と時刻 いいえ
markdown ブーリアン(真偽値) 投稿にマークダウン記法を使用するかどうかを示します False いいえ
slug 文字列 投稿URLの末尾に付ける短い要約テキスト ブログ上で有効にされている場合、動的に生成 いいえ

特に意味はないですが、DEMOでこの記事の宣伝ができてます。Posted!と出たらPOSTに成功。
http://osamuya.tumblr.com/に記事が上がります。

ソシャルもののインデックスはこちらにまとめてあります。