はてなブックマークの人気エントリー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>' ;
}
?>
##しかし、ブラウザから直接APIのURLを叩いて確認すると、問題なく表示される
#原因を調べたところ
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) ) ;