pocket APIでwebサービスを作りたい全ての人に向けて書きました

  • 2014.06.24(Tue) 07:00
  • WEB制作
pocketのAPIの写真

後で読みたい記事をストックできるwebサービスのpocket。「あとでよむ」系のサービスとしては、日本で最大手と言ってもいいですよね。ブログに付けるソーシャルボタンは、これが定番になっています。

そのpocketが提供するAPIを利用して、webサービスを作ったり、ブログにちょっとしたサブ機能を加えてみませんか?これからpocketのAPIを始める全ての人の助けになれたらと思い、その使い方をまとめてみました。

Developer pocket

目次

  1. アプリケーションを登録する
    1. アカウントを取得する
    2. アプリケーションを登録する
    3. 登録する項目の説明
    4. コンシューマーキーを確認する
  2. コンシューマーキーを使ってOAuth認証をする
    1. pocketのアプリ認証の手順
    2. pocketでOAuth認証をするPHPのサンプルプログラム
    3. サンプルプログラムを利用したアプリ認証のイメージ
  3. ユーザーデータを読み込んでみよう [Retrieve]
    1. Retrieveのリクエスト方法
    2. pocketのアイテムを読み取るサンプルプログラム
    3. Retrieveを使ったwebサービスのアイデア
  4. アイテムを追加してみよう [Add]
    1. Addのリクエスト方法
    2. pocketにアイテムを追加するサンプルプログラム
    3. Addを使ったwebサービスのアイデア
  5. アイテムを変更してみよう [Modify]
    1. Modifyのリクエスト方法
    2. actionsに指定できるパラメータ
    3. pocketにアイテムを追加するサンプルプログラム
  6. pocketのAPI周りの情報いろいろ
    1. レートリミット(使用制限)について
    2. ステータスコードについて
  7. pocketのAPIを利用して制作されたwebサービスの事例いろいろ
    1. RandomPocket
    2. RocketSS
    3. Lisgo
    4. Pinpocket
    5. IFTTT
  8. [おまけ] はてブをするとpocketしてくれるPHPプログラム
    1. はてなブックマーク側のWeb Hookの設定
    2. PHPプログラム
    3. 使用イメージ

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

pocketのAPIを登録するには、まず「アプリケーションの登録」を行なう必要があります。「アプリケーションっていうとなんだか難しそう…」と思うかもしれませんが、なんてことはありません。PHPでプログラムを作るなら、「〜.php」がそのアプリケーションにあたります。例えば次のプログラムだって立派な(web)アプリケーションです。

<?php
	echo "私は立派です。";

「アプリケーション登録」とは、ざっくり言えば「このPHPであなたのところのAPIを使わせて下さい」と伝える作業です。

1-1アカウントを取得する

pocketのログイン画面
pocketのログイン画面

なお、APIを利用するには、前提としてpocketのアカウントを所有している必要があります。もし、まだの方は、pocketでアカウントを作成するか、またはGoogleのアカウントで代用することが可能です。

Sign Up pocket

Google アカウントの作成 Google

1-2アプリケーションを登録する

それではアプリケーションの登録を行なっていきましょう。登録するには、下記のリンクにアクセスして下さい。まだの場合は最初にログインが求められます。

My Applications pocket

My Applications

pocketのアプリケーション管理画面
pocketのアプリケーション管理画面

アクセスすると、「My Applications」というページに移動します。ここに、登録したアプリの一覧が表示されて、後から情報を編集したり、削除したりできます。まだ何も登録してないので空白ですよね。何はともあれ、まずはアプリケーションを登録してみましょう。「CREATE AN APPLICATION」をクリックして下さい。

Create an Application

pocketのアプリケーション管理画面
pocketのアプリケーション管理画面

それではアプリの情報を登録しましょう。最初は色々と機能を試すためのお試し登録でいいと思います。よろしければ上記のサンプル画像をそのまま真似して下さい。画像はクリックすると拡大して見ることができます。

1-3登録する項目の説明

登録するアプリ情報の、各項目を説明していきます。不安な方は一度、目を通してみて下さい。

名前と概要

アプリの名前と概要
アプリの名前と概要

一番上から、まずアプリの名前と概要を入力します。例えば、人気サービスのTwilogだったら、名前が「Twilog」、概要は「Twitterをブログ形式で表示するwebサービス」となります。あなたが作成しようとしているサービスに合わせた情報を入力しましょう。ちなみに(生半可な)英語で入力しているのは、単純に日本語だと文字化けを起こしてしまうからです。

パーミッション(アプリの権限)

パーミッション(アプリの権限)
パーミッション(アプリの権限)

続いてパーミッションを設定します。パーミッションとは、「そのアプリがどんな権限を持っているか」です。Addは「アイテムの追加」、Modifyは「ストックしているアイテムの情報変更(タグの削除など)」、Retrieveは「ストックしているアイテムの読み取り」の権限をそれぞれ表します。

例えば、「ユーザーが今までにpocketしてきたアイテム(記事)をランダムで10個表示するサービス」だったら、権限は「アイテムの読み取り」だけで十分なので、Retrieveだけにチェックを付けて下さい。例えば、「ユーザーのタグを一括で削除するwebサービス」だったらRetrieveに加えてModifyにチェックを付ける必要がありますね。

まずは「機能を試すためのアプリ」なので、全部の権限にチェックを入れておきましょう。

Twitterのアプリ認証
Twitterのアプリ認証

ちょっと寄り道して…、誰もが利用しているTwitterを例にとってみると分かりやすいかもしれません。上記の画像はTwilogのアプリ認証画面です。赤枠で囲んである部分がパーミッションにあたります。これのpocket版だと思って下さい。

プラットフォーム

プラットフォーム
プラットフォーム

最後はプラットフォームの選択です。iPhoneアプリやAndroidアプリ、デスクトップアプリなど様々な種類がありますが、今回はインターネットブラウザ(web)で起動するお手軽なアプリを作ってみましょう。Webにチェックを入れて下さい。

全ての項目に問題がなければ、「I accept the Terms of Service(利用規約に同意しますか?)」にチェックを入れて、「CREATE APPLICATION」をクリックすれば登録完了です。

1-4コンシューマーキーを確認する

CONSUMER KEY
CONSUMER KEY

無事、アプリケーションの登録に成功すると、先ほどのMy Applicationsのページに遷移し、登録したアプリが一覧に加わっているのを確認できますね!アプリ名の右にあるCONSUMER KEYを保存(メモ)して下さい。サンプルでは29123-af261164b5dc63e823fc922dの部分です。画像はクリックすると拡大することができます。

これは、pocket側が、APIを使っているのがあなたのプログラムだと識別するためのキーとなります。他人に知られないように、管理しておきましょう。

2コンシューマーキーを使ってOAuth認証をする

それでは、早速、アプリ認証を行なって「アクセストークン」を取得してみましょう。pocketはOAuth2.0という認証形式を採用しています。公式ドキュメントは、下記のページにあります。

OAuth 2.0 OAuth

ドキュメントを読むよりも、何度かプログラムを起動し、体験して流れを掴む方が、圧倒的に分かりやすいと思います。その後、確認の意味で読むのがお勧めです。今は読まずに進んでしまって大丈夫です。

2-1pocketのアプリ認証の手順

ざっくりとした内容なんですが…、pocketのアプリ認証の手順は下記のような感じです。

下記ページに、pocketのアプリ認証の公式ドキュメントがあります。次項で紹介するサンプルプログラムは、このページの手順に沿っています。興味があったら、見比べてみて下さい。

Pocket Authentication API Documentation pocket

2-2pocketでOAuth認証をするPHPのサンプルプログラム

下記が、先ほど紹介した3つの手順を実行するOAuth認証のサンプルプログラムです。$consumer_key$redirect_uriを設定してから、アクセスしてみて下さい!

<?php
//アプリ登録で取得したコンシューマーキー
$consumer_key = '29123-af261164b5dc63e823fc922d';

//このプログラムのURL
$redirect_uri = 'http://syncer.jp/test.php';

//セッションスタート
session_start();

//アプリ認証から帰ってきた時([return=1]があるアクセス)の場合はアクセストークンを取得
//[手順3] ユーザーがアプリを許可して、アプリがアクセストークンを受け取る、の部分
if(isset($_GET['return']) && is_string($_GET['return']) && $_GET['return'] == "1"){

	//セッションにリクエストトークンがない場合は不正と判断してエラー
	if(!isset($_SESSION['code']) || empty($_SESSION['code'])){ error_pk_syncer('セッションが上手く機能してないか、手動で[return=1]を付けてアクセスしてます…。'); }

	//セッションにCSRF対策用の[state]がない場合は不正と判断してエラー
	if(!isset($_SESSION['state']) || empty($_SESSION['state'])){ error_pk_syncer('セッションが上手く機能してないかもしれません。'); }

	//リクエストトークンをアクセストークンと交換する
	$data = @file_get_contents(
		'https://getpocket.com/v3/oauth/authorize',
		false,
		stream_context_create(
			array('http' => array(
				'method' => 'POST',
				'content' => http_build_query(array(
					'consumer_key' => $consumer_key,
					'code' => $_SESSION['code'],
				)),
			))
		)
	);

	//関数[get_query_syncer]を使って、GETパラメータ形式の文字列を配列に変換
	$query = get_query_syncer($data);

	//CSRF対策
	if(!isset($query['state']) || empty($query['state']) || $query['state'] != $_SESSION['state']){ error_pk_syncer('セッションに保存してあるstateと、返ってきたstateの値が違います…。'); }

	//アクセストークンが取得できない場合はエラー
	if(!isset($query['access_token']) || empty($query['access_token'])){ error_pk_syncer('アクセストークンを取得できませんでした…。'); }

	//アクセストークンを変数に格納
	$access_token = $query['access_token'];

	//セッション終了
	session_finish_pk_syncer();

	//アクセストークンをブラウザに出力
	echo $header."あなた({$query['username']})のアクセストークンは{$access_token}です!";

//[return=1]がないアクセス(初回アクセス)の場合
//[手順1] pocketからリクエストトークンを取得する、の部分
}else{

	//CSRF対策
	session_regenerate_id(true);
	$state = sha1(uniqid(mt_rand(),true));
	$_SESSION['state'] = $state;

	//リダイレクトURLにパラメータを追加
	$redirect_uri .= "?return=1";

	//リクエストトークンを取得
	$data = @file_get_contents(
		'https://getpocket.com/v3/oauth/request',
		false,
		stream_context_create(
			array('http' => array(
				'method' => 'POST',
				'content' => http_build_query(array(
					'consumer_key' => $consumer_key,
					'redirect_uri' => $redirect_uri,
					'state' => $state,
				)),
			))
		)
	);

	//関数[get_query_syncer]を使って、GETパラメータ形式の文字列を配列に変換
	$query = get_query_syncer($data);

	//リクエストトークンを取得できなければエラー
	if(!isset($query['code']) || empty($query['code'])){ error_pk_syncer('リクエストトークンが取得できませんでした。多分コンシューマーキーの設定が間違っています。'); }

	//セッションに保存したstateの値と、返って来たstateの値が違ったらエラー
	if(!isset($query['state']) || empty($query['state']) || $_SESSION['state'] != $query['state']){ error_pk_syncer('セッションが上手く機能してないかもしれません…。'); }

	//セッションにリクエストトークンの値を格納しておく
	$_SESSION['code'] = $query['code'];

	//ユーザーをアプリ認証画面へアクセス(リダイレクト)させる
	//[手順2] ユーザーがそのリクエストトークンを持って、pocketの「アプリ認証画面」にアクセスする、の部分
	header("Location: https://getpocket.com/auth/authorize?request_token={$query['code']}&redirect_uri={$redirect_uri}");
}

//文字化けさせないための最低限のヘッダー
$header = '<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>';

//エラー処理をする関数
function error_pk_syncer($message){
	session_finish_pk_syncer();
	echo $header.$message;
	exit;
}

//セッションを終了する関数
function session_finish_pk_syncer(){
	$_SESSION = array();
	session_destroy();
}

//GETパラメータ形式の文字列(例:a=b&c=d...)を配列(例:$query['a']=b、$query['c']=d...)に変換する関数
function get_query_syncer($data){
	$ary = explode("&",$data);
	foreach($ary as $items){
		$item = explode("=",$items);
		$query[$item[0]] = $item[1];
	}
	return $query;
}

2-3サンプルプログラムを利用したアプリ認証のイメージ

サンプルプログラムを利用した、アプリ認証の流れは次の通りです。確認しながら、少しずつ進んでみて下さい。

アプリ認証画面

pocketのアプリ認証画面
pocketのアプリ認証画面

プログラムにアクセスすると、アプリの認証画面に移動するので、「認可」をクリックして下さい。左側には、アプリ登録の際にしたパーミッションの設定が反映されています。画像はクリックすると拡大できます。

アクセストークンを確認する

アクセストークンを確認する
アクセストークンを確認する

「認可」をクリックすると、ブラウザにアクセストークンが表示されます。このアクセストークンを利用して、アプリ側はユーザーのデータに、設定したパーミッションのレベルに応じてアクセス(情報を読み取ったり、書き込んだり)することが可能になります。実際にwebサービスを作る場合は、このアクセストークンをデータベースなどに保存して管理することになります。

3ユーザーデータを読み込んでみよう

コンシューマーキーとアクセストークンを取得したので、ここからは実際に簡単なプログラムを一緒に作って、APIを利用していきましょう。まずはパーミッションで言うRetrieve(読み取り)の権限を利用してみます。Retrieveに関する公式ドキュメントは下記のページで確認できます。

Pocket API: Retrieving a User's Pocket Data pocket

3-1Retrieveのリクエスト方法

Retrieve権限を利用するためには、下記のURLにPOSTメソッドでリクエストを送ります。

指定できるパラメータ

どんなアイテム(pocketした記事)を、どれだけ読み込むかを、下記のパラメータで指定することができます。[]内が、指定するパラメータの値となります。

パラメータ解説
consumer_key[必須] コンシューマーキー
access_token[必須] アクセストークン
stateステータスで絞り込み
- [unread] 未読(デフォルト)
- [archive] 既読
- [all] 全て
favoriteお気に入り状態で絞り込み
- [0] お気に入りのアイテム
- [1] お気に入りじゃないアイテム
tagタグの状態で絞り込み
- [untagged_] タグが付いてないアイテム
- [{タグ名}] このタグ名が付いたアイテム
contentTypeメディアで絞り込み
- [article] 通常の記事など
- [video] 動画コンテンツ
- [image] 画像コンテンツ
sortアイテムを並び替え
- [newest] 新しい順(デフォルト)
- [oldest] 古い順
- [title] タイトル名順
- [site] アイテムのURL(ドメイン)名順
detailType取得するデータの内容
- [simple] 最小限の内容のみ(デフォルト)
- [complete] 全ての内容
searchキーワードで絞り込み
- [{キーワード}] このキーワードを含むアイテム
domainドメインで絞り込み
- [{ドメイン}] このドメインのアイテム
※syncer.jp、http://syncer.jp、どちらの指定方法でも可
since時間で絞り込み
- [{日時}] この日時以降に追加したアイテム
※UNIX TIMESTAMP形式で指定
countアイテムの取得件数
- [{数値}] この数値分だけアイテムを取得
※上限不明(5,000件まで確認)
offsetアイテムの取得開始位置
- [{数値}] この数値分だけパスしてアイテムを取得

取得できるJSONデータ

リクエストに成功すると、下記のJSONデータを取得することができます。アイテムはlistプロパティに配列形式で格納されています。サンプルの赤で囲った部分が1つ分のアイテムデータです。主要なデータには青文字でコメントを入れています。アイテムIDは主に「Modifyの権限」で利用することになります。

3-2pocketのアイテムを読み取るサンプルプログラム

以上を踏まえたサンプルプログラムが下記です。$consumer_key$access_tokenを設定してアクセスするだけで起動します。パラメータ部分を連想配列形式で指定して、色々と試してみて下さいね!

<?php
//設定項目
$consumer_key = "";	//コンシューマーキー
$access_token = "";	//アクセストークン

//パラメーター
$params = array(
	"state" => "unread",	//未読の記事のみ
	"count" => "10",	//記事10件
	"sort" => "newest",	//新しい順
	"since" => strtotime('2013/1/1'),	//2013/1/1以降
	"detailType" => "complete",	//詳しいデータ
);

//パラメーターにコンシューマーキーとアクセストークンを追加
$params = array_merge($params,array("consumer_key" => $consumer_key,"access_token" => $access_token,));

//アイテムデータをJSON形式で取得する
$json = @file_get_contents(
	"https://getpocket.com/v3/get",
	false,stream_context_create(array('http' => array(
		'method' => 'POST',
		'content' => http_build_query($params),
	)))
);

//JSONデータをオブジェクト形式に変換する
$obj = json_decode($json);

//個々のアイテムを出力する
foreach($obj->list as $item){
	//アイテムのID
	$id = $item->item_id;

	//アイテムのタイトル
	$title = $item->resolved_title;

	//アイテムのURL
	$url = $item->resolved_url;

	//お気に入りにしているか?
	$fav = ($item->favorite == 1) ? '★' : '';

	//pocketした日付(ついでに整形)
	$date = date('Y/m/d H:i',$item->time_added);

	//ブラウザに出力
	echo "<p>アイテムID:{$id}<br/><a href=\"{$url}\">{$fav}{$title}</a>({$date}にpocket)</p>";
}

プログラムの実行結果

プログラムの実行結果
プログラムの実行結果

サンプルプログラムを実行すると、これまでにpocketしたアイテムのデータが出力されます。一度プログラムが正常に起動するのを確認したら、リクエストするパラメータを変更したりして、感覚を掴んでみて下さいね。画像はクリックで拡大できます。

特定のタグで検索する

例えば、タグでアイテムを検索したい場合、パラメータを次のように変更します。hatebumanというタグを付けたアイテムだけが出力されます。

//パラメーター
$params = array(
	"state" => "all", //未読・既読を指定しない
	"tag" => "hatebuman",
);

特定のキーワードで検索する

例えば、キーワードでアイテムを検索したい場合は、パラメータを次のように変更して下さい。「はてブマン」というタグを付けたアイテムだけが出力されます。ちなみに、タグやキーワードは複数指定ができません。

//パラメーター
$params = array(
	"state" => "all", //未読・既読を指定しない
	"search" => "はてブマン",
);

お気に入りにしたアイテムのみを検索する

お気に入りにしたアイテムのみを検索したい場合は、パラメータを下記のように変更して下さいね!

//パラメーター
$params = array(
	"state" => "all", //未読・既読を指定しない
	"favorite" => 1,
);

アイテム総数を取得

例えば、「そのユーザーがこれまでにpocketした総アイテム数」を表示させたい場合は、下記のようにデータを取得します。サンプルの29行目に挿入して下さい。正確には「このリクエストで取得したアイテム数」なので、countパラメータは指定しないで下さい。サンプルだと9行目で10と指定してます。

//全アイテム数
$all = count((array)$obj->list);

//全アイテム数を出力
echo "

総アイテム数:{$all}

";

3-3Retrieveを使ったwebサービスのアイデア

Retrieveを使えばどんな機能を実現できるか?そのアイデアを紹介します。

今までのアイテムをランダムで表示

ユーザーが今までにpocketしたアイテムの中から、ランダムで10件だけ表示するwebサービス、「ランダムpocket君(仮)」というプログラムを作ってみましょう。それには、まずサンプルのパラメータ部分を次のように変更します。

//パラメータ (全ての記事を指定)
$params = array(
	"state" => "all",
);

そして、サンプルの26行目(アイテムデータを取得して)以降を、次のように書き換えてみて下さい。json_decode()の第2引数にtrueを指定すると、JSONデータをオブジェクトではなく、連想配列形式に変換することができます。

//JSONデータをオブジェクトではなく、連想配列形式に変換する
$array = json_decode($json,true);

//アイテムリストの配列を変数に格納
$itemlist = $array['list'];

//アイテム数を調べる
$itemcount = count($itemlist);

//アイテム個数が15件以下の場合はエラー
if(15 > $itemcount){
	echo 'もっとpocketしてから来て下さい!!';
	exit;
}

//アイテム配列の中から、ランダムで10個のキーを取得
$keylist = array_rand($itemlist,10);

//選ばれたキーのアイテムを出力する
foreach($keylist as $item){
	//アイテムのID
	$id = $itemlist[$item]['item_id'];

	//アイテムのタイトル
	$title = $itemlist[$item]['resolved_title'];

	//アイテムのURL
	$url = $itemlist[$item]['resolved_url'];
 
	//お気に入りにしているか?
	$fav = ($itemlist[$item]['favorite']== 1) ? '★' : '';
 
	//pocketした日付(ついでに整形)
	$date = date('Y/m/d H:i',$itemlist[$item]['time_added']);
 
	//ブラウザに出力
	echo "<p>アイテムID:{$id}<br/><a href=\"{$url}\">{$fav}{$title}</a>({$date}にpocket)</p>";
}
ランダム表示のイメージ
ランダム表示のイメージ

このように更新するごとに、アイテムが10件、ランダムで表示されると思います。実際にはアイテム数が500個、1000個、5000個…と多くなるとそれだけ処理に負荷がかかるので、1日ごとに1回だけランダムでアイテムを抽出する、といったような仕組み作りが必要だと思います。

4アイテムを追加してみよう

前章では、ユーザーがpocketしたアイテムを読み込む方法を紹介しました。今回は、PHPプログラムを通して、ユーザーのリストにアイテムを追加してみましょう。パーミッションでいうAdd(書き込み)の権限を利用します。公式ドキュメントは下記ページをご参考下さい。

Pocket API: Adding Items to Pocket pocket

4-1Addのリクエスト方法

Add権限を利用してアイテムを追加するには、下記のURLにPOSTメソッドでリクエストを送ります。

指定できるパラメータ

アイテム追加のリクエストを送る際は、下記のパラメータを送信することができます。Addの場合、一度に1つのアイテムしか追加することができません。一度に複数のアイテムを追加したい場合は、後述の「Modifyの権限」を利用することになります。

パラメータ解説
consumer_key[必須] コンシューマーキー
access_token[必須] アクセストークン
url[必須] 追加するURL
titleアイテムのタイトル
※ページにタイトルが設定されていない場合のみ反映
tagsアイテムのタグ
※複数の場合はカンマ区切りで指定

取得できるJSONデータ

リクエストが成功すると、下記のJSONデータを取得することができます。アイテムを追加するのが目的なら、「JSONデータを取得する必要はないんじゃないか?」と思うかもしれませんが、成功判定や、結果表示をする場合に便利ですね。主要なデータに青文字で説明コメントを付けてあります。

4-2pocketにアイテムを追加するサンプルプログラム

以上を踏まえたサンプルプログラムが下記です。$consumer_key$access_tokenを設定してアクセスするだけで起動します。起動後、自分のリストに指定したアイテム(URL)が加わっているかを確認してみて下さいね。

<?php
//設定項目
$consumer_key = "";	//コンシューマーキー
$access_token = "";	//アクセストークン

//パラメーター
$params = array(
	"url" => "http://syncer.jp/pocket-api-matome", //追加するURL
	"tags" => "test,すぐ消す", //アイテムに付けるタグ
);

//パラメーターにコンシューマーキーとアクセストークンを追加
$params = array_merge($params,array("consumer_key" => $consumer_key,"access_token" => $access_token,));

//アイテムを追加するリクエストをPOSTメソッドで送る
$json = @file_get_contents(
	"https://getpocket.com/v3/add",
	false,stream_context_create(array('http' => array(
		'method' => 'POST',
		'content' => http_build_query($params),
	)))
);

//JSONデータをオブジェクト形式に変換する
$obj = json_decode($json);

//成功判定
if(!isset($obj->status) || !$obj->status){
	echo '追加に失敗しました…。';
	exit;
}

//アイテムのID
$id = $obj->item->item_id;

//アイテムのタイトル
$title = $obj->item->title;

//アイテムのURL
$url = $obj->item->resolved_url;

//pocketした日付
$date = $obj->item->date_resolved;

//ブラウザに出力
echo "<p>アイテムリストに{$title}を追加しました!<br>URL:{$url}</p>";

4-3Addを使ったwebサービスのアイデア

Addを使えば、webサービス内に、オリジナルの「あとで読む」ボタンを設置することが可能ですが、それだけでは普通ですよね…。次のような機能が、例えばブログにあったら面白いんじゃないでしょうか?

最新記事をpocketに届ける配達機能

RSSをpocketで実現します。「私のブログの新着記事をpocketで受け取る」というボタンを設置しておき、希望のユーザーにアプリ認証をしてもらい、アクセストークンをデータベースに保存しておきます。後は、ブログを更新する度に、またはcronを利用して定期的に、認証をしているユーザー全員のpocketに新着記事をアイテムとして追加するという仕組みです。

pocketを活用しているユーザーならば、わざわざ記事にアクセスしないで、pocketに自動的に新着記事が追加されるので大変便利ですよね。ブログ側も新着記事を発行する度に、登録人数分だけpocketのカウントが増えるし、記事が届いたユーザーが訪問してくれることでPVを確保することができちゃいます。

1章の「OAuth認証」と、この3章の「Add(アイテムの追加)」を利用すれば、実現できますよね。よろしければ、独自のpocket宅配便を、ブログやwebサイトに設置してみて下さい。

5アイテムを変更してみよう

Retrieve(アイテムの読み込み)、Add(アイテムの追加)と、紹介してきました。最後は、pocketのAPIの中でも、一番強力な権限、Modify権限でAPIを利用してみましょう!公式ドキュメントは下記のページにあります。

Pocket API: Modifying a User's Pocket Data pocket

5-1Modifyのリクエスト方法

Modify権限を利用してアイテムを変更するには、下記のURLにPOSTメソッドでリクエストを送ります。

指定できるパラメータ

このModify権限のリクエストには、ちょっとクセがあります。少しずつ説明していきますね。まず、基本となるリクエストパラメータは次の3つです。

パラメータ解説
consumer_key[必須] コンシューマーキー
access_token[必須] アクセストークン
actions[必須] アクション
※JSON形式で指定

actionsで指定できるパラメータ

actionsには、アイテムを変更するために用意された様々なアクションを、JSON形式で指定することができます。1つのアクションには複数のパラメータがあり、それらをセットで1まとめにしてJSONにする必要があるんです。言葉で言っても分からないのでサンプルを…。

例えば、「IDが999999のアイテムを既読状態にする」を実行するには、actionsの値に次のようにJSONデータを文字列で指定します。分かりやすいように、プロパティを赤文字に、データを青文字にしています。

actionのarchiveが「既読にするアクション」を表していて、item_idでアイテムのIDを、timeで変更の記録時間を指定しているわけです。これらを上記のような1まとめのJSONデータにして、actionsパラメータに指定する形になります。

Modifyでは1度に複数のアクションを指定することができて、その場合は次のように指定します。IDが999999(赤)と、888888(青)の記事を1回のリクエストで既読状態にする場合のサンプルです。

[]の中に、,(カンマ)で区切った2つのJSONデータを含める形です。さて、これらのJSONデータは、いちいち文字列として書き出すのは大変なので、PHPの場合だったら、json_encode()という関数で配列から変換するのが便利です。例えば、上記のサンプルの場合、次のようになります。

//多次元の連想配列を用意する
$action = array(	//2つの配列を覆う配列が[〜]の部分

	array(	//999999を既読にするアクション
		'action' => 'archive',
		'item_id' => '999999',
		'time' => '1403449200',
	),
	array(	//888888を既読にするアクション
		'action' => 'archive',
		'item_id' => '888888',
		'time' => '1403449200',
	),

);

//多次元の連想配列をJSONデータに変換する
$json = json_encode($action);

このようにして、先ほどサンプルで紹介したJSONデータを作成することができます。これなら、PHPに標準で備わっている配列の追加や削除といった処理をした後、最後にjson_encode()でJSONデータに変換すればいいだけだから簡単ですよね!

5-2actionsに指定できるパラメータ

それでは、Modifyのactionsに指定できるパラメータを紹介していきます。Addでは1回のリクエストにつき、1つしかできなかった「アイテムの追加」が、Modifyの場合は1度に何件でも指定することができます。

アクションパラメータ
アイテムの追加[action] add (必須)
[url] アイテムのURL (必須)
[tags] 付与するタグ(複数の場合は,で区切る)
[time] 記録する変更時間
[title] アイテムのタイトル
既読にする[action] archive (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
未読にする[action] readd (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
お気に入りにする[action] favorite (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
お気に入りを解除[action] unfavorite (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
アイテムの削除[action] delete (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
タグの追加[action] tags_add (必須)
[item_id] アイテムのID (必須)
[tags] 追加するタグ(複数の場合は,で区切る) (必須)
[time] 記録する変更時間
タグの削除[action] tags_remove (必須)
[item_id] アイテムのID (必須)
[tags] 削除するタグ(複数の場合は,で区切る) (必須)
[time] 記録する変更時間
タグの置換
(タグを全て削除して、新しくタグを追加)
[action] tags_replace (必須)
[item_id] アイテムのID (必須)
[tags] 追加するタグ(複数の場合は,で区切る) (必須)
[time] 記録する変更時間
タグの全削除[action] tags_clear (必須)
[item_id] アイテムのID (必須)
[time] 記録する変更時間
タグのリネーム[action] tag_rename (必須)
[item_id] アイテムのID (必須)
[old_tag] リネーム前のタグ (必須)
[new_tag] リネーム後のタグ (必須)
[time] 記録する変更時間

例えば、pocketのID:999999のアイテムの、hatebumanというタグをfunassyiに変換するには、次のようにactionsのパラメータを作成します。

//多次元の連想配列を用意する
$action = array(
	array(
		'action' => 'tag_rename',
		'item_id' => '999999',
		'old_tag' => 'hatebuman',
		'new_tag' => 'funassyi',
	),
);

//多次元の連想配列をJSONデータに変換する
$json = json_encode($action);

はたまた、pocketのID:888888のアイテムの既読状態を未読状態に直すには、次のようにactionsのパラメータを作成します。

//多次元の連想配列を用意する
$action = array(
	array(
		'action' => 'readd',
		'item_id' => '999999',
	),
);

//多次元の連想配列をJSONデータに変換する
$json = json_encode($action);

もちろん、2つのアクションを同時に指定することも可能です。配列の中身を随時、増やせばいいだけですねー。

//多次元の連想配列を用意する
$action = array(
	array(
		'action' => 'tag_rename',
		'item_id' => '999999',
		'old_tag' => 'hatebuman',
		'new_tag' => 'funassyi',
	),
	array(
		'action' => 'readd',
		'item_id' => '999999',
	),
);

//多次元の連想配列をJSONデータに変換する
$json = json_encode($action);

5-3pocketにアイテムを追加するサンプルプログラム

以上を踏まえたサンプルプログラムを用意しました。$consumer_key$access_tokenを設定してアクセスしてみて下さい。起動すると、このサイトの3つのページがpocketに追加されるはずです。その後、不要でしたら削除して下さい…。

<?php
//設定項目
$consumer_key = "";	//コンシューマーキー
$access_token = "";	//アクセストークン

//多次元の連想配列を用意する
$action = array(
	array(
		'action' => 'add',
		'url' => 'http://syncer.jp/jquery-to-top-button',
	),
	array(
		'action' => 'add',
		'url' => 'http://syncer.jp/hatebu-api-matome',
	),
	array(
		'action' => 'add',
		'url' => 'http://syncer.jp/web-logo-page',
	),
);
 
//作成した連想配列をJSON形式に変換
$json = json_encode($action);
 
//アイテム変更のリクエストをPOSTメソッドで送る
$result = @file_get_contents(
	"https://getpocket.com/v3/send",
	false,stream_context_create(array('http' => array(
		'method' => 'POST',
		'content' => http_build_query(array(
			"actions" => $json,
			"consumer_key" => $consumer_key,
			"access_token" => $access_token,
		)),
	)))
);

//返ってきたJSONデータをオブジェクト形式に変換
$obj = json_decode($result);

//成功判定
if(!isset($obj->status) || !$obj->status){
	echo '追加に失敗しました…。';
	exit;
}

//結果を出力
echo 'リクエストに成功しました!';

Retrieveの権限」でアイテムを読み込むことで、アイテムIDを取得できます。この「アイテムID」を利用して、「追加」以外のModifyの権限のアクションを試してみて下さいね!

6pocketのAPI周りの情報いろいろ

使用制限やエラーコードなど、pocketのAPIを利用する上で役に立つ、関連情報を紹介します。

6-1レートリミット(使用制限)について

現在、pocketのAPIには、下記の通りレートリミット(使用制限)が定められています。通常の使用では超えることのない回数ですが、意識はしておきましょう。

Rate Limits pocket

レートリミットの内容

対象回数
1ユーザー (アクセストークン)1時間につき320回
1アプリケーション (コンシューマーキー)1時間につき10,000回

例えば、あなたが作ったアプリに、AさんとBさんというユーザーがいて、彼らは1時間につき320回ずつしか、あなたのアプリを通してAPIを利用できません。が、あなたのアプリの方は合計10,000回、APIを利用することができるため、AさんとBさんがフルで使っても、残り9,360回、APIを利用(提供)することができるわけです。

仮にレートリミットを超えた場合、最初の使用から1時間後の時点になるまで、APIを利用することができなくなります。

レートリミットの確認方法

レートリミットはAPIリクエストを送った際のレスポンスヘッダーの中に含まれています。PHPで説明すると、リクエストを送った後、自動的に配列の$http_response_headerに、次のように格納されます。配列のうち、キーの10〜15番目(赤文字)に含まれているのがレートリミットの情報です。

例えばRetrieveのサンプルプログラムだったら、26行目にecho $http_response_header[11];を加えて起動してみて下さい。X-Limit-Key-Remaining: 9995が表示されるはずです。

レスポンスヘッダーの各キーの説明

対象回数
[10] X-Limit-Key-Limitアプリの最大使用回数 (10,000回)
[11] X-Limit-Key-Remainingアプリの残り使用回数 (9,995回)
[12] X-Limit-Key-Resetアプリの回数リセットまでの秒数 (3,540秒)
[13] X-Limit-User-Limitユーザーの最大使用回数 (320回)
[14] X-Limit-User-Remainingユーザーの残り使用回数 (315回)
[15] X-Limit-User-Resetユーザーの回数リセットまでの秒数 (3,540秒)

6-2ステータスコードについて

レスポンスヘッダーの1つ目のキー(0番)にはステータスコードの情報が格納されています。ステータスコードは、APIリクエストが成功したのか、また、エラーだったのなら何がいけなかったのか、を判断する情報となります。例えば下記、200だったら「リクエストは成功」です。

pocket APIのステータスコードの詳細は、下記の公式ドキュメントで確認することができます。APIのリクエストが上手くいかない場合は、エラーになる原因を、ステータスコードをヒントに探しましょう。

Response, Status, and Error Codes pocket

ステータスコードの一覧

コード説明
200Request was successful
リクエストの成功
200リクエストが成功
401ユーザーのアクセストークンが不正
403ユーザーがアプリを認証していない
503pocketのサーバーがダウンしている

7pocketのAPIを利用して制作されたwebサービスの事例いろいろ

最後に、pocketのAPIを利用して制作されたwebサービスを紹介します。「何かを作りたくなる!」と、制作欲求を刺激される素晴らしい作品ばかりです!

7-1RandomPocket

RandomPocket
RandomPocket

現在は閉鎖されています。pocketに入れたアイテムの中から、未読の記事をランダムで表示してくれるwebサービスです。「”あとで読む”は”一生読まない”説」を主張する私としては、こういった振り返る「きっかけ」を提供してくれるwebサービスは物凄く素晴らしいと思いました。

ついカッとなってPocketの未読記事をランダムに読めるWebサービス「RandomPocket」をつくりました。 CreativeStyle

Pocket の未読記事をランダム表示してくれる RandomPocket WWW WATCH
RandomPocketを紹介している記事がありました!

7-2RocketSS

RocketSS
RocketSS

登録したRSSの新着記事を、自動でpocketに送ってくれるwebサービスです。pocketユーザーは、これがあれば、RSSと「おさらば」できちゃいますね。

Rss to PocketというWEBサービスを公開しました 混沌とした備忘録

RocketSSにサービス名を変更しました 混沌とした備忘録

7-3Lisgo

Lisgo
Lisgo

こちらはiPhoneアプリです。Lisgoはpocketに登録してあるアイテムを、音声で読み上げてくれるサービスです。「読む」って行為はそれだけに時間を使わなければならず、多くの場合「やらず終い」になりますが、音声で読み上げてくれるなら、他の何かをやりながら「ついでに」記事を消化していけます。素晴らしいアイデアだと思います。

Lisgo - Listen to It Later App for Pocket Lisgo

Lisgo iTunes

【耳で読む】Pocketの記事を音読してくれるiPhoneアプリ「Lisgo」 HACK-A-SPACE
Lisgoの紹介記事がありました。

7-4Pinpockit

Pinpockit
Pinpockit

pocketに登録してあるアイテムを、Pinterest風に表示するwebサービスです。「より見やすく」だとか、「〜風に」だとか、見栄えを変えるだけでも立派なサービスになりますよね!

Pinpockit Pinpockit

7-5IFTTT

IFTTT
IFTTT

pocketのAPIを利用したwebサービスとして「IFTTT」も忘れてはいけませんよね。「pocketしたら○○をする」「○○をしたらpocketする」といった、「他のwebサービスとの連携」をサポートするために、APIを利用するのも有用ですねー。そういえば、はてブをするとpocketしてくれる連携サービスってないんですね…。

IFTTT IFTTT

8はてブをするとpocketしてくれるPHPプログラム

…ということで、ひょんなことから、「はてブ」と「pocket」を連携する簡単なPHPプログラムを作成してみました!レンタルサーバーなど利用していてサーバー環境のある人は、よろしかったら使ってみて下さい。

「はてなブックマーク」でブックマークをすると、Web Hook経由で、このプログラムにリクエストが送られて、このプログラムがpocketのアイテムに「はてブしたURL」を追加する、という仕組みです。

8-1はてなブックマーク側のWeb Hookの設定

Web Hookの設定
Web Hookの設定

はてなブックマークのWeb Hookについては、下記の記事の第9章をご参考下さい。上記図のように、「ブックマークの追加/更新/削除」にチェックを入れて下さいね。

はてなブックマークの「Web Hook」について Syncer

8-2PHPプログラム

下記のプログラムを、hatebu-pocket.phpとして、サーバー上に設置して下さい。URLはWeb Hookの設定と合わせて下さいね!なお、pocketのアプリのパーミッションはAddのみで大丈夫です。

<?php
//はてブで、設定したweb hookのキー
$webhook = '3OC0RB3W8C6W5RPM';

//pocketアプリのコンシューマーキー
$consumer_key = '';

//pocketのアクセストークン
$access_token = '';

//タグを付けておきたい場合に指定(複数の場合は半角カンマで区切る)
$tags = "はてブ";

//Web Hookによるリクエストを受け取る(ブクマの追加以外は排除)
if(!isset($_POST['status']) || $_POST['status'] != 'add') exit;

//キーが合わなければ終了
if(!isset($_POST['key']) || empty($_POST['key']) || $_POST['key'] != $webhook) exit;

//ブックマークしたURLを取得
$obj = simplexml_load_string(@file_get_contents('http://b.hatena.ne.jp/'.$_POST['username'].'/rss?'.time()));
if(!$url = (string)$obj->item[0]->link) exit;

//pocketに追加する
file_get_contents(
	"https://getpocket.com/v3/add",
	false,stream_context_create(array('http' => array(
		'method' => 'POST',
		'content' => http_build_query(array(
			"url" => $url,
			"tags" => $tags,
			"consumer_key" => $consumer_key,
			"access_token" => $access_token
		))
	)))
);

8-3使用イメージ

利用したイメージ
利用したイメージ

はてブをしたページが、自動的にpocketに追加されるようになります。指定したタグもちゃんと反映されていますね。「これで”はてブ”に対応してないIFTTTなんか要らない!」は言い過ぎでしょうか…?

APIって本当に面白いですよね。この記事が、ほんの少しでも、みなさんのWebサービスの制作欲を刺激することになったら幸いです。読んでいただけた方、ありがとうございました!

この記事へのコメント

感想、ご指摘などお気軽にお寄せ下さい。「関連記事を書いた」という方はご報告いただければリンクします。

コメントを書き込む

  • コメント

※Twitter、Facebook、はてな、いずれかのアカウントをお持ちの方は、本人認証(ログイン)を行なうことができます。
※本人認証をすることで、書き込みの待ち時間なし、画像アップロード、アイコンなどが利用できます。
※認証時にサービスと連携しますが、名前とアイコン以外の情報を読み込んだり、また書き込みを行なうことはありません。連携で要求する権限は「公開情報の読み取り」のみです。

現在、1件のコメントがあります。

あらゆ あらゆ
2014.06.24 07:17

はてブに続いて、pocket版を作成してみました! 自分もまだまだ分からないことばかりですが、こうやってまとめていくことで、勉強になります。 もし不明な点などありましたら、このコメント欄で気軽に教えて下さい。

記事の更新履歴

  • 記事を公開しました。
    2014/06/24 07:00

ブログの著者について

あらゆ

Yuta Arai(あらゆ)

足立区竹ノ塚在住の1982年生まれ。ウェブとラーメンが大好きです。
info@syncer.jp