はてなAPIをPHPで取得すると503エラーになる問題の対処方法
はてなブックマークの新着エントリを取得する 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);