「ほぼ指定日投稿」で実際の投稿時刻を記録する

cronを使わずに(ほぼ)指定日投稿をする」を使うと、ロリポップなどのcronの使えないサーバーでも、指定日に近いタイミングで投稿することができます。
ただ、「誰かが自分のBlogにアクセスした時に、指定日投稿のプログラムを動作させる」という原理のため、指定した日時から実際に投稿されるまでにはタイムラグがあります。

「実際の投稿日時を知りたい」という方もいらっしゃるようですので、エントリーの作成日時を実際の投稿日時に自動変更したり、実際に投稿された日時をログに記録したりできるようにしてみました。
ログに記録する場合、指定日時/実際の投稿日時/両者の時間差が記録されます。

なお、このカスタマイズでは、Movable Typeの指定日投稿のプログラム(run-periodic-tasks)を直接に書き換えますので、Movable Typeをバージョンアップする際には、run-periodic-tasksの再書き換えを忘れずに行う必要があります。

また、以下の手順は、Movable Type 3.17のrun-periodic-tasksのファイルを書き換える手順です。
他のバージョンでは、ファイルの行番号が違う場合もあり得ますのでご注意ください。

●1.「run-periodic-tasks」のファイルを開く
Movable Typeのディレクトリの中に、「tools」というディレクトリがあります。その中に「run-periodic-tasks」のファイルがありますので、それをメモ帳等で開きます。

●2.共通の書き換え
「エントリーの作成日時を実際の投稿日時に自動変更」「実際に投稿された日時をログに記録」のどちらを行う場合も、run-periodic-tasksの45行目の「$entry->status(RELEASE);」と46行目の「$entry->save」の間に、以下のリストの赤字の部分を追加します。

        ・・・
        $entry->status(RELEASE);
        my $promised_ts = $entry->created_on;
        my $released_ut = time;
        my ($r_sec, $r_min, $r_hour, $r_day, $r_mon, $r_year) = localtime $released_ut;
        $entry->save
        ・・・


●3.エントリーの作成日時を実際の投稿日時に変更するための書き換え
エントリーの作成日時を実際の投稿日時に変更したい場合は、2.の手順の赤字の行の直後($entry->saveの前)に、以下の赤字のリストを追加します。

        my $released_ts = sprintf("%04d%02d%02d%02d%02d%02d", 
                                  $r_year + 1900, $r_mon + 1, $r_day,
                                  $r_hour, $r_min, $r_sec);
        $entry->created_on($released_ts);


●4.実際の投稿日時をログに記録したい場合
実際の投稿日時をログに記録したい場合は、まず17行目の「use MT::Util qw( offset_time_list );」の後に、以下の行を追加します。

use Time::Local;


また、47行目の「or die $entry->errstr;」と48行目の「$rebuild_queue{$entry->id} = $entry; 」の間に、以下の赤字の部分を追加します。

        ・・・
        or die $entry->errstr;
        require MT::Log;
        my $log = MT::Log->new;
        my ($p_year, $p_month, $p_day, $p_hour, $p_minute, $p_second) =
            unpack('A4A2A2A2A2A2A2', $promised_ts);
        my $promised_ut = timelocal($p_second, $p_minute, $p_hour,
                                    $p_day, $p_month - 1, $p_year - 1900);
        my $delay_ut = $released_ut - $promised_ut;
        my $d_hour = ($delay_ut - $delay_ut % 3600) / 3600;
        my $d_min = ($delay_ut % 3600 - $delay_ut % 60) / 60;
        my $d_sec = $delay_ut % 60;
        my $promised_str = sprintf("%04d/%02d/%02d %02d:%02d:%02d",
                                    $p_year, $p_month, $p_day,
                                    $p_hour, $p_minute, $p_second);
        my $released_str = sprintf("%04d/%02d/%02d %02d:%02d:%02d",
                                   $r_year + 1900, $r_mon + 1, $r_day,
                                   $r_hour, $r_min, $r_sec);
        my $delay_str = sprintf("%02d:%02d:%02d",
                                $d_hour, $d_min, $d_sec);
        my $msg = 'entry "' . $entry->title;
        $msg .= '" is released. promise:' . $promised_str;
        $msg .= ' release:' . $released_str;
        $msg .= ' delay:' . $delay_str;
        $log->message($msg);
        $log->save;
        $rebuild_queue{$entry->id} = $entry;
        ・・・


●5.アップロード
ここまでが終わったら、run-periodic-tasksを、Movable Typeのディレクトリの中の「tools」ディレクトリにアップロードします。
これで作業は終わりです。

●6.余談
このエントリーは、指定日時を2005年6月27日午前6時ちょうどにして「ほぼ指定日投稿」で投稿し、なおかつ、エントリーの作成日時を投稿日時に自動変更するようにしたものです。
午前6時台はアクセスが少ない時間帯なので、エントリーが実際に投稿されるのは、6時ちょうどよりだいぶ遅くなるはずです。
エントリーの先頭に投稿日時が表示されていますので、それが午前6時からどのぐらい遅れているかご覧になってみてください。