2010/11/20
※ 2022/05/30から Google がセキュリティを強化したため、この方法は使用できなくなりました。
地デジ録画サーバー(CentOS5.5+PT2+EpgRec)をメールで録画予約できるようにする。
TwitterでEPGrecの録画予約ができる"録画ッター"を参考にして、メールでEPGrecの録画予約をできるようにしてみました。
"録るメーラー"と名付けました。
"録画ッター"というすばらしいソフトの存在を知り、ならば、EPGrecをメールで録画予約するソフトはないかと探しましたが見つかりませんでした。ないのなら作ってみようと興味が沸き、PHPを勉強して改造してみました。メールを通してサーバーと通信できるので改造次第でいろいろ応用できると思います。市販品にはない自作の楽しみはこういうところにありますね。おきまりですが、このソフトが原因で損害が発生しても責任は負えませんので、使用は自己責任でお願いします。
 

目次

1.仕様

2.録るメーラー用のメールアドレスを準備する。

3.どうやってメールを受信するか。

  (1)OS(CentOS)が"ssl"をサポートしているか確認する。

  (2)"php-pear-Net-POP3"をインストールする。

4.どうやってメールを送信するか。


PHPでGmailなどのPOP over ssl / SMTP over sslサーバーからメールを送受信する方法をまとめました。

5.「録るメーラー」(recbymail.php)をインストールする。

  (1)プログラムを準備する。

  (2)環境設定を行う。

6.「録るメーラー」の動作確認を行う。

7.cronに登録する。

8.プログラムのソース

  recbymail.config.php


recbymail.help.txt

  recbymail.php

  abstractrpc.class.php

  httprpc.class.php

  xmlrpc.class.php
 
仕様
Linux環境で動作すると思います。
EPGRECへのリクエストは件名(Subject:)に書いてください。本文は無視されます。
録るメーラーは、メールヘッダーの"Subject:TV!番組名録って"などの件名を解析してリクエストに応答します。
キーワード"Subject:"が発見できないと動作できません。
録画用のアドレスにリクエストメールを送ると、結果が返信されます。
録るメーラーは、メールヘッダーの"Return-Path:<mailaddress>"に対して返信を行います。
キーワード"Return-Path:<>"が発見できないとメールを返信できません。
うまく動かないときは"DEBUGSW"を"on"にして、受信したメールの内容をよく確認してください。
録るメーラーは、下記のような応答を実行します。
1.録画予約
  予約リクエストの書式は録画ッターと同様です。
  「TV!([GR]チャンネル)xx時番組名録って」となります。
  「TV!」と「録って」で囲まれた文字があると反応します。
  「([GR]チャンネル)xx時」はオプションで、「番組名」は必須です。
  「TV!番組名録って」で、24時間以内の番組から「番組名」を含む番組探して予約します。
  「番組名」を含む番組が複数見つかると予約できませんので、さらに絞り込むときにオプションを使用してください。
  「[GR]」は放送の種別指定です。[GR}=地デジ、[BS]=BS、[CS]=CS放送です。
  「チャンネル」はチャンネル名指定です。
  「xx時」は、放送開始時間帯指定です。
2.録画予約の取り消し
  書式は録画予約と同様です。
  「TV!」と「録らないで」で囲まれた文字があると反応します。
3.番組表や予約情報などの確認
  「TV!」と「教えて」で、「番組」か「予約」か「録画」を囲んで送信すると情報をテキストで返します。
  「番組」は番組一覧を、「予約」は予約済み一覧を、「録画」は録画済み一覧を返します。
  該当しないワードを送るとヘルプを返信します。
  携帯電話などで役に立つと思います。
  「TV!」と「送って」で、「番組表」か「番組」か「予約」か「録画」を囲んで送信すると情報をHTML添付で返します。
  「番組表」は番組表を、「番組」は番組一覧を、「予約」は予約済み一覧を、「録画」は録画済み一覧を返します。
  PCメールなどで活用できると思います。  
 
録るメーラー用のメールアドレスを準備する。
録るメーラーが使用するメールアドレスが必要です。さらに、録るメーラーがメールを受信するために、そのメールサーバーはPOP3接続を許可している必要があります。また、メールを送信するために、SMTPサーバーも必要です。POP3サーバーとSMTPサーバーは別々でもかまいませんが、Gmail(Googleメール)のサーバーはその両方の接続を許可していることがわかりましたので、Gmailのメールアカウントを取得しました。
アカウントを登録して、POP3とSMTPの接続を許可する設定を行いました。
受信したメールはサーバーに残さず削除する設定にします。

サーバーにメールが残っているとそのメールを毎回処理してしまうので、削除が必要です。
サーバー側で削除できない場合は、環境設定の「define("MAILDEL","off");」を「define("MAILDEL","on"); 」にしてください。

以降、Gmailのアドレスを"Gmailuser@gmail.com"と仮定して説明します。
 
どうやってメールを受信するか。
Gmailのpop3サーバーに接続するためには、"ssl"が使えなければなりません。
OS(CentOS)のPHPが"ssl"をサポートしているか確認する。
$ php -i | grep "Stream Socket"
Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
の様に"ssl"を含んでいればOKです。
もし、"ssl"が含まれていなかった場合の対処は調べがついていません。ご存じの方が居られましたらご教授ください。
 
"php-pear-Net-POP3"をインストールする。
phpでPOP3サーバーにsslで接続するために"php-pear-Net-POP3"をインストールする必要があります。
"php-pear-Net-POP3"はyumではインストールできません。
wgetでRPMをダウンロードしてインストールします。
$ wget http://yum.chrislea.com/centos/5/i386/php-pear-Net-POP3-1.3.6-4.noarch.rpm
$ su -
# rpm -ivh php-pear-Net-POP3-1.3.6-4.noarch.rpm
もし上記の場所に"php-pear-Net-POP3"がなかったらネットから探してください。

 
どうやってメールを送信するか。
"php-pear-Mail"と"php-pear-Mail-Mime"をインストールする。
phpでSMTPサーバーにsslで接続するために"php-pear-Mail"をインストールする必要があります。
また、メールにファイルを添付したりHTMLメールを送ったりするためには"php-pear-Mail-Mime"をインストールする必要があります。
# yum install php-pear-Mail*
 
PHPでGmailなどのPOP over ssl / SMTP over sslサーバーからメールを送受信する方法をまとめました。
 
「録るメーラー」(recbymail.php)をインストールする。
プログラムを準備する。
下の方にある各ファイルのソースを参考に下記の6ファイルを適当なディレクトリに入れて(作って)ください。
 recbymail.php     <= メインプログラム
 recbymail.config.php  <= 環境設定ファイル
 recbymail.help.txt   <= 返信用ヘルプファイル
 httprpc.class.php   <= 録画実行用のクラスファイル(録画ッターのバグを修正&録画予約解約コマンドを追加)
 xmlrpc.class.php    <= 録画実行用のクラスファイル
 abstractrpc.class.php <= 録画実行用のクラスファイル(録画予約解約コマンドを追加)
(recbymail.tar.gz)
$ mkdir recbymail
$ cd recbymail
$ wget http://xreknishi.g1.xrea.com/epgrec/files/recbymail.tar.gz

$ tar -zxvf recbymail.tar.gz
$ rm recbymail.tar.gz
$ cp -p recbymail.config.php.sample recbymail.config.php
 
環境設定を行う。
$ vi recbymail.config.php
<?php

define("DEBUGSW","off");
define("MAILDEL","off");
define("LOCKTIME","1200");  // 多重実行防止lockのタイムアウト秒数

//このシステムの日本語エンコーディングを取得、設定する
mb_language("japanese");
$sysencoding=mb_detect_encoding("このシステムの日本語エンコーディングを取得する",mb_list_encodings());
mb_internal_encoding($sysencoding); //取得した値を設定する。取得がうまくいかない場合は明示的に設定してください。

//EPGrecのURL(index.htmlより上の部分)
define("EPGREC_URL", "http://xxx.xxx.xxx.xxx/");

//メール受信用の設定
define("POP_HOST", "ssl://pop.gmail.com");
define("POP_PORT", "995");
define("POP_USER", "Gmailuser");
define("POP_PSWD", "Gmailpasword");

//メール送信用の設定
define("SMTP_HOST", "smtp.gmail.com");
define("SMTP_PORT", "587");
define("SMTP_USER", "Gmailuser");
define("SMTP_PSWD", "Gmaipassword");
define("SMTP_FROM", "Gmailuser@gmail.com"); //送信元アドレス

//mysqlの設定
define("MYSQL_HOST","localhost");
define("MYSQL_DB","epgrec");
define("MYSQL_USER","SQLuser");
define("MYSQL_PASSWORD","SQLpassword");

define("RPC_TYPE", 1);

?>
  
"recbymail.help.txt"は自由に編集してください。
ヘルプ
 TV!?教えて
録画予約
 TV!([GR]チャンネル)xx時 番組名 録って
録画解約
 TV!([GR]チャンネル)xx時 番組名 録らないで
TEXT情報要求
 TV! 番組/予約/録画 教えて
HTML情報要求
 TV! 番組表/番組/予約/録画 送って
・番組=番組一覧を返すよ
・予約=予約一覧を返すよ
・録画=録画済み一覧を返すよ
 
「録るメーラー」の動作確認を行う。
録画予約用のメールを送る。
From: xxxxxxxx@xxxxxxxx.ne.jp
To: Gmailuser@gmail.com
Subject: TV!番組名録って
 
"recbymail.php"を実行してみる。
$ インストールしたディレクトリ/recbymail.php
"recbymail.config.php"の"DEBUGSW"を"on"にすると、メールサーバーの応答などが表示されます。
録画予約状況の返信メールが帰ってきたら、epgrecのWEBページで予約ができているか確認してください。
動作が確認できたら"DEBUGSW"は"off"にしておきましょう。
 
cronに登録する。
動作の確認ができたら、"recbymail.php"をcronに登録しましょう。実行間隔は5分ぐらいでいいと思います。
*/5 * * * * Recuser /インストールしたディレクトリ/recbymail.php
 
インストールと設定は以上です。
 
 

以下はプログラムの説明とソースです。

 
recbymail.php
「録るメーラー」のメインプログラムです。
PHPで日本語メールを送受信する際の、MIMEのエンコード、デコードに苦労しました。
recbymail.phpのソースは以下の通りです。
"function getRpc()"は「録画ッター」の記述を流用していますが、"$client"が"$clinet"になっている部分があったので修正してあります。
(2011/03/27)多重実行の防止ルーチンを追加。
(2011/04/28)mb_eregの動作がおかしい場合があるので、mb_regex_encoding()の指定を追加。
         mb_ereg()の使い方を修正。(ワイルドカード"*"は不要でした。)
#!/usr/bin/php
<?php

//ライブラリ読み込み
require_once("Net/POP3.php");
require_once("Mail.php");
require_once("Mail/mime.php");

//設定読み込み
require_once dirname(__FILE__)."/recbymail.config.php";
if(DEBUGSW=="on"){
        echo("DEBUGSW = on\n");
        echo("System Encoding = ".mb_internal_encoding()."\n");
        define("SMTP_DEBUG", true);
} else{
        define("SMTP_DEBUG", false);
}

// 多重実行防止
$lockfile = "/tmp/".basename(__FILE__).".lock" ;
if( (file_exists($lockfile)) && (file_get_contents($lockfile) > time() - LOCKTIME )) {
        if(DEBUGSW=="on"){ echo("lock中なので終了する ".$lockfile." < ".file_get_contents($lockfile)."\n"); }
        exit;
}
file_put_contents( $lockfile, time() );
if(DEBUGSW=="on"){ echo("lock実行 ".time()." > ".$lockfile."\n"); }

// mb_ereg() の為の文字エンコーディングを指定
mb_regex_encoding(mb_internal_encoding());

$client = null;
function getRpc(){
        global $client;
        if($client == null){
                if(RPC_TYPE == 2){
                        require_once dirname(__FILE__)."/xmlrpc.class.php";
                        $client = new XmlRpc();
                } else {
                        require_once dirname(__FILE__)."/httprpc.class.php";
                        $client = new HttpRpc();
                }
        }
        return $client;
}

//POP3サーバーに接続
$pop = new Net_POP3();
$pop->connect(POP_HOST, POP_PORT);
$pop->login(POP_USER, POP_PSWD, "USER");

//メール受信&リクエスト処理 ===============================
$messages = $pop->getListing();
if($messages){
        foreach($messages as $k => $row){
                $return=null;
                $request=null;
                $id = $row["msg_id"];
                $status = $pop->getMsg($id);
                preg_match("/Return-Path:.*<(.+)>.*/",$status,$matches);
                $return=$matches[1];
                preg_match("/Subject:(.+)/",$status,$matches);
                $request=mb_decode_mimeHeader(trim($matches[1]));
                if(DEBUGSW=="on"){
                        echo("--- receivemail ---\n");
                        echo($return."\n");
                        echo($request."\n");
                        echo("-------------------\n");
                }
                //リクエスト処理へ
                if( $return!=null and $request!=null ){
                        proc_request($return,$request);
                }
                //処理済みメールの削除
                if (MAILDEL=="on"){
                        $status = $pop->deleteMsg($id);
                }
        }
}
//メインループここまで ====================================
$pop->disconnect();
unlink( $lockfile );
if(DEBUGSW=="on"){ echo("lock解除\n"); }

//リクエスト処理関数
function proc_request($return,$request){

        //録画予約
        if(preg_match("/TV!(\s)?(\(.+\))?((\d+)時)?(.+)録って/", $request, $matches) == 1){
                $channel=$matches[2];
                $hour   =$matches[4];
                $title  =$matches[5];
                $type   =null;
                if($channel && preg_match("/\((\[(.+)\])?(.*)\)/", $channel, $matches)){
                        $type = $matches[2];
                        $channel = $matches[3];
                }
                
                $rpc = getRpc();
                $results = $rpc->searchProgram($title, $type, $channel, $hour);
                
                if(count($results) == 0){
                        $msg="そんな番組ないよ! by 録るメーラー";
                } else if(count($results) > 1){
                        $msg="もっと詳しく! by 録るメーラー";
                } else {
                        $result = $results[0];
                        try{
                                $rpc->reserveProgram($result["program_id"]);    
                                $msg="予約したよ。 by 録るメーラー\r\n".$result["title"];
                        } catch (Exception $e) {
                                if(DEBUGSW=="on"){ print_r($e); };
                                $msg=$e->getMessage()." by 録るメーラー";
                                $msg=$msg."\r\n".$result["title"];
                        }
                }
                $file=null;
                mailsend($return,"Re:".$request,$msg,$file);
        }

        //録画解約
        if(preg_match("/TV!(\s)?(\(.+\))?((\d+)時)?(.+)録らないで/", $request, $matches) == 1){
                $channel=$matches[2];
                $hour   =$matches[4];
                $title  =$matches[5];
                $type   =null;
                if($channel && preg_match("/\((\[(.+)\])?(.*)\)/", $channel, $matches)){
                        $type = $matches[2];
                        $channel = $matches[3];
                }
                
                $rpc = getRpc();
                $results = $rpc->searchProgram($title, $type, $channel, $hour);
                
                if(count($results) == 0){
                        $msg="そんな番組ないよ! by 録るメーラー";
                } else if(count($results) > 1){
                        $msg="もっと詳しく! by 録るメーラー";
                } else {
                        $result = $results[0];
                        try{
                                $rpc->cancelreserveProgram($result["program_id"]);      
                                $msg="解約したよ。 by 録るメーラー\r\n".$result["title"];
                        } catch (Exception $e) {
                                if(DEBUGSW=="on"){ print_r($e); };
                                $msg=$e->getMessage()." by 録るメーラー";
                                $msg=$msg."\r\n".$result["title"];
                        }
                }
                $file=null;
                mailsend($return,"Re:".$request,$msg,$file);
        }

        //情報返信(TEXT)
        if(preg_match("/TV!(.+)教えて/", $request, $matches) == 1){
                if(DEBUGSW=="on"){ print($matches[1]."\n"); };
                $msg="";
                $write=false;
                if(mb_ereg("^番組",$matches[1])){
                        $files = fopen(EPGREC_URL."programTable.php", "r");
                        while( ($line = fgetss($files, 1024 )) !== false) {
                                $line=trim($line);
                                if( $line <> "" ) {
                                        if($line=="詳細録画"){
                                                $msg="番組のリストだよ by 録るメーラー\n";
                                                $write=true;
                                        }
                                        elseif(mb_ereg(".+件ヒット",$line)){ $write=false; }
                                        elseif($write and mb_ereg(".+",$line)){
                                                if($line=="GR" or $line=="CS" or $line=="BS"){
                                                        $line="\n".$line;
                                                }
                                                $msg=$msg.$line."\n";
                                        }
                                }
                        }
                }
                elseif(mb_ereg("予約",$matches[1])){
                        $files = fopen(EPGREC_URL."reservationTable.php", "r");
                        while( ($line = fgetss($files, 1024 )) !== false) {
                                $line=trim($line);
                                if( $line <> "" ) {
                                        if(($line=="GR" or $line=="CS" or $line=="BS") and $msg==""){
                                                $msg="録画予約中のリストだよ by 録るメーラー\n\n".$line."\n";
                                                $write=true;
                                        }
                                        elseif(mb_ereg("jQuery UI Dialog",$line)){ $write=false; }
                                        elseif($write and mb_ereg(".+",$line)){
                                                if($line=="GR" or $line=="CS" or $line=="BS"){
                                                        $line="\n".$line;
                                                }
                                                $msg=$msg.$line."\n";
                                        }
                                }
                        }
                }
                elseif(mb_ereg("^録画",$matches[1])){
                        $files = fopen(EPGREC_URL."recordedTable.php", "r");
                        while( ($line = fgetss($files, 1024 )) !== false) {
                                $line=trim($line);
                                if( $line <> "" ) {
                                        if(mb_ereg("[0-9]{4,}-[0-9]{2,}-[0-9]{2,} [0-9]{2,}:[0-9]{2,}:[0-9]{2,}",$line) and $msg==""){
                                                $msg="録画済みのリストだよ by 録るメーラー\n\n".$line."\n".trim(fgetss($files, 1024 ))."\n";
                                                $write=true;
                                        }
                                        elseif(mb_ereg("jQuery UI Dialog",$line)){ $write=false; }
                                        elseif($write and mb_ereg(".+",$line)){
                                                if(mb_ereg("[0-9]{4,}-[0-9]{2,}-[0-9]{2,} [0-9]{2,}:[0-9]{2,}:[0-9]{2,}",$line)){
                                                        $line="\n".$line."\n".trim(fgetss($files, 1024 ));
                                                }
                                                $msg=$msg.$line."\n";
                                        }
                                }
                        }
                }
                elseif( (mb_ereg("^[ロろ][グぐ]",$matches[1])) || (mb_ereg("^[LlLl][OoOo][GgGg]",$matches[1])) ) {
                        $files = fopen(EPGREC_URL."logViewer.php", "r");
                        while( ($line = fgetss($files, 1024 )) !== false) {
                                $line=trim($line);
                                if( $line <> "" ) {
                                        if(mb_ereg("レベル",$line) and $msg==""){
                                                $msg="動作ログだよ by 録るメーラー\n";
                                                $write=true;
                                        }
                                        elseif( $write ){
                                                if(mb_ereg("[0-9]{4,}-[0-9]{2,}-[0-9]{2,} [0-9]{2,}:[0-9]{2,}:[0-9]{2,}",$line)){
                                                        $line1 = $line;
                                                        $line = trim(fgetss($files, 1024 ));
                                                        if( ! mb_ereg("EPG情報が更新された",$line) ) {
                                                                $msg = $msg."\n".$line0."\n".$line1."\n".$line."\n";
                                                        }
                                                }
                                                $line0 = $line;
                                        }
                                }
                        }
                }
                else{
                        $msg=file_get_contents(dirname(__FILE__)."/recbymail.help.txt");
                }
                $file=null;
                mailsend($return,"Re:".$request,$msg,$file);
        }

        //情報返信(HTMLファイル)
        if(preg_match("/TV!(.+)送って/", $request, $matches) == 1){
                if(DEBUGSW=="on"){ print($matches[1]."\n"); };
                if(mb_ereg("^番組表",$matches[1])){
                        $file=dirname(__FILE__)."/bangumihyou.html";
                        file_put_contents($file,file_get_contents(EPGREC_URL."index.php"));
                        $msg="番組表だよ by 録るメーラー";
                }
                elseif(mb_ereg("^番組",$matches[1])){
                        $file=dirname(__FILE__)."/bangumi.html";
                        file_put_contents($file,file_get_contents(EPGREC_URL."programTable.php"));
                        $msg="番組一覧だよ by 録るメーラー";
                }
                elseif(mb_ereg("予約",$matches[1])){
                        $file=dirname(__FILE__)."/yoyaku.html";
                        file_put_contents($file,file_get_contents(EPGREC_URL."reservationTable.php"));
                        $msg="録画予約一覧だよ by 録るメーラー";
                }
                elseif(mb_ereg("^録画",$matches[1])){
                        $file=dirname(__FILE__)."/rokugazumi.html";
                        file_put_contents($file,file_get_contents(EPGREC_URL."recordedTable.php"));
                        $msg="録画済一覧だよ by 録るメーラー";
                }
                elseif( (mb_ereg("^[ロろ][グぐ]",$matches[1])) || (mb_ereg("^[LlLl][OoOo][GgGg]",$matches[1])) ) {
                        $file=dirname(__FILE__)."/log.html";
                        file_put_contents($file,file_get_contents(EPGREC_URL."logViewer.php"));
                        $msg="動作ログだよ by 録るメーラー";
                }
                else{
                        $file=null;
                        $msg="それはできないなぁ by 録るメーラー";
                }
                mailsend($return,"Re:".$request,$msg,$file);
                if($file){ unlink($file); };
        }
}


//メール送信関数
function mailsend($to,$subject,$body,$attachfile){
        if(DEBUGSW=="on"){
                echo("--- mailsend ---\n");
                echo("TO     : ".$to."\n");
                echo("Subject: ".$subject."\n");
                echo("Body   : ".$body."\n");
                echo("Attach : ".$attachfile."\n");
                echo("----------------\n\n");
        }
        //日本語のエンコード
        $body = mb_convert_encoding($body,"iso-2022-jp");
        $subject=mb_encode_mimeheader(mb_convert_encoding($subject,"iso-2022-jp"));
        //SMTP接続
        $params = array(
            "host"     => SMTP_HOST,
            "port"     => SMTP_PORT,
            "auth"     => true,
            "username" => SMTP_USER,
            "password" => SMTP_PSWD,
            "debug"    => SMTP_DEBUG,
        );
        $smtp = Mail::factory("smtp", $params);
        //添付ファイル処理
        $mime = new Mail_Mime("\n");
        $mime->setTxtBody($body);
        $mime->addAttachment($attachfile,"application/octet-stream");
        $body_encode = array(
            "head_charset" => "ISO-2022-JP",
            "text_charset" => "ISO-2022-JP"
        );
        $body = $mime->get($body_encode);
        //ヘッダー生成
        $headers = array(
            "To"      => $to,
            "From"    => SMTP_FROM,
            "Subject" => $subject,
        );
        $header = $mime->headers($headers);
        //送信実行
        $ret = $smtp->send($to, $header, $body);
        if ( PEAR::isError($ret) ) {
                echo("メール送信エラー:".$ret->getMessage()."\n");
        }
}

?>
 
abstractrpc.class.php
「録画ッター」のファイルを流用していますが、終端の"?>"が抜けていたので追加しました。
また、cancelreserveProgram()を追加しました。
<?php
abstract class AbstractRpc{
        abstract public function searchProgram($keyword, $type, $channel, $hour);
        abstract public function reserveProgram($program_id);
        abstract public function cancelreserveProgram($program_id);

}
?>
 
httprpc.class.php
「録画ッター」のファイルを流用していますが、"mb_convert_kana()"関数の第二引数に(")が抜けていたので2カ所追加しました。
また、cancelreserveProgram()を追加しました。
<?php
require_once dirname(__FILE__).'/abstractrpc.class.php';

class HttpRpc extends AbstractRpc{

        var $cn;
        
        function HttpRpc(){
                require_once dirname(__FILE__).'/recbymail.config.php';
                if (!($this->cn = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD))){
                    die("接続エラー");
                }
                if (!(mysql_select_db(MYSQL_DB))) {
                    die("せんたくエラー");
                }
                mysql_query("SET NAMES utf8");
        }
        
        public function searchProgram($keyword, $type, $channel, $hour){
                
                //$type = BS/CS/GR
                                
                $sql = "SELECT id, title, description, starttime, endtime, channel_id, category_id
FROM `Recorder_programTbl` p
WHERE
 endtime > CURRENT_TIMESTAMP
 AND starttime < DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 DAY) \n";

                #タイトルで検索
                $sql .= " AND title LIKE '%".mb_convert_kana(mysql_escape_string($keyword),"A")."%' \n";
                
                #時間指定があった場合
                if($hour){
                        $sql .= " AND DATE_FORMAT(starttime, '%k') = ".mysql_escape_string($hour)." \n";
                }

                #チャンネル指定があった場合
                if($type && $channel){
                   $sql .= " AND EXISTS(
                     SELECT *
                     FROM `Recorder_channelTbl` c
                     WHERE
                       p.channel_id = c.id \n";
                   if(!$channel){
                        $sql .= " AND c.name LIKE '%".mb_convert_kana(mysql_escape_string($channel),"A")."%' \n";
                   }
                   if(!$type){
                    $sql .= " AND c.type = '".mysql_escape_string($type)."' \n";
                   }
                        $sql .= ") \n";
                }
                
                if (!($rs = mysql_query($sql))) {
                    die("エラー".$sql);
                }
                
                $results = array();
                while ($item = mysql_fetch_array($rs)) {
//                      print_r($item);
                        $results[] = array(
                                        'program_id' => $item['id'],
                                        'title' => $item['title']
                                );
                }
                return $results;
        }
                
        public function reserveProgram($program_id){
                $handle = @fopen(EPGREC_URL.'simpleReservation.php?program_id='.$program_id, "r");
                if ($handle) {
                        $buffer = fgets($handle, 4096);
                    fclose($handle);
                    if(!preg_match('/^error/i',$buffer)){
                        return;
                    } else {
                        throw new Exception($buffer);
                    }
                }
                throw new Exception("");
        }
        
        public function cancelreserveProgram($program_id){
                $handle = @fopen(EPGREC_URL.'cancelReservation.php?program_id='.$program_id, "r");
                if ($handle) {
                        $buffer = fgets($handle, 4096);
                    fclose($handle);
                    if(!preg_match('/^error/i',$buffer)){
                        return;
                    } else {
                        throw new Exception($buffer);
                    }
                }
                throw new Exception("");
        }
}

?>
 
xmlrpc.class.php
使用していませんが、「録画ッター」からの引き継ぎなので残してあります。
cancelreserveProgram()を追加しました。
<?php
require_once dirname(__FILE__).'/abstractrpc.class.php';

//APIが正常終了してても例外を返す時があるので、とりあえず使わない。
class XmlRpc extends AbstractRpc{

        var $client;
        var $channelList = null;
        
        function XmlRpc(){
                require_once dirname(__FILE__).'/recbymail.config.php';
                require_once dirname(__FILE__).'/XML/RPC2/Client.php';
                
                //クライアント作成
                $options = array(
                        "backend"  => "php",
                        "encoding" => "UTF-8",
                        "prefix" => "epgrec.",
                );
                $this->client = XML_RPC2_Client::create(EPGREC_URL.'xmlrpc.php', $options);
                $this->getChannelList();
        }
        
        public function searchProgram($keyword, $type, $channel, $hour){
                
                //$type = BS/CS/GR
                if($type){
                        //チャンネルゲット
                        if($channel != null){
                                $channel_id = $this->getChannel($type, $channel);
                                if($channel_id == null){
                                        return array();
                                }
                        }
                } else {
                        $type = "*";
                }
                
                if($hour){
                        //OK
                } else {
                        $hour = 24;
                }
                
                //検索
                try {
                    $results = $this->client->searchProgram($keyword, false, $type, 0, $channel_id, 7, $hour);
                    //24時間以内で絞り込み
                    $tmp = array();
                    foreach($results as $result){
                        if($result['starttime']->timestamp < $after24 = time() + (24 * 60 * 60)){
                                $tmp[] = $result;
                        } else {
                                break;
                        }
                    }
                    return $tmp;
                } catch (XML_RPC2_FaultException $e) {
                    die('Exception : ' . print_r($e, true));
                } catch (Exception $e) {
                    die('Exception : ' . print_r($e, true));
                }
        }
        
        function getChannelList(){
                if($this->channelList == null){
                        $this->channelList = $this->client->getChannelList();
                }
        }
        
        function getChannel($type, $channel){
                foreach ($this->channelList as $tmp){
                        if($tmp['type'] == $type && $tmp['name'] == $channel){
                                return $tmp['channel_id'];
                        }
                }
                return null;
        }
        
        public function reserveProgram($program_id){
            $this->client->reserveProgram($program_id);
        }
        
        public function cancelreserveProgram($program_id){
            $this->client->cancelreserveProgram($program_id);
        }
}

?>
 
ページの先頭へ戻る
ホームへ戻る