#084
posted on 2022.11.27 (Sun)

外部サイトのRSSを取得して自サイトに一覧で表示。

CATEGORY

外部サイトのRSSを取得して、自サイト内に一覧で表示したかったので、PHPで実装した方法のメモ。

 

[ JavaScriptで実装する場合 ] (PHPなどサーバーサイドでの実装ではなく、フロントエンドで実装する場合)

最近のブラウザはセキュリティーが厳重なためクロスオリジンリクエストに制約があり、JavaScriptで実装する場合は、以下のCORS(Cross-Origin Resource Sharing)の対処が必要。

  1. クライアント側でクロスオリジンリクエストを許可する設定
    JavaScriptの処理にクロスオリジンリクエストを許可するオプションを指定。(Fetchなら「mode: ‘cors’」のオプション設定。)
  2. サーバー側でクロスオリジンリクエストを許可する設定
    RSS配信サイト側がHTTPレスポンスのヘッダーに「‘Access-Control-Allow-Origin’」を設定していて、呼び出し元のドメインからのアクセスを許可している必要がある。(リクエスト先がクロスオリジンリクエストを許可していることをブラウザが確認するために必要なヘッダー情報。)

※ 現状、「‘Access-Control-Allow-Origin’」にワイルドカードを設定して全てのドメインからのクロスオリジンリクエストを許可しているサイトは無さそうなので、現実的にJavaScriptでは実装できない。

※ このクロスオリジンの制約はブラウザの仕様なので、ブラウザを介する前にサーバーサイドで処理すれば回避できる。

オリジン

オリジンは、ウェブコンテンツへのアクセスに使われる「URLのスキーム」(プロトコル)、「ホスト」(ドメイン)、「ポート番号」の3つによって定義される。

リクエスト元とリクエスト先のオリジンが同じ場合は「同一オリジン」、オリジンの定義のひとつでも異なる場合は「クロスオリジン」となる。

操作する内容によっては同一オリジンでのみ許可されているが、リモート側が特別なヘッダー情報を送信することでクロスオリジンでも許可することができる。このヘッダー情報によって、クロスオリジンリクエストでもフロントエンドのJavaScriptコードがアクセスすることを許可するシステムを「CORS」(Cross-Origin Resource Sharing)と呼ぶ。

 

 

PHPでRSSを取得してHTMLに整形して出力

PHPで、RSSのURLから返されるXMLを取得してオブジェクトに変換し、HTMLに整形して出力する。

  1. 「simplexml_load_file()」関数を使って、XMLデータを取得してオブジェクトに変換。
  2. キーを指定してオブジェクトから値を取得。
  3. HTMLコードにして出力。

※ XMLの記述の中で「名前空間が指定されている要素」を取得するには、PHPの「children()」メソッドを使用する。(「ドキュメント内で使用されている名前空間」を取得したい場合は「getNamespaces()」メソッドを使用する。)

※ 下記は、noteの一覧ページのRSSからサムネイルやタイトルを取得して表示する場合。

//RSS配信先からXMLデータを取得
$rss_url = '取得したいRSSのURL';
$data_obj = simplexml_load_file($rss_url);

if($data_obj){
  //取得したいitemの数
  $max_item_num = 10;

  //itemの配列を保持
  $items = $data_obj->channel->item;

  //HTMLに出力
  echo '<ul>';
  for($i = 0; $i < $max_item_num; $i++){
    //RSSに含まれる投稿数が取得したい数より少なければbreakして抜ける
    if(!$items[$i]) break;

    $item_link = $items[$i]->link;
    $item_thum_url = $items[$i]->children('media', true)->thumbnail;
    $item_date = date('Y.m.d (D)', strtotime($items[$i]->pubDate));
    $item_title = $items[$i]->title;
    echo '<li>';
    echo '<a href="'.$item_link.'">';
    echo '<img src="'.$item_thum_url.'">';
    echo '<span>'.$item_date.'</span>';
    echo '<h3>'.$item_title.'</h3>';
    echo '</a>';
    echo '</li>';
  }
  echo '</ul>';
}

simplexml_load_file(XMLファイル) : 指定したファイルの中のXMLドキュメントをオブジェクトに変換して返す。失敗した場合は「false」を返す。 

children(‘XMLの名前空間’, プレフィックスの指定) : 指定した名前空間のSimpleXMLElement要素を返す。ノードが属性である場合は「null」を返す。プレフィックスの指定が「true」の場合は指定された名前空間をプレフィックスとして扱い、「false」の場合は名前空間URLとして扱う。

date(‘フォーマット’, ‘Unixタイムスタンプ’) : 指定したタイムスタンプを指定したフォーマットの文字列で返す。タイムスタンプの指定が無い場合、デフォルトタイムゾーンでの現在時刻(「time()」の値と同じ)が使用される。

strtotime(‘英文形式日付’) : 日付をUnixタイムスタンプに変換して返す。

 

 

この記事のURL

https://memo.ag2works.tokyo/post-5099/

Copyコピー
この記事のタイトル

外部サイトのRSSを取得して自サイトに一覧で表示。 | memo メモ [AG2WORKS]

Copyコピー
この記事のリンクタグ

<a href="https://memo.ag2works.tokyo/post-5099/" target="_blank" rel="noopener">外部サイトのRSSを取得して自サイトに一覧で表示。 | memo メモ [AG2WORKS]</a>

Copyコピー
※ フィールドをクリックでコピーするテキストの編集ができます。

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)