PHP:NHKニュースを取得・メール送信する

2016/06/19 お断りを追記

※お断り※

ずいぶん古い内容のため現在は動作を保証しません。(コメントを参照ください。)
今になって思うと、素直に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");
 }
?>

Artikel Terkait

2 コメント

Write コメント
ゆか
AUTHOR
2016/06/18 21:47 delete

こんにちは
使いたい!と思って自分のサーバーに入れてみたのですが、うまく動きません><
Null.になってしまいます。。。何が悪いんでしょうか。。

Reply
avatar
AUTHOR
2016/06/19 22:29 delete

かなり昔に書いたものなので、現状に対応できていないと思います。
$pattern = '/(t[0-9]+\.html)/is';
と書いている部分を
$pattern = '/([a-z0-9\/]+\.html)/is';
としてみるとどうでしょう?(申し訳ありませんが未検証です)


Reply
avatar