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という関数と最短マッチというテクニックを知った。
最小マッチを使わなければ [^\<]+ とでも書くところ。