※お断り※
ずいぶん古い内容のため現在は動作を保証しません。(コメントを参照ください。)今になって思うと、素直にRSSを読む方法で作り込む方が良いですね・・・
http://www.nhk.or.jp/rss/news/cat0.xml
携帯版NHKニュースのヘッドラインおよび記事本文を取得し、新着記事をメールで送信するPHPスクリプト。
テレビは点けないし、新聞は取っていない、Webニュースの巡回すら億劫だという(筆者のような)人間でも、これを携帯に送るようにしておけば、移動時間や休憩時間を使ってニュースチェックできますよっと。
※注意※
いわゆるWebスクレイピングのため、実行は自己責任にてお願いします。使用手順
1.自身で利用可能なサーバマシンにこのスクリプトを設置し、2.キャッシュファイルを作成、3.cronで定期的に実行するように設定。コード
<?php
//変数初期化
$root_url = "http://www3.nhk.or.jp/knews/";
$mailto = "<MAIL ADDRESS>";
$output = "";
//エンコード設定
mb_language("Japanese");
mb_internal_encoding("EUC-JP");
mb_detect_order("ASCII,UTF-8,EUC-JP,JIS,SJIS");
//キャッシュファイル指定(※パーミッション注意)
$f_name = "cache_list.txt";
//ファイルの内容を1行ごとに配列に格納
$cache = file($f_name);
$cache = array_map("trim", $cache);
//ニュース一覧を取得
$data = file_get_contents("$root_url");
$data = mb_convert_encoding($data, "EUC-JP", "auto");
$pattern = '/(t[0-9]+\.html)/is';
preg_match_all($pattern, $data, $matches);
//個々の記事を取得
foreach( $matches[1] as $match ){
//キャッシュに無ければ、記事を取得
if(!in_array($match, $cache)){
$url = $root_url . $match;
$data = file_get_contents($url);
$data = mb_convert_encoding($data, "EUC-JP", "auto");
$pattern = '/<body>(.*?)<div/is';
preg_match($pattern, $data, $matches);
$body = $matches[1];
$body = "◇". $body;
$body = preg_replace('/<br><br>/', "\n◇", $body);
$output .= $body;
$output .= "\n\n";
}
$new_cache[] = $match;
}
$new_cache = implode("\n", $new_cache);
//キャッシュファイル更新
$fp = fopen($f_name, "w+");
fwrite($fp, $new_cache);
fclose($fp);
//メール送信
if($output!=""){
$sbject = "NHK News";
mb_send_mail($mailto, $sbject, $output, $headers);
echo("Mail Sended.\n");
}else{
echo("Null.\n");
}
?>
2 コメント
Write コメントこんにちは
Reply使いたい!と思って自分のサーバーに入れてみたのですが、うまく動きません><
Null.になってしまいます。。。何が悪いんでしょうか。。
かなり昔に書いたものなので、現状に対応できていないと思います。
Reply$pattern = '/(t[0-9]+\.html)/is';
と書いている部分を
$pattern = '/([a-z0-9\/]+\.html)/is';
としてみるとどうでしょう?(申し訳ありませんが未検証です)
Emoji Emoji