ラズパイで作る自宅WEBサーバ構築
第15回 動的サイト制作 2019.12.10
YouTube 動画でポイントを説明しています。上記画像をクリックすると再生できます。
前回までで、一通りの自宅WEBサイトの公開設定が完了しました。
しかし、公開当初はコンテンツが不足しがちです。コンテンツに変化のない静的なサイトでは、サイトへのリピーターは増えません。
そこで、苦し紛れに日々更新されるRSS配信サイトの情報を利用してしまいましょう。
RSS(Rich Site Summary)は、ニュースやブログなど各種のウェブサイトの更新情報を配信するための文書フォーマットです。
なお、引用する際にはRSSサイトのガイドラインに従ってください。
それでは、以下の流れで動的サイトを作ってみます。
1.PHP言語を用いてRSSリーダーを作成し、収集データをファイルに保存する。
2.RSSリーダーを動かすシェルスクリプトを作成する。
3.シェルスクリプトを crontab に設定する。
4.収集データをサイトで表示する。
1.RSSリーダーを作成して、収集データをファイルに保存する
今回は、外務省・海外安全ホームページ RSS配信サービスを利用してみます。
RSS配信URL : https://www.anzen.mofa.go.jp/rss/news.xml
RSSデータ取得プログラムのサンプルコードを添付します。curl系関数の詳細はPHP公式サイト等で確認してください。
また、理解しやすいように、エラー処理などは省いています。
取得したRSSデータは、sample.xmlに保存しています。
$ vi /home/example/scripts/getRss.php
<?php
$option = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3,
CURLOPT_SSL_VERIFYPEER => false,
];
$ch = curl_init('https://www.anzen.mofa.go.jp/rss/news.xml');
curl_setopt_array($ch, $option);
$xml = curl_exec($ch);
$info = curl_getinfo($ch);
$errorNo = curl_errno($ch);
if (($errorNo!==CURLE_OK)||($info['http_code']!==200)) return;
$fp = fopen('/home/example/rss/sample.xml','w');
fwrite($fp, $xml);
fclose($fp);
@chmod($filename,0666);
?>
コマンドラインからPHPを起動して、保存されたデータを確認してみましょう。
$ /usr/bin/php /home/example/scripts/getRSS.php
$ cat /home/example/rss/sample.xml
2.RSSリーダーを動かすシェルスクリプトを作成する。
次に、RSS取得プログラムを起動するシェルスクリプトを記述します。
$ vi /home/example/scripts/getRSS.sh
#!/bin/bash
/usr/bin/php /home/example/scripts/getRSS.php
実行権限を与えます。
$ chmod 755 getRSS.sh
3.シェルスクリプトを crontab に設定する。
この例では1時間に1回、毎時20分にシェルスクリプトを起動しています。
$ sudo vi /etc/crontab
20 * * * * root /home/example/scripts/getRSS.sh >/dev/null 2>&1
設定を有効にします。
$ sudo service cron restart
4.収集データをサイトで表示する。
取得済みのRSS配信データをブラウザに表示するプログラムです。
実際には、RSSデータ取得時にxml構造を解析し、編集済みのものをRSSデータとして保存しますが、
今回は便宜上、表示のタイミングでRSSデータを解析しています。
$ vi /home/example/www-root/index.php
<?php
$xml = file_get_contents('/home/example/rss/sample.xml');
$objXml = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
$json = json_encode($objXml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
$rssObj=json_decode($json,true);
$channel = null; $link = null; $items = null;
foreach ($rssObj as $k1=>$v1) {
if ($k1=='channel') {
foreach ($v1 as $k2=>$v2) {
switch ($k2) {
case 'title' : $title = $v2; break;
case 'link' : $link = $v2; break;
case 'item' : // RSS2.0
foreach ($v2 as $k3=>$v13) {
$items.='<a href="'.$v2[$k3]['link'].'">'.$v2[$k3]['title']."</a><br>";
}
break;
}
}
$channel = '<a href="'.$link.'" target=_blank>'.$title."</a>";
} elseif ($k1=='item') { // RSS1.0
foreach ($v1 as $k2=>$v2) {
$items .= '<a href="'.$v1[$k2]['link'].'">'.$v1[$k2]['title']."</a><br>";
}
}
}
echo '<html><body>【'.$channel.'】<br>'.$items.'</body></html>';
?>
※注意点
サイトが閲覧された時点で、RSS配信情報を取得すれば、シェルスクリプトも、crontab 設定も不要ですが、そんな事をすると、
RSS配信サイトに御迷惑をお掛けすることになります。
サイト閲覧回数分、RSS情報を取得するわけですから、アクセス数が膨大になった場合は、RSS配信サイトにも負担がかかります。
下手すると、RSS配信サイトへの攻撃とみなされてしまいます。
|