はてなブックマークの新着エントリを取得する API を、以下のように PHP の file_get_contents()
を使って叩いていたのですが、この間久しぶりにこのプログラムを実行してみたら 503 エラーが返ってくるようになっていました。
$url = 'http://b.hatena.ne.jp/entrylist/json?url=' . rawurlencode('http://example.com');
$jsonp = file_get_contents($url);
実行結果「503 Service Temporarily Unavailable」が返ってきています。
PHP Warning: file_get_contents(http://b.hatena.ne.jp/entrylist/json?url=http%3A%2F%2Fexapmle.com): failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable
この問題の調査と解決方法の記録です。
目次
curl コマンドやブラウザからだと正常応答
APIの仕様が変わったのかな、と curl を叩いてみると、正常に応答が返ってきました。PC のブラウザからも大丈夫。
$ curl http://b.hatena.ne.jp/entrylist/json?url=http%3A%2F%2Fexample.com
([{"link":"https://example.com/","count":"3","title":"example.com"}]);
ユーザーエージェントが不足しているのが原因っぽい
検索してみると同じ問題に遭遇している方がいらっしゃいました。
はてなブックマークの RSS を Ruby で取得していたのですが、この頃 503 エラーが出るようになってしまい正しく取得出来ません | 人力検索はてな
どうやら UserAgent を偽装すると取得できる模様。2016年の3月頃に仕様が変わったのでしょうか。
file_get_contents に UserAgent ヘッダを追加
以下のPHP マニュアルを参考に UserAgent ヘッダを追加したところ、これまで通り正常に取得できるようになりました。UserAgent 文字列は適当なもので大丈夫です。
$options = [
'http' => [
'header' => 'User-Agent: Entrylist crawler',
],
];
$context = stream_context_create($options);
$url = 'http://b.hatena.ne.jp/entrylist/json?url=' . rawurlencode('http://example.com');
$jsonp = file_get_contents($url, false, $context);