phpでinstagramをスクレイピングして更新時刻を得る

 instagramのAPIは自分のアカウントの情報しか得られないらしいが、サブアカウントの更新情報を更新情報ページに反映させたい。

 ならソースコードを見ればいいかと思ったが、大部分はJavaScriptで書かれているので、そのままではいかなそう。
 ふとスクレイピングという単語を思い出し、「instagram スクレイピング」で検索。
blog.xin9le.net

 なるほど、JavaScriptの変数にJsonとやら(名前は知っていた)の形式で書かれているらしい。Jsonはphpで簡単に扱えるらしい。

 で、作ったのが以下。エラー処理はテキトー。

<?php
<?php
echo get_update_date('doroyamada_x');
echo "\n";

function get_update_date($account){
	$source = file_get_contents("https://www.instagram.com/$account/");
	$rex_pre = preg_quote('<script type="text/javascript">window._sharedData = ','/');
	$rex_post = preg_quote(';</script>','/');

	if(preg_match("/$rex_pre(.+?)$rex_post/",$source,$temp) == 1){
		$json = json_decode($temp[1]);
		$time_unix = $json->entry_data->ProfilePage[0]->graphql->user->edge_owner_to_timeline_media->edges[0]->node->taken_at_timestamp;
		return date('Y/m/d H:i',$time_unix);
	}else{
		return FALSE;
	}
}
?>

 これを調べる過程でpreg_quoteという関数と最短マッチというテクニックを知った。

 最小マッチを使わなければ [^\<]+ とでも書くところ。