PHP
api
はてなブックマーク
userAgent
はてなAPI

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

More than 3 years have passed since last update.

はてなブックマークの人気エントリー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) ) ;