PocketのAPIが見当たらない
公式のSNSのシェアボタンをホームページやブログに設置すると重くてページの表示速度が遅くなるので、軽くて速く表示できるように自作のSNSボタンの作成にチャレンジしています。
それにPocketのストック数を表示させようと思っていいたのですが、Pocketのカウントを取得しようと公式APIを探しまくったのですが、ページをストックするためのAPIは存在するものの、特定のページがストックされたカウント数が取得できるAPIは現在存在していないみたいで見つかりませんでした。カウント付のSNSシェアボタンを自作しようとしているのですが、唯一できそうなのは公式シェアボタンのHTMLからカウント数をWEBスクレイピングで抜き出すという方法を今回試すことにしました。できれば非同期で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 で取得した場合
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 で取得する場合
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); ?>
取得できたけど遅い...。
上記のソースでどちらも同じシェア数が取得できましたが、それぞれのテストページを作り、GTmetrixで計測してみたところ、Pocketのシェア数を取得するだけなのにどちらも約1.4~2秒かかっていました。(cURLの方が平均200msくらい速かったです。)ページの表示スピードを速くするために作ったのですが、正直使い物になりません...。公式のシェアボタンを表示するだけで約1.2秒と、そもそも遅いし、それを丸ごと読み込んで変換しているわけですから当然といえば当然ですよね。非同期で実行できるように、このPHPをJavascriptから実行すれば多少マシになるかもしれません。試していませんがjQueryで簡単にできるっぽいです。
Pocket側が仕様を変えることがあるので注意
現時点のPocketボタンに合わせて書いたソースですが、Pocketボタンの仕様が変わるとエラーが出たり数値が表示できなくなる可能性がありますので注意してください。
参考にさせていただいたページ
- https://marubon.info/method-to-get-pocket-share-count-5319/
- https://tek2tech.com/social-share-counters-wo-js-api/
- http://blog.katty.in/1400