BLOG

【PHP】アメブロRSSでブログ記事を取得してサイトに埋め込む方法

2020.12.25
TECH

ハコザキです。
今回はアメブロRSSでブログ記事を取得してサイトに埋め込む方法をご紹介します!

はじめに

アメブロのRSSについては下記のURLで取得できるようになっております。

http://rssblog.ameba.jp/{アメブロのID}/rss20.xml

私のこちらのアメブロのRSSを取得する場合、
アメブロIDはhako-mavsなので下記のようになります。

http://rssblog.ameba.jp/hako-mavs/rss20.xml

このようなxmlファイルが出力されると思います!

今回はこのxmlを利用してPHPでコンテンツを生成したいと思います。

使い方

埋め込むファイルと同階層にblog.phpを作成し、下記コードを記載します。

<?php
/**
 * アメブロの新着記事を取得するクラス
 *
 * @param string $userId アメブロアカウント
 * @param integer $limit 取得する記事の数
 */
class Blog
{
    private $userId = '';
    private $rssUrl = '';
    private $limit = 5;
    public function __construct($userId, $limit) {
        $this->userId = $userId;
        $this->limit = $limit;
        $this->rssUrl = 'http://rssblog.ameba.jp/'. $this->userId .'/rss20.xml';
    }

    /**
     * curlでURL叩く
     *
     * @param string $url 対象URL
     * @param integer $timeout タイムアウト秒数
     * @return object rss
     */
    private function curlGetContents($url, $timeout = 60)
    {
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_HEADER, false );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
        $result = curl_exec( $ch );
        curl_close( $ch );
        return $result;
    }

    /**
     * アメブロの対象記事情報を取得
     *
     * @return array 記事情報
     */
    public function getAmebaContents()
    {
        // xml処理のエラーを有効
        libxml_use_internal_errors(true);
        $results = [];
        // URLを叩く
        $rss = $this->curlGetContents($this->rssUrl);
        // 文字列をオブジェクトとして生成
        $rssXml = simplexml_load_string($rss);
        // 取得失敗の場合は空
        if ($rssXml === false) {
          return $results;
        }
        foreach($rssXml->channel->item as $item) {
            // 指定件数まで取得したかどうか
            $isLimit = $this->limit >= 0 && count($results) >= $this->limit;
            if( $isLimit ){
                continue;
            }
            // 日付のフォーマット
            // Thu, 24 Dec 2020 18:33:12 +0900 → 2020.12.24
            $pubDate = new DateTime($item->pubDate);
            $item->pubDate = $pubDate->format('Y.m.d');
            
            // 結果用配列へ格納
            $results[] = $item;
        }
        return $results;
    }
}

このクラスを元に、埋め込みたい場所でインスタンスを生成することでサイトに表示できるようになってます。
ざっくりとした流れは下記の通りです。

  • アメブロIDと取得したい件数をプロパティとする
  • アメブロIDを元に最初に説明したURLを生成
  • cURLでURLを叩き、記事情報を取得
  • 記事情報を加工し、取得したい件数になるまで返すための配列に格納
  • 配列を返す

あとは埋め込みたいファイルで

  • アメブロIDと取得件数を引数としてインスタンスを生成
  • getAmebaContents()で記事コンテンツを取得
  • 記事の有無で表示切り替え

このように処理を記載していけばサイトにアメブロの記事を埋め込むことができます!!

// アメブロ記事を出すアカウント名
define("AMEBLO_ID", "hako-mavs");

// 記事を1件表示
$testBlog = new Blog(AMEBLO_ID, 1);
// 記事情報取得
$testContents = $testBlog->getAmebaContents();
// 記事数
$testContentsCount = count($testContents);
// 出力用HTML
$testHtml = '';

// 記事数でコンテンツ表示切り替え
if ($testContentsCount >= 1) {
    $testItemHtml = '';
    foreach($testContents as $item) {
        $testItemHtml .= <<< HTML
        <li class="list_item">
          <a href="{$item->link}" class="-link" target="_blank">
            <p class="-date">{$item->pubDate}</p>
            <p class="-title">{$item->title}></p>
          </a>
        </li>        
HTML;
    }
    $testHtml = '<ul class="list">'.$testItemHtml.'</ul>';
} else {
    $testHtml = '<p class="notfound">記事がみつかりませんでした</p>';
}

echo $testHtml;

こちらでコンテンツが表示されると思います!!

The following two tabs change content below.
Kazuki Hakozaki

Kazuki Hakozaki

2020年10月より入社しました!業務では主にフロントエンドを担当しております!