はてなAPIをPHPから叩くと503エラーになる問題の対処方法

2016年5月10日

はてなAPIの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

この問題の調査と解決方法の記録です。

目次

  1. curl コマンドやブラウザからだと正常応答
  2. ユーザーエージェントが不足しているのが原因っぽい
  3. file_get_contents に UserAgent ヘッダを追加

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);

-技術ブログ
-