PHPでPocketの公式ボタンからストックされたカウント数だけを取得する

PocketのAPIが見当たらない

公式のSNSのシェアボタンをホームページやブログに設置すると重くてページの表示速度が遅くなるので、軽くて速く表示できるように自作のSNSボタンの作成にチャレンジしています。

それにPocketのストック数を表示させようと思っていいたのですが、Pocketのカウントを取得しようと公式APIを探しまくったのですが、ページをストックするためのAPIは存在するものの、特定のページがストックされたカウント数が取得できるAPIは現在存在していないみたいで見つかりませんでした。

公式ボタンからカウント数をを抜き出す

カウント付のSNSシェアボタンを自作しようとしているのですが、Pocketについては唯一、公式シェアボタンのHTMLからカウント数をWEBスクレイピングで抜き出すという方法しかなさそうです。今回はこれをPHPでやってみたいと思います。

Pocket公式ボタン

できれば非同期でJSONからJavascriptで取得したいところですが、PHPで行う以外の方法が見当たりませんでしたので、今回はPHPで行ってみました。

公式のシェアボタン

Pocketの公式シェアボタンは以下ページから設置用のソースを取得できます。

ちなみにこのページに設置した例(表示されているのはこのページのシェアカウント)

PHPのコード

さて、本題です。上記のシェアボタンの数の部分を抜き出すPHPコードです。2通り作ってみました。例としてAppleのホームページ(https://www.apple.com/jp/)のシェア数を取得するように書いています。

file_get_contents で取得する場合

<?php
//Pocket
function get_pocket_count1($url) {

$url = urlencode($url);
//指定されたURLのPocketボタンを取得するクエリ $query = 'https://widgets.getpocket.com/v1/button?v=1&count=horizontal&url='.$url.'&src='.$url;
//HTTPでアクセスし、Pocketボタンのソースを取得 $html = file_get_contents($query);
//DOMパーサーを作成 $dom = new DOMDocument('1.0', 'UTF-8');
//余分な空白は削除 $dom->preserveWhiteSpace = false;
//PocketボタンのHTMLソースを読み込む $dom->loadHTML($html);
//XPathパーサーを作成 $xpath = new DOMXPath($dom);
//XPathでブックマーク数にあたる要素を取得 $count = $xpath->query('//em[@id = "cnt"]')->item(0);
//当該要素の中身が存在すれば、その数字を返し、存在しなければ0を返す $count = strval($count->nodeValue);
//3桁区切りのカンマを削除 $count = str_replace(',','',$count);
//数値に変換 $count = intval($count);
return isset($count) ? intval($count) : 0;
}
//カウント数を取得したい対象URL $url = 'https://www.apple.com/jp/';
echo $url.'のPocketシェアカウント→ '.get_pocket_count1($url);
?>

cURL で取得する場合

<?php
//Pocket
function get_pocket_count2($url) {

$url = urlencode($url);
//指定されたURLのPocketボタンを取得 $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,"https://widgets.getpocket.com/v1/button?v=1&count=horizontal&url=$url&src=$url"); curl_setopt($ch,CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch);
//PocketボタンのHTMLソースを読み込みXMLパーサーを作成 $dom = new DOMDocument('1.0', 'UTF-8'); $dom->preserveWhiteSpace = false; $dom->loadHTML($html); $xmlString = $dom->saveXML(); $xmlObject = simplexml_load_string($xmlString);
//XMLをJSONに変換 $array = json_decode(json_encode($xmlObject), true);
//配列からカウント数を文字列として取り出す $count = strval($array['body']['div']['a']['span']['em']); //3桁区切りのカンマを削除 $count = str_replace(',','',$count); //数値に変換 $count = intval($count)
return isset($count) ? intval($count) : 0;
};
//カウント数を取得したい対象URL $url = 'https://www.apple.com/jp/';
//カウント数表示 echo $url.'のPocketシェアカウント→ '.get_pocket_count2($url);
?>

テスト結果

上記のソースで実際に取得しているカウント数です。どちらも同じ数字を取得できています。

file_get_contents で取得した場合

https://www.apple.com/jp/のPocketシェアカウント→ 4754

cURL で取得する場合

https://www.apple.com/jp/のPocketシェアカウント→ 4754

取得できたけど遅い...。

上記のソースでどちらも同じシェア数が取得できましたが、それぞれのテストページを作り、GTmetrixで計測してみたところ、Pocketのシェア数を取得するだけなのにどちらも約1.4~2秒かかっていました。(cURLの方が平均200msくらい速かったです。)ページの表示スピードを速くするために作ったのですが、正直使い物になりません...。

公式のシェアボタンを表示するだけで約1.2秒。1秒以下を期待してしていたのですが残念。そもそも遅い公式ボタンを丸ごと読み込んで変換しているわけですから当然といえば当然ですよね。非同期で実行できるように、このPHPをJavascriptから実行すれば多少マシになるかもしれません。試していませんがjQueryで簡単にできるっぽいです。

Pocket側が仕様を変えることがあるので注意

現時点のPocketボタンに合わせて書いたソースですが、Pocketボタンの仕様が変わるとエラーが出たり数値が表示できなくなる可能性がありますので注意してください。

参考にさせていただいたページ

 

前へ

コマンドプロンプトからWindowsの機能をいろいろ起動する方法のメモ。

次へ

2019年1月のWindows Update 月例ロールアップ (Windows10/8.1/7)