7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?