何故かシステムを作るときに便利に使えるライブラリにあまり出会えない、ユゲタです。
使いたいライブラリに似たようなものはあるんですが、なんかちょっと使えないモノが多く、
結果的に自分で作ったほうが早いや!となります。
でも、よく考えたら、ライブラリを使った開発は、単に組み立てているだけなので、そのライブラリを作ったら同じ用にその機能を欲しがっている人が使ってくれるかもしれないですからね。
大前提
というワケで、今回はGoogleBloggerのRssパーサーを作ったので、そのソースを公開しておきます。
GoogleBloggerでブログを書いている人で、別サーバーにホームページがあるような場合に、新着ブログリストをカンタンに作ることができます。
実はこの機能、最初はJavascriptのAjax(またはfetch)のみでやろうとしたんですが、
CORSに引っかかってしまい、RSSデータが取得できなかったので、PHPにその仕事をやらせることにしました。
※この時点でCORSが何の意味もなくなっていることがよくわかるので、ホント機能改善してもらいたいんですよね。
そんなこんなで、PHPでRSSを取得して、なんならRSS(データ形式はXML)をパースして配列JSON形式にして、javascriptに受け渡してあげたようと思います。
ソースコード
function GoogleBloggerRssParse($feedUrl) {
$result = array();
// "@" is for error handling
$feed = @simplexml_load_file($feedUrl);
$ns = $feed->getNamespaces(true);
//atom
if (isset($feed->entry)) {
$result['rss_ver'] = 'atom';
$result['title'] = (string)$feed->title;
$result['link'] = (string)$feed->link->attributes()->href;
foreach ($feed->entry as $e){
if(!empty($e->issued)) {
$date = date('Y-m-d H:i:s', strtotime($e->issued));
} else if ($e->updated) {
$date = date('Y-m-d H:i:s', strtotime($e->updated));
}
$result['items'][] = array(
'title' => (string)$e->title,
'link' => (string)$e->link['href'],
'date' => $date,
'category' => (string)$e->category,
'media' => (string)$e->media['src'],
);
}
}
//rss1.0
elseif (isset($feed->item)) {
$result['rss_ver'] = 'rss1.0';
$result['title'] = (string)$feed->title;
$result['link'] = (string)$feed->link;
foreach ($feed->item as $i){
$dc = $i->children('http://purl.org/dc/elements/1.1/');
$result['items'][] = array(
'title' => (string)$i->title,
'link' => (string)$i->link,
'date' => date('Y-m-d H:i:s', strtotime($dc->date)),
'category' => (string)$i->category,
'media' => (string)$i->media,
);
}
}
//rss2.0
elseif (isset($feed->channel->item)) {
$result['rss_ver'] = 'rss2.0';
$result['title'] = (string)$feed->channel->title;
$result['link'] = (string)$feed->channel->link;
foreach ($feed->channel->item as $i){
$d = strtotime($i->pubDate);
$ymd = date('Y/m/d', $d);
$his = date('H:i:s', $d);
$result['items'][] = array(
'title' => (string)$i->title,
'link' => (string)$i->link,
'date' => `$ymd $his`,
'ymd' => $ymd,
'hid' => $his,
'category' => (string)$i->category,
'media' => (string)$i->children($ns['media'])->thumbnail->attributes()->url,
);
}
}
else {
return false;
}
return $result;
}
ちょびっと解説
3つのRSS形式に対応するようにしていますが、今現在のGoogleBlogger(2022年11月現在)は、rss2.0なので、それ以外は使っていません。
ポイントは、サムネイル画像を取得するmediaの箇所です。
アイキャッチとして、Bloggerの記事の最初の画像をthumbnailとして自動的に登録される部分になるんですが、これ、mediaタグで取得できなくて、media:thumbnailというタグで書かれていました。
そして、urlという属性に記述されている値がソレなので、attributesをつかって取り出す必要があったので、最後の方に書いてある、以下のコードを書いてみました。
'media' => (string)$i->children($ns['media'])->thumbnail->attributes()->url,
discriptionもデータとしてjsonに盛り込むことはできるんですが、ボリュームが大きくなりそうなので今回は除外していますが、
先頭144文字ぐらいのtwitter形式で取得してもいいかもしれませんね。
使い方
この関数ファイルをphpでrequireして、以下のように関数を叩けば、オブジェクトデータで返ってくるようにしています。
$rss_parse_data = GoogleBloggerRssParse('GoogleBloggerのRSS-URL');
ちなみに、GoogleBloggerのRSS-URLがわからない場合は、対象ページのHTMLソースの中で、RSSで文字列検索してみると、headタグ内のlinkタグに書かれていますよ。
ちなみに、このサイトは、以下のような記述でした。
<link rel="alternate" type="application/rss+xml" title="MYNT blog - RSS" href="https://blog.myntinc.com/feeds/posts/default?alt=rss">
あとがき
今回行った作業のおかげで、GoogleBloggerで投稿したブログ記事の最新情報をホームページで表示することができるようになりました。
実際の出来上がったホームページは、以下のようになりました。
http://myntinc.com
ハイ、うちの会社のホームページだったんですね。
ということは、ビジネスページでも十分使えるという事ですよ。
効率、万歳!!
0 件のコメント:
コメントを投稿