OAuth経由でTumblrの情報を取得・投稿するPHPスクリプト | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

以前、「OAuthを使ってPHPからTwitterへ投稿する 」とかで、TwitterのOAuthを経由して投稿するPHPプログラムを書きましたが、TumblrもOAuthに対応したということなので、OAuth経由でTumblr上の情報を取得したり、投稿するPHPのスクリプトを書いてみました。


一応、最終系はbotとしても動かせるようになるのですが、Twitterと違いアクセストークンを手動で取得する必要がある(xAuthに対応しているようなので、申請するればそんなことも無いと思いますが)ので、Webサイト上にプログラムの配置と実行ができる環境が必要になります。


なお、OAuth経由でのAPI操作は前回同様にPEARのHTTP_OAuth を使っています。

使い方の詳細は、前エントリに書いてますので、そちらもあわせて参照してください。



Tumblrのアプリケーションを登録する


Twitterの時と同様にアプリケーションの登録が必要です。

Tumblrへログインした状態で、アプリケーション登録サイト へアクセスします。


登録する情報もほとんどTwitterの時と同様です。

アプリケーション名(Application name)や、そのウェブサイト(Application website)、概要(Application description)などを入力します。

OAuth認証する際のコールバックURL(Default callback URL)は、後で解説するアクセストークン取得用のプログラム(get-accesstoken.php)のURLを指定します。

この時点でわからなければ、必須ではないのでブランクのまま一旦登録しても問題ありません。


登録が完了したら、アプリケーションの一覧画面へ遷移します。


- Tumblr Applications
A Day In The Boy's Life-Tumblr-Apps


アプリケーション名のすぐ下に表示されているコンシューマーキーと、「Show secret key」のリンクをクリックすると表示される、コンシューマーシークレットキーの2つをメモっておきます


これでTumblrアプリケーションの登録は完了です。



アクセストークンを取得する


Twitterの場合は、アクセストークンをアプリケーションの管理画面上から取得できるため、そのままbotプログラムに埋め込んで利用することができますが、Tumblrではそれがありません。

なのでbotとして動かしたい場合は、xAuthを使う場合を除いて、予めアクセストークンを取得して利用可能な状態にしておく必要があります。


って事で、まずはアクセストークンを取得するためだけのプログラムを作り、Webサイト上のアクセスできる位置(ドキュメントルート以下)に配置します。


<?php

include 'HTTP/OAuth/Consumer.php';

$consumer_key    = 'Your Consumer Key';
$consumer_secret = 'Your Consumer Secret key';

$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'])) {

// リクエストトークンの発行を依頼
    $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へ返ってくる

// リクエストトークンをセット
    $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();

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


先頭にある、$consumer_keyと$consumer_secret変数内には、先ほどアプリケーション登録した際のキーをそれぞれ入力しておきます。


このプログラムを例えば


http://www.example.com/get-accesstoken.php


へ配置したなら、アプリケーション管理画面に戻り、アプリケーションの編集(アプリケーション名をクリックすると変種可能)から「Default Callback URL」の情報を上記のURLに更新しておきましょう。

準備ができたら、そのURLへブラウザからアクセスしてみます。

すると、アプリケーションの認証画面が表示されるはずです。


- アプリケーション認証画面
A Day In The Boy&#39;s Life-Tumblr-OAuth


画面上の「Allow」ボタンを押して、アプリケーションからのアクセスを許可します。

すると、先ほどのget-accesstoken.phpのプログラムに戻り、ブラウザ上にアクセストークンとアクセストークンシークレットキーが表示されますので、それをまたメモっておきます


アクセストークンを取得するアプリの簡単な流れとしては、コンシューマーキーを使ってTumblrへアクセスし、その後リクエストトークンの発行を依頼します。

リクエストトークンが無事に発行されたら、アプリケーションのOAuth認証画面に遷移させ、そこでアプリケーションを許可すると、コールバックURLへ戻ってきます。

コールバックURLへ戻ってくる際に、oauth_verifierパラメータが付いて戻ってくるので、その情報をと共にアクセストークンの発行依頼を行い、発行されたらブラウザ上に表示するという処理を行ってます。


botとして動かす場合は、一度アクセストークンを取得してしまうと、これらの処理は必要なくなります。

WebサービスとしてTumblrのOAuthを利用する場合でも、一度取得したアクセストークンをDBなどに保存しておけば、次回以降はユーザーに認証させることなしにサービスを利用してもらうことが可能になります。


一度しか使わないプログラムなので、上記の中ではエラーハンドリング等は行ってません。

また、アクセストークンを無事に取得できた後は、このプログラムはWebサイト上から削除しておきましょう



Tumblrから情報を取得するPHPスクリプト


って事で、やっと本題。

今回は、Tumblrのダッシュボードから情報を拾うスクリプトにしています。

適宜、APIのURLやオプションを指定することで、その他の操作も可能です。

詳細は、APIドキュメント も参照してください。


<?php

include 'HTTP/OAuth/Consumer.php';

$consumer_key    = 'Your Consumer Key';
$consumer_secret = 'Your Consumer Secret Key';

$access_token        = 'Your Access Token';
$access_token_secret = 'Your Access Token Secret';

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

try {

    $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->getRequestToken('http://www.tumblr.com/oauth/request_token');

// リクエストトークンを取得
    $request_token = $consumer->getToken();
    $request_token_secret = $consumer->getTokenSecret();

// リクエストトークンをセット
    $consumer->setToken($request_token);
    $consumer->setTokenSecret($request_token_secret);

// 発行済みのアクセストークンをセット
    $consumer->setToken($access_token);
    $consumer->setTokenSecret($access_token_secret);

// ダッシュボードから取得する際のオプション
// 20件目から取得し、30件のデータを一回で取得する
    $params = array('start' => 20,
                    'num'   => 30);

// OAuthを利用してTumblrのAPIからダッシュボードの情報を取得
    $api_url = 'http://www.tumblr.com/api/dashboard';
    $response = $consumer->sendRequest($api_url, $params);

} catch (HTTP_OAuth_Consumer_Exception_InvalidResponse $e) {
// リクエストトークンの取得が失敗した場合
    echo $e->getMessage();
    exit;

} catch (HTTP_OAuth_Exception $e) {
// Tumblrからの読み込みが失敗した場合
    echo $e->getMessage();
    exit;
}

// 投稿した結果を取得
$xml = new SimpleXMLElement($response->getBody());

for ($i = 0; $i < count($xml->posts->post); $i++) {

    $attr = $xml->posts->post[$i]->attributes();

// Tumblrへ投稿された種類ごとに主要な情報を取得
    switch ($attr['type']) {
        case 'regular'      : $text = "[Text] " . $xml->posts->post[$i]->{'regular-body'}; break;
        case 'link'         : $text = "[Link] " . $xml->posts->post[$i]->{'link-text'}; break;
        case 'quote'        : $text = "[Quote] " . $xml->posts->post[$i]->{'quote-text'}; break;
        case 'photo'        : $text = "[Photo] " . $xml->posts->post[$i]->{'photo-caption'}; break;
        case 'conversation' : $text = "[Conversation] " . $xml->posts->post[$i]->{'conversation-text'}; break;
        case 'video'        : $text = "[Video] " . $xml->posts->post[$i]->{'video-caption'}; break;
        case 'audio'        : $text = "[Audio] " . $xml->posts->post[$i]->{'audio-caption'}; break;
        case 'answer'       : $text = "[Answer] " . $xml->posts->post[$i]->{'question'} . "/" . $xml->posts->post[$i]->answer; break;
        default: $text = "unknown";
    }
    echo $text . "\n\n";
}


基本的な処理の流れは「OAuthを通してPHPからタイムラインの情報を取得する 」と同様です。

APIのURLを下記のように変更すれば自分がTumblrへ投稿した情報も取得することができます。


$api_url = 'http://itboy.tumblr.com/api/read';


また、APIから情報を読み込む際のオプション($params)を変更することで、読み込み開始位置や取得件数を変更することもできます。


その他の違いとしては、Tumblrの場合は投稿された情報の種類(type)ごとに、格納されるXMLの要素名が異なります。

APIドキュメントを参照すると8種類のtypeがあるようなので、それぞれの主要な情報を抜き出して表示するようにしています。

その他にも、例えばQUOTEされてた場合はその引用元であったり、ブログ(regular)として投稿されていた場合は、タイトルがあったりもします。

APIドキュメントを参照しながら、適宜必要な情報を抜き出してみてください。



Tumblrへ情報を投稿するPHPスクリプト


今度は、Tumblrへ情報を投稿する場合です。

基本的な流れは同じで、後半に投稿用のAPIを呼び出し、情報をPOSTしています。

ここでは、引用(QUOTE)してTumblrへ投稿する処理を書いています。


<?php

include 'HTTP/OAuth/Consumer.php';

$consumer_key    = 'Your Consumer Key';
$consumer_secret = 'Your Consumer Secret Key';

$access_token        = 'Your Access Token';
$access_token_secret = 'Your Access Token Secret';

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

try {

    $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->getRequestToken('http://www.tumblr.com/oauth/request_token');

// リクエストトークンを取得
    $request_token = $consumer->getToken();
    $request_token_secret = $consumer->getTokenSecret();

// リクエストトークンをセット
    $consumer->setToken($request_token);
    $consumer->setTokenSecret($request_token_secret);

// 発行済みのアクセストークンをセット
    $consumer->setToken($access_token);
    $consumer->setTokenSecret($access_token_secret);

// Tumblrへ投稿時のオプション
// Quoteとして投稿する
    $params = array('type'   => 'quote',
                    'quote'  => mb_convert_encoding('ほげほげ', 'UTF-8'),
                    'source' => 'http://ameblo.jp/itboy/');

// OAuthを経由してTumblrの投稿APIへデータを投げる
    $api_url = 'http://www.tumblr.com/api/write';
    $response = $consumer->sendRequest($api_url, $params);

} catch (HTTP_OAuth_Consumer_Exception_InvalidResponse $e) {
// リクエストトークンの取得が失敗した場合
    echo $e->getMessage();
    exit;

} catch (HTTP_OAuth_Exception $e) {
// Tumblrからの読み込みが失敗した場合
    echo $e->getMessage();
    exit;
}


投稿する際のオプション($params)のtypeの中で、Tumblrへ投稿する修理をセットしています。

そして、引用した情報(quote)とその情報源(source)をあわせてセットして、書き込み用のAPIへ投稿しています。


- 実行結果
A Day In The Boy&#39;s Life-Tumblr-write


QUOTE以外の場合に、必要なオプションはAPIドキュメントを参照 してみてください。