▼ INCM(CMT)対応改造の実際


■ CMT出力ユニットを見てみる

 INCMのPlug-inの開発を始めるまでは気付かなかったのですが、Webの掲示板システムの数はものすごいものです。公開/配布されているものだけでも、おそらく1000は下らないでしょうし、自分のページや、プロバイダの会員、掲示板レンタルサイト等を含めればその10倍にはなるでしょう。しかも同じシステムでも改造やカスタマイズされているケースが多々あります。
 掲示板巡回ツール側がそれらの全てに対応するのは至難の技です。そしてどんなツールでも、読めない掲示板相手には何の役にも立ちません。
 ので、なるべく多くの掲示板システムに巡回ツールで読める(読みやすい)出力モードを付けてほしい!と切望しています。

 もっとも、そういう機能に興味を持つ掲示板作者の方がどの程度居るのかは判りませんが、仮に興味があっても実際付けるかどうかは負担の大きさにもよると思います。
 ので、実際CMT(INCM内部形式)の場合はこのくらいの規模のプログラムになる、というのを載せてみることにしました。ここの「INCM(CMT)対応掲示板作成のための掲示板」に使っている、KENT-WEB YY-BOARDの改造版で使っているCMTユニット部分です。

 これは、スクリプト中の

  #============#
  # 設定完了 #
  #============#

 …の行の後ろに組み込み(いくつか設定の変数を参照している関係です。でなければ先頭に置いてもいい)、掲示板URLに「?point=2000/01/01,00:00」のように日付を付加した場合に、それ以降の書き込みだけをCMT形式で出力して終了するものです。
#####  YY-BOARD CMTユニット Ver0.10    by 一 五明      #################

if($ENV{"QUERY_STRING"}=~/point=([^\&]*)/){

 $point=$1;			# 表示開始日時(無いorNo.だと、3日前に)
 unless($point =~/^\d\d\d\d\/\d\d\/\d\d,\d\d:\d\d$/){
  @a=(localtime(time-259200))[5,4,3,2,1];		# 3日=259200秒
  $a[0]+=1900; $a[1]++;
  $point=sprintf("%4.4d/%2.2d/%2.2d,%2.2d:%2.2d",@a);
 }

 print "Content-type: text/plain\n\n",
       "#T:$title\n","#N:0\n#U:0\n#B:0\n",
       '#P:POST,$c,mode=msg&name=$N&email=$E&sub=$T&comment=$M&url=$H&pwd=$K&color=800000',"\n",
       '#F:POST,$C,mode=msg&resno=$Sr&name=$N&email=$E&sub=$T&comment=$M&url=$H&pwd=$K&color=800000',"\n";

 %amp=  (">","&gt;", "<","&lt;", "\"","&quot;", "&","&amp;");
 %unamp=("gt",">",   "lt","<",   "quot","\"",   "amp","&");

$/="\n"; open(BBS,$logfile); binmode(STDOUT);
while(<BBS>){

 ($num,$rn,$date,$name,$mail,$title,$_,$hp,$i,$k,$color,$icon)=split("<>",$_);
 if($date=~s/^(..)(..\/..\/..)\D+(..:..):..$/$2,$3/){
  if("$1$date" ge $point){				# 指定日付以降なら

   if($rn){ $num="*"; }else{ $rn="*"; }
   $title="T:$title\n"."N:$name\n";
   $title=~s/&(gt|lt|amp|quot);/$unamp{$1}/eg;

   $mail= "E:$mail\n"  if $mail;
   $hp=   "H:$hp\n"    if $hp;
   $icon= "I:$icon\n"  if $icon;
   $color="C:$color\n" if $color;

   s/<br>/\n/g;
   s/&(gt|lt|amp|quot);/$unamp{$1}/eg;
   s/\n\n\n\n+/\n\n\n/g;
   s/^\n+//;  s/\n+$//;  s/\n\.\n/\n \.\n/;  s/^\.\n/ \.\n/;

   print "S:$num,$rn,$date,\n",$title,
          $hp,$mail,$icon,$color,"M:\n$_\n.\n";
  }
 }
}
 close(BBS);
 exit;
}
 大体50行くらいです。
 ちなみにKENT-WEB系ならログ形式は大体似ているので、ほとんど同じ処理になります(実際テスト不完全のためまだ公開してないですが、WEB FORUMとASKABBSの改造版も一応作ってます)。ログ形式が違ってもそれ程かけ離れた処理にはならないのではないでしょうか。

 なお、CMTの未読ポインタ指定形式としては「?point=」に日付を加えるのとNo.を加える形式の二通りが定義されていますが、YY-BOARD用のCMTユニットは構造上日付しかサポートしていません。
 exe版CMTプラグでは未読ポインタが日付形式のは上手く扱えない(2000/4/14現在)ようなので、読む場合はここのページからPerl版を落として使用してください。
 が、Perl版でも文字色、アイコン等に対応してないため、書き込み時は文字色固定、アイコン無しの状態で送信されるようにしてあります。あんましいい改造例ではなかったかも知れませんね(^^;


 自作の掲示板にCMTユニットを組み込んだ方が居ましたらリンク張らせて頂きたいと思うので、ぜひご一報下さい。
 また組み込みたいけどよく分からないという人の質問も歓迎します。もしくはログ形式など教えてもらえればこちらで組み込み代行?する場合もあります(その場合、CMTユニット部の著作権は放棄します)。

【戻る】