LoginSignup
7
5

More than 5 years have passed since last update.

はてなのAPIを使う際に503エラーが出る問題と解決策

Posted at

はてなブックマークの人気エントリーRSSを表示するAPIを使って何か作りたい
下記のサイトを参考に動かしてみたのですが上手く動かなかった!

ということで、原因と対策を書いておきます。

参考にしたサイト

https://syncer.jp/hatebu-api-matome#sec-2
こちらのサイトを参考にPHPでRSSの取得をしようとしたところ

<?php

    // 取得するフィードURLを指定
    $feed = 'http://b.hatena.ne.jp/hotentry?mode=rss' ;

    // フィードを取得してオブジェクトに変換
    $obj = simplexml_load_string( @file_get_contents( $feed ) ) ;

    // エラー判定
    if( !$obj || !isset( $obj->item ) || empty( $obj->item ) )
    {
        echo '<p><a href="' . $feed . '" target="_blank">フィード</a>を取得できませんでした…。</p>' ;
    }
    else
    {
        // HTML
        $html = '' ;

        // 個々のエントリーを読み込んでいく
        foreach( $obj->item as $item )
        {
            // 各値の整理
            $url = (string)$item->link ;                                    // URL
            $date = $item->children( 'dc' , true )->date ;                  // エントリーの日付
            $title = (string)$item->title ;                                 // タイトル
            $category = $item->children( 'dc' , true )->subject ;           // カテゴリ
            $count = $item->children( 'hatena' , true )->bookmarkcount ;    // ブクマ数

            // 日付の整形
            $date = date( 'Y/m/d H:i:s' , strtotime( $date ) ) ;

            // HTML
            $html .= '<dd>' ;
            $html .=    '[' . $category . '] - ' . $title . ' (' . $date . ') ' . $count . 'users' ;
            $html .=    '<br><a href="' . $url . '" target="_blank" rel="nofollow">' . $url . '</a>' ;
            $html .= '</dd>' ;
        }

        // 出力
        echo '<h2>実行結果</h2>' ;
        echo '<dl>' ;
        echo    '<dt>取得したフィード</dt>' ;
        echo        '<dd><a href="' . $feed . '" target="_blank">' . $feed . '</a></dd>' ;
        echo    '<dt>取得結果</dt>' ;
        echo        $html ;
        echo '</dl>' ;
    }

?>

エラーが発生

kako-BjrC88bNOEN6Rtf5.png

しかし、ブラウザから直接APIのURLを叩いて確認すると、問題なく表示される

スクリーンショット 2016-03-10 8.13.07.png

原因を調べたところ

http://q.hatena.ne.jp/1451205850
ユーザーエージェントが不足しているのが原因のよう

対策

リクエストのヘッダーにユーザーエージェントを追加すると正しく取得できました。

$options = array(
      'http' => array(
        'header' => 'from_rss_application',
      ),
    );
    $context = stream_context_create($options);

    // フィードを取得してオブジェクトに変換
    $obj = simplexml_load_string( @file_get_contents( $feed ,false,$context) ) ;
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5