あちこち調整中。不具合はご容赦下さい。
25 10月
携帯版NHKニュースのヘッドラインおよび記事本文を取得し、新着記事をメールで送信するPHPスクリプト。
テレビは点けないし、新聞は取っていない、Webニュースの巡回すら億劫だという(筆者のような)人間でも、これを携帯に送るようにしておけば、移動時間や休憩時間を使ってニュースチェックできますよっと。
【注意】 以下のコードでは、不具合によりバックスラッシュが表示されていないので注意。(紺色太文字で表示されている“n”の前に入る。)(スタイルはちゃんと適用されるのに、なんで表示されないかなぁ・・・)
【使用方法】 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 .= "nn";
}
$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");
}
?>
8 6月
PHPを使ってPOSTリクエストを送信する方法としては
(ref. とても簡単にPHPからPOSTリクエストを送信する方法 – Programming Magic )
などがあるが、ここでは、環境の変更(ライブラリの追加やバージョンアップなど)が必要でない fsockopen 関数を使う方法を参考にする。
ただし参照元のコードのままでは、POST先からのレスポンスをPHPの出力として(200 OK で)クライアントに渡すため、POST先でエラーだったりリダイレクトされていたりの場合に困ったことになる。そこで、
/* ヘッダ部分とボディ部分を分離 */
$DATA = split("\r\n\r\n", $response, 2);
の後ろに、以下のコードを挿入。
/* ヘッダを出力 */
/* これより前に出力が無いよう(空白・空行など)注意! */
$headers = explode("\n", $DATA[0]);
foreach( $headers as $header ){
header($header);
}
これにより、POST先から受け取ったレスポンスをそのままクライアントに渡すことができますよと。
あとはエラー時の対応を付け加えるとなお良さそう。