小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


PHPでPocketの登録数を取得してみたよ。

f:id:replication:20140822012610p:plain

2014.08.22追記

Please do not scrape this for the Pocket count.って書いてあった。
この方法は使っちゃダメみたいですね。

はじめに

自分の書いた記事がPocketでどのくらい登録されているかを調べたい人がいるかもしれないので、PHPでPocketの登録数を取得する方法を紹介します。

Pocketの登録者数を調べる

ブログパーツなどで利用されている。Pocket登録ボタンだけど、このボタンを生成しているJavascriptのソースを辿っていくとわかるんだけどそのJavascriptのソースでは、非同期にHTMLを取得してきて、ブログに表示するようになっている。このHTMLには登録数が書いてあるタグがある。結論的にはその、pocketのjavascriptが読み込んできたHTMLをクロールするといいわけだ。

RubyでPocketの登録数を取得する方法 | メモ帳代わりのブログRubyでPocketの登録数を取得する方法 | メモ帳代わりのブログ

Pocketのウィジェットから登録者数を調べる

試しにhttps://www.google.co.jp/の登録者数をPocketのAPIで調べてみます。

すると、以下のような画像とテキストが表示されます。
f:id:replication:20140822013028p:plain

これをPHPでスクレイピングしてみます。

<?php

$sample_url = 'https://www.google.co.jp/';
 
$apiURL = 'https://widgets.getpocket.com/v1/button?label=pocket&count=vertical&align=left&v=1&url='.rawurlencode($sample_url).'&src='.rawurlencode($sample_url).'&r=70462244';

$html = file_get_contents( $apiURL );
print $html;
?>

すると、以下のようなHTMLがとれます。

<html>
<head>
<link rel="stylesheet" type="text/css" href="https://d7x5nblzs94me.cloudfront.net/v1/c/button.css?v=6" />
<script type="text/javascript" src="https://d7x5nblzs94me.cloudfront.net/v1/j/shared.js?v=2"></script>
</head>
<body>

<div class="widget vertical pocket left">
	<a id="btn">
				<!-- 
		Please do not scrape this for the Pocket count. 
		It is not relible for you to use and will likely change. 
		Contact us at api@getpocket.com for an official API. 
		Thanks! 
		-->
		<span><em id="cnt">11167</em><i></i><u></u></span>
				<b></b>
	</a>
</div>

<script type="text/javascript">
var POCKET_DOMAIN = 'getpocket.com';
var iLi = false;

var btnData = {"url":"https:\/\/www.google.co.jp\/","ct":"668866439d1b8fbb6111a972770da8cc2b390fbe","ctn":"55e98aa2ca37b9e3213792dbfde04f7967ce881d","label":"pocket","count":"vertical","src":"https:\/\/www.google.co.jp\/"};
</script>
<script type="text/javascript" src="https://d7x5nblzs94me.cloudfront.net/v1/j/button.js?v=4"></script>
</body>
</html>

<em id="cnt">11167</em>の部分をスクレイピングして、登録数のみ取得したい場合は、一度xmlに変換してパースすると良いです。

<?php

$sample_url = 'https://www.google.co.jp/';
 
$apiURL = 'https://widgets.getpocket.com/v1/button?label=pocket&count=vertical&align=left&v=1&url='.rawurlencode($sample_url).'&src='.rawurlencode($sample_url).'&r=70462244';

$html = file_get_contents( $apiURL );
$domDocument = new DOMDocument();
//print $html;
$domDocument->loadHTML($html);
$xmlString = $domDocument->saveXML();
$xmlObject = simplexml_load_string($xmlString);
//var_dump($xmlObject);

$array = json_decode(json_encode($xmlObject), true);
// 登録者数
$registNum = (string)$array['body']['div']['a']['span']['em'];
print $registNum;

?>