#! /usr/bin/perl # ↑このPerlのパスは環境に合わせて変更してください。 # ;##################################################################################### ;# ;# レスキューのブログソフト《 ブロキュー 》 Bloq メインプログラム ;# ;# 詳細は README.TXT を参照 ;# ;##################################################################################### require './setup.cgi'; require './calendar2.cgi'; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $month = $mon + 1; @days = ('',31,'',31,30,31,30,31,31,30,31,30,31); $time = time; $log_dir = $base_dir . 'logs/'; $log_file = 'count.dat'; umask(000); eval 'use Jcode;'; if ($@) { &error("エラー","Jcodeモジュールが見つかりません.","このモジュールは必須です.
","- $@"); } else { $test = 'あいうおえ'; Jcode::convert( \$test, 'utf8' ); @result = getcode( \$test ); if ($result[0] ne 'utf8') { &error("エラー","JcodeモジュールはUTF-8エンコードに失敗しました.","ユニコード('%e'で始まる3オクテッドのデータ)へのエンコードに対応したバージョンが必要です."); } } $err = $no_trackback = 0; eval 'use Net::Trackback::Ping;'; if ($@) { $err = 1; } eval 'use Net::Trackback::Client;'; if ($@) { $err = 1; } eval 'use Net::Trackback::Message;'; if ($@) { $err = 1; } if ($err) { $no_trackback = 1; } $meta = <<'EOF'; EOF #$cp = $img_dir . 'copyright.gif'; # 削除・改ざん禁止(利用規定違反になります)↓ #if (-e $cp) { $copyright = "

\"フリーソ\フトで作るブログ\"   

\n"; } #else { $copyright = "

\"フリーソ\フトで作るブログ\"   

\n"; } $copyright = "

Powered by CGI RESCUE   

\n"; if ($ENV{'CONTENT_LENGTH'} > 131072) { &error("エラー","大き過ぎるファイルを受信しました。-> $ENV{'CONTENT_LENGTH'} bytes"); } if ($ENV{'PATH_INFO'} =~ /^\/k\/(\d*)$/) { # 携帯 if (!-e $base_k) { &error("テンプレートがありません"); } &Keitai($1); } if ($ENV{'PATH_INFO'} =~ /^\/(\d+)$/) { # トラックバック受信 read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= "&$ENV{'QUERY_STRING'}"; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $chkCode = $value; $chkCode =~ tr/+/ /; $chkCode =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; @result = getcode( \$chkCode ); if ($result[0] eq 'utf8') { require $simagunipath; if ( &simaguni'loadbook8($simagunipath) ) { &simaguni'decode8(*name,'sjis'); &simaguni'decode8(*value,'sjis'); &simaguni'unloadbook8(); } $name =~ tr/+/ /; $value =~ tr/+/ /; } else { $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; Jcode::convert( \$value, 'sjis' ); } $value =~ s/&/&/g; $value =~ s//>/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $form{$name} = $value; } if ($ENV{'QUERY_STRING'} eq '__mode=rss' || $buffer eq "&") { &mode_rss($1); exit; } &receive_trackback($1); } elsif ($ENV{'CONTENT_TYPE'} =~ m#^multipart/form-data#) { &ReadParse; while (($key,$val) = each %in) { if ($key eq "upfile") { next; } $form{$key} = $val; } } else { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= "&$ENV{'QUERY_STRING'}"; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $name =~ tr/+/ /; $value =~ tr/+/ /; $chkCode = $value; $chkCode =~ tr/+/ /; $chkCode =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; @result = getcode( \$chkCode ); require $simagunipath; if ( &simaguni'loadbook8($simagunipath) ) { &simaguni'decode8(*name,'sjis'); &simaguni'decode8(*value,'sjis'); &simaguni'unloadbook8(); } $value =~ s/&/&/g; $value =~ s//>/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; if ($name =~ /;(\w+);(\d+);/) { $moddel{$1} = $2; } # 修正/削除 if ($name =~ /^del(\d+)/) { push(@remove,$value); next; } # メンテナンスモード用 $form{$name} = $value; } } if ($form{'cmd'} eq 'copyright') { ©right($cp); } @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $name =~ s/ //g; if ($name eq $reload) { $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @pairs2 = split(/,/,$value); foreach $pair (@pairs2) { ($key,$val) = split(/:/,$pair,2); $COOKIE{$key} = $val; } last; } } if ($form{'cmd'} eq 'login' && $form{'key'} eq $pwd) { $ADMIN = 1; $crypted_pwd = &Crypt($pwd); &setCookie($reload,"key:$crypted_pwd",$form{'cookie'}); } elsif ($form{'cmd'} eq 'logout') { $ADMIN = 0; undef $COOKIE{'key'}; &setCookie($reload,"key:",'x'); } elsif (crypt($pwd,$COOKIE{'key'}) eq $COOKIE{'key'} && $COOKIE{'key'} ne '') { $ADMIN = 1; } else { $ADMIN = 0; } if ($ENV{'PATH_INFO'} =~ /^\/permalink\/(\d{14})$/) { # 固定リンク &ModFile($1); } elsif ($ENV{'QUERY_STRING'} eq 'k') { &Keitai_menu(); } elsif ($form{'cmd'} eq 'k') { &Keitai2(); } # メンテナンスモード if ($ADMIN && $form{'cmd'} eq 'maintenance') { &maintenance(); } elsif ($form{'cmd'} eq 'maintenance') { &error("管理者確認が出来ません","ログインしてください。"); } # アクセス解析 if ($ADMIN && $form{'cmd'} eq 'analyze') { &analyze(); } elsif ($form{'cmd'} eq 'analyze') { &error("管理者確認が出来ません","ログインしてください。"); } # 記事・プレビューと投稿処理 if ($ADMIN && $form{'cmd'} eq 'check') { &preView(); exit; } if ($ADMIN && $form{'cmd'} eq 'write') { &Write(); } # コメント・プレビューと投稿処理 if ($form{'cmd'} eq 'check2') { &preView2(); exit; } if ($form{'cmd'} eq 'write2') { &Write2(); $form{'mode'} = $time; } # 画像アップロード if ($ADMIN && $form{'cmd'} eq 'upform') { &upForm(); exit; } if ($ADMIN && $form{'cmd'} eq 'upimg') { &upImg(); exit; } # 削除/修正 if ($ADMIN && $form{'cmd'} eq 'moddel') { &modDel(); } if ($ADMIN && $form{'cmd'} eq 'tb_hist') { &tb_hist(); } if ($ADMIN && $form{'cmd'} eq 'del') { &pDel(); } # 管理人削除(ログイン済み) elsif ($form{'cmd'} eq 'del' && $form{'passwd'} ne '') { &pDel(2); } # ユーザ削除 elsif ($form{'cmd'} eq 'del') { &pDel(1); } if ($form{'year'} ne "" && $form{'month'} ne "") { $view_blog_month = sprintf("%04d%02d",$form{'year'},$form{'month'}); if ($view_blog_month !~ /^(\d\d\d\d\d\d)$/) { $view_blog_month = ""; } } if ($form{'cmd'} eq "" || $form{'cmd'} eq "login") { $counter = &analyze_log(); } &makeBlog($view_blog_month); exit; ## #### ■全記事を取得 ## sub getAllFiles { local($count) = @_; # カウントするかどうか(必要件数分) @all = (); if (!opendir(d,$base_dir)) { &error($!,"- $base_dir"); } @d = readdir(d); close(d); foreach $dir (reverse sort @d) { next if $dir eq '.'; next if $dir eq '..'; if (-d "$base_dir$dir" && $dir =~ /^(\d{4})/) { if (!opendir(d,"$base_dir$dir")) { &error($!,"- $base_dir$dir"); } @d2 = readdir(d); close(d); foreach $dir2 (reverse sort @d2) { next if $dir2 eq '.'; next if $dir2 eq '..'; if (-d "$base_dir$dir/$dir2" && $dir2 =~ /^(\d{2})/) { if (!opendir(d,"$base_dir$dir/$dir2")) { &error($!,"- $base_dir$dir/$dir2"); } @d3 = readdir(d); close(d); foreach $file (reverse sort @d3) { next if $file eq '.'; next if $file eq '..'; if ($file =~ /^(\d{6})(\d{8})$ext/) { $list{$1} = 1; push(@all,"$1$2"); if ($count) { $count ++; if ($count > $maxLog) { return; } } } else { unlink("$base_dir$dir/$dir2/$file"); } } rmdir("$base_dir$dir/$dir2"); # 空なら削除 } } rmdir("$base_dir$dir"); # 空なら削除 } } } ## #### ■最近のコメントとトラックバック…を更新 ## sub saikin { local($readList,$newTitleNum,$newTitle) = @_; local($num); if ($readList) { &getAllFiles(); foreach $file (@all) { $num = $1; if (! &getBlog($num) ) { next; } $Title = $key{'title'}; $Title =~ s/\n//g; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 20) { $Title = &z_substr($Title,0,20) . ' ..'; } $cm = 0; foreach $j (split("\0",$key{'cm'})) { ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); $comm{$key} = "$uname\0$Title\0$num"; # 最近のコメントの一覧用 $cm++; } $tb = 0; foreach $j (split("\0",$key{'tb'})) { ($key,$blog_name,$title,$url,$exp) = split(/\t/,$j,5); $trackb{$key} = "$blog_name\0$url\0$title\0$num"; # 最近のトラックバックの一覧用 $tb++; } } } # 最近のコメント $html = ""; $i = 0; foreach $key (sort {$b<=>$a;} keys %comm) { ($name,$title,$date) = split(/\0/,$comm{$key},3); ($dir_year,$dir_month) = &findDir($date); $html .= "$name ( $title )\n"; $i++; if ($i >= $maxLog) { last; } } Jcode::convert( \$html, 'utf8' ); $file = $base_dir . 'comment' . $ext; if (open(f,"> $file")) { print f $html; close(f); chmod(0666,$file); } # 最近のトラックバック $html = ""; $i = 0; foreach $key (sort {$b<=>$a;} keys %trackb) { ($blog_name,$url,$title,$date) = split(/\0/,$trackb{$key},4); # $date(記事番号) if (length($blog_name) > 20) { $blog_name = &z_substr($blog_name,0,20) . ' ..'; } if (length($title) > 30) { $title = &z_substr($title,0,30) . ' ..'; } ($dir_year,$dir_month) = &findDir($date); $html .= "$title ($blog_name) «\n"; $i++; if ($i >= $maxLog) { last; } } Jcode::convert( \$html, 'utf8' ); $file = $base_dir . 'trackback' . $ext; if (open(f,"> $file")) { print f $html; close(f); chmod(0666,$file); } } ## #### ■削除/修正 ## sub modDel { if ($moddel{'del'}) { &getAllFiles(); @blogs = reverse sort @all; ($dir_year,$dir_month) = &findDir($moddel{'del'}); unlink("$base_dir$dir_year/$dir_month/$moddel{'del'}$ext"); &rotation('kiji','',$moddel{'del'}); # 最新リストから対象記事を削除 undef %key; $make_index = $make_log = 1; $view_blog_month = $moddel{'del'}; } elsif ($moddel{'mod'}) { if (! &getBlog($moddel{'mod'}) ) { &error("見つかりません",'削除されている可能性があります.'); } $key{'body'} =~ s/\n//g; $key{'body'} =~ s/
/\n/g; $key{'body'} =~ s/&/&/g; $key{'body'} =~ s//>/g; $selected_comment{$key{'comment'}} = " checked"; $selected_trackback{$key{'trackback'}} = " checked"; $view_blog_month = $moddel{'mod'}; # 修正フォームへ } } ## #### ■コメント・トラックバックの削除 ## sub pDel { if ($_[0] eq "2") { ($dir_year,$dir_month) = &findDir($form{'num'}); if (open(F,"$base_dir$dir_year/$dir_month/$form{'num'}$ext")) { @lines = ; close(F); } @pickup = grep(/cm:$form{'target'}\t/,@lines); if (@pickup) { ($a1,$a2,$a3,$a4,$a5,$a6,$passwd) = split(/\t/,$pickup[0],7); $passwd =~ s/\n//g; } if ($form{'passwd'} eq $pwd && $form{'passwd'} ne '') { &pDel(); } # 管理者がログインしないで削除 elsif (crypt($form{'passwd'},$passwd) eq $passwd && $passwd ne '') { &pDel(); } else { return; } } elsif ($_[0] eq "1") { print <<"EOF"; Content-type: text/html\n コメントの削除

前の画面に戻る EOF exit; } if ($form{'num'} eq "") { &error("ページが見つかりません."); } if ($form{'target'} eq "") { &error("エラー"); } ($dir_year,$dir_month) = &findDir($form{'num'}); if (open(F, "+< $base_dir$dir_year/$dir_month/$form{'num'}$ext")) { flock F, 2; while () { s/\n//g; if (/(cm|tb):$form{'target'}\t/) { $cmtb = $1; next; } push(@new,"$_\n"); } eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる seek(F,0,0); print F @new; close(F); } if ($cmtb eq "cm") { &rotation('comment','',$form{'target'}); } # 最新リストから対象コメントを削除 if ($cmtb eq "tb") { &rotation('trackback','',$form{'target'}); } # 最新リストから対象トラックバックを削除 &ModFile($form{'num'}); undef %key; $make_index = 1; $view_blog_month = $form{'num'}; } ## #### ■表示&インデックス再構成 ## sub makeBlog { local($ThisMonth) = @_; local($log); $html = ""; if ($form{'day'} != 0) { $target_day = sprintf("%02d",$form{'day'}); } if ($target_day && $ThisMonth =~ /^(\d\d\d\d)(\d\d)$/) { $view_home = 1; } # 日付指定 elsif ($ThisMonth =~ /^(\d\d\d\d)(\d\d)$/) { $target_day = ""; $view_home = 1; $kako_log = 1; } # 月指定 else { $ThisMonth = ""; } # インデックス if (open(f,$base)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { $log = $line; # メタ制御挿入 if ($line =~ //i) { $line =~ s//\n$meta/i; # 動的表示用 } # ブラウザタイトル挿入 if ($line =~ //i) { $line =~ s//$blog_title /i; } if ($line =~ //i) { $line =~ s//$RSS_link<\/a>$reMake/i; } if ($line =~ //i && $keitai_url) { $QR_url = $reload . "?k"; $QR_url =~ tr/ /+/; $QR_url =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; $QR = "   URLを携帯に送る\n"; if ($qr_image) { # QRコード生成 (QRコードは株式会社デンソーウェーブの登録商標です) $QR .= "
\n"; } $line =~ s//$QR/i; } if ($line =~ //i && $counter ne "") { if ($ADMIN) { $counter .= "

アクセス解析

"; } $line =~ s//$counter/i; } if (!$ThisMonth) { # インデックス用(最新$maxLog分) &getAllFiles(1); # $maxLog分のみ取得=1を与える @blog2 = @all; $x = sprintf("%04d%02d",$year,$month); # カレンダー用に当月のブログ調査 ($dir_year,$dir_month) = &findDir($x); if (opendir(d,"$base_dir$dir_year/$dir_month")) { @x = readdir(d); close(d); %blog = (); foreach $file (@x) { next if $file eq '.'; next if $file eq '..'; if ($file =~ /^(\d{4}\d{2}\d{2})\d{6}$ext/) { $blog{$1}++; } # その日の記事件数の調査(カレンダー用) } } } else { ($dir_year,$dir_month) = &findDir($ThisMonth); if (opendir(d,"$base_dir$dir_year/$dir_month")) { @d = readdir(d); close(d); } else { @d = (); } @blog2 = (); %blog = (); foreach $file (reverse sort @d) { next if $file eq '.'; next if $file eq '..'; if ($target_day && $file =~ /^($ThisMonth$target_day\d+)$ext/) { push(@blog2,$1); } if (!$target_day && $file =~ /^($ThisMonth\d+)$ext/) { push(@blog2,$1); } if ($file =~ /^(\d{4}\d{2}\d{2})\d{6}$ext/) { $blog{$1}++; } # その日の記事件数の調査(カレンダー用) } } # ブログ内容 if ($line =~ //) { if ($ADMIN) { $line .= "

\n"; $line .= "\n\n\n"; } $log .= ""; # ログ・月名の挿入位置 @RFD_URL = @REF_DATE = @RFD_TITLE = @RFD_WRITER = @RFD_DES = (); foreach $b (reverse sort @blog2) { $log = ""; if (! &getBlog($b) ) { next; } ($dir_year,$dir_month) = &findDir($b); $Title = $key{'title'}; $Title =~ s/\n//g; $Title =~ s/<//g; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 60) { $Title = &z_substr($Title,0,60) . ' ..'; } $Title =~ s//>/g; $excerpt = $key{'body'}; $excerpt =~ s/\n//g; $excerpt =~ s{ < [^<>]* > }{}xsg; if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,252) . ' ..'; } $excerpt =~ s/&/&/g; $excerpt =~ s//>/g; $Writer = $key{'writer'}; $Writer =~ s/\n//g; $Writer =~ s/<//g; $Writer =~ s{ < [^<>]* > }{}xsg; push(@RFD_URL,"$reload/permalink/$b"); # index.ref用 push(@REF_DATE,&getTime_forRDF($key{'date'})); push(@RFD_TITLE,$Title); push(@RFD_WRITER,$Writer); push(@RFD_DES,$excerpt); $rdf = <<"EOF"; # トラックバック Ping URL の自動検知 EOF $tb = 0; foreach (split("\0",$key{'tb'})) { $tb++; } $cm = 0; foreach (split("\0",$key{'cm'})) { $cm++; } $DATE = &getTime($key{'date'}); $BODY = $key{'body'}; if ($use_save) { $BODY_tmp = $BODY; $BODY_tmp =~ s/
/\r/ig; $BODY_tmp =~ s{ < [^<>]* > }{}xsg; if (length($BODY_tmp) > $save_bytes) { $BODY = &z_substr($BODY_tmp,0,$save_bytes) . ' ..' . "

続きを読む"; } $BODY =~ s/\r/
\n/ig; } else { $BODY =~ s/
/
\n/g; } $blog = "\n$rdf\n$point1$key{'title'} $point2\n"; if ($plog_list) { $blog_t = "\n$point1$key{'title'} $point2\n

$DATE"; } $blog .= "$point3$BODY $point4\n"; if ($key{'writer'} ne "") { $writer = "by $key{'writer'} ¦ "; } else { $writer = ""; } $blog .= "$hr2\n
$writer$DATE ¦ 固定リンク"; if ($key{'comment'} == 1) { $blog .= " ¦ コメント($cm)"; } if ($key{'trackback'} == 1) { $blog .= " ¦ トラックバック($tb)"; } if ($kako_log && $plog_list) { $line .= $log; } else { $line .= $blog; } if ($plog_list) { $log .= $blog_t; } else { $log .= $blog; } if ($ADMIN && !$kako_log) { $line .= "

\n"; $line .= "
\n"; } $blog = "


\n"; if ($kako_log && $plog_list) { $line .= $log; } else { $line .= $blog; } if ($plog_list) { $log .= "

\n"; } else { $log .= $blog; } } if ($ADMIN) { $line .= "
\n"; } } # 最新の記事 if ($line =~ //) { $file = $base_dir . 'kiji' . $ext; $KIJI = ""; if (open(f,$file)) { while () { s/\n//g; s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g; # 旧バージョンのフォーマット変換 $KIJI .= "$_

\n"; } close(f); $line =~ s//__article__/; } $url = $base_dir . "kiji$ext"; } # 最新のコメント if ($line =~ //) { $file = $base_dir . 'comment' . $ext; $COMM = ""; if (open(f,$file)) { while () { s/\n//g; s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/<\/a> \( /<\/a> on /g; # 旧バージョンのフォーマット変換 s/<\/a>\)/<\/a>/g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g; $COMM .= "$_

\n"; } close(f); $line =~ s//__comment__/; } $url = $base_dir . "comment$ext"; } # 最新のトラックバック if ($line =~ //) { $file = $base_dir . 'trackback' . $ext; $TRACKB = ""; if (open(f,$file)) { while () { s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g; $TRACKB .= "$_

\n"; } close(f); $line =~ s//__trackback__/; } $url = $base_dir . "trackback$ext"; } # カレンダー if ($line =~ //) { if ($form{'year'} ne "" && $form{'month'} ne "") { if (($form{'year'} < $year - 10 || $form{'year'} > $year + 1) || ($form{'month'} < 1 || $form{'month'} > 12)) { $ret = &calendar($year,$month); } else { $ret = &calendar($form{'year'},$form{'month'}); } } else { $ret = &calendar($year,$month); } $line =~ s//$ret/; } # 過去ログ if ($line =~ //) { &getAllFiles(); foreach $file (@all) { if ($file =~ /^(\d\d\d\d\d\d)(\d\d)(\d\d\d\d\d\d)$ext/) { $list{$1} = 1; } } $ret = ""; foreach $key (reverse sort keys %list) { if ($key =~ /^(\d\d\d\d)(\d\d)$/) { $y = $1; $m = $m2 = $2; $m2 =~ s/0(\d)/ $1/; #$m2 =~ s/0/ /; $monthList = "$y年$m2月"; } else { next; } $ret .= "$monthList
\n"; } $ret .= "
\n"; $line =~ s//$ret/; } # ログイン/ログアウト if ($line =~ //) { $login_form = <<"EOF";

ログイン
保存
EOF if ($ADMIN) { $line =~ s//ログアウト<\/b><\/a>
\n
メンテナンス<\/font><\/a>

\n/; } else { $line =~ s//$login_form/; } } # 書き込みフォーム if ($line =~ //) { if ($view_home) { if ($ThisMonth =~ /^(\d\d\d\d)(\d\d)$/) { $y = $1; $m = $2; $m =~ s/0(\d)/ $1/; $vd = "$y年$m月"; } if ($form{'day'} != 0) { $vd .= "$form{'day'}日"; } $write_form = "

トップページ<\/a><\/div>$vd

\n"; } else { $write_form = ""; } if ($ADMIN) { if ($moddel{'mod'}) { $censel = "\n"; @tb_hist = split("\0",$key{'tburl'}); $tb_hist = @tb_hist; if ($key{'tburl'}) { $tb_hist_link = "トラックバック送信履歴($tb_hist)"; } else { $tb_hist_link = "トラックバック送信履歴(0)"; } } else { undef %key; $selected_comment{'1'} = " checked"; $selected_trackback{'1'} = " checked"; } if (!$view_home || $moddel{'mod'}) { $key{'title'} =~ s/"/"/g; $key{'writer'} =~ s/"/"/g; $key{'body'} =~ s/"/"/g; $write_form .= <<"EOF";

タイトル
ライター (任意)
画像
コメント 受け付ける 受け付けない
トラックバック 受け付ける 受け付けない
EOF if (!$no_trackback) { $write_form .= <<"EOF";
トラックバック先のURL(任意) $tb_hist_link

EOF } else { $write_form .= "※トラックバックの送信は出来ません. 送信するには Net::Trackback モジュールが必要です.

\n"; } eval 'use Time::Local;'; if (!$moddel{'mod'} && !$@) { $now_date = sprintf("%04d%02d%02d%02d%02d%02d",$year,$mon +1,$mday,$hour,$min,$sec); if ($now_date =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/) { $z1 = $1; $z2 = $2; $z3 = $3; $z4 = $4; $z5 = $5; $z6 = $6; $write_form .= "\n"; $write_form .= "\n"; $write_form .= "\n"; $write_form .= "\n"; $write_form .= "\n"; $write_form .= "

\n"; } } $write_form .= <<"EOF"; $censel


EOF } } else { $html .= <<"EOF"; EOF } $line =~ s//$write_form/; } if ($line =~ //) { $line =~ s//"SSI実行はインデックスのみ"/g; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } if ($html =~ /<\/body>/i) { $html =~ s/<\/body>/$copyright\n<\/body>/i; } if ($make_index) { &MakeIndex(); }# インデックスRDFを生成する if ($no_disp) { return; } if ($ADMIN && $moddel{'del'}) { if ($moddel{'del'} =~ /^(\d\d\d\d)(\d\d)/) { $dir_year = $1; $dir_month = $2; } print "Location: $reload\?year=$dir_year&month=$dir_month\n\n"; } elsif (($ADMIN && $form{'cmd'} eq 'del') || $form{'cmd'} eq 'write2') { if ($form{'num'} =~ /^(\d\d\d\d)(\d\d)/) { $dir_year = $1; $dir_month = $2; } print "Location: $reload/permalink/$form{'num'}#$form{'mode'}\n\n"; } elsif ($ADMIN && $form{'mod'}) { if ($blogFileName =~ /^(\d\d\d\d)(\d\d)/) { $dir_year = $1; $dir_month = $2; } print "Location: $reload/permalink/$blogFileName\n\n"; } elsif ($ADMIN && $form{'cmd'} eq 'write') { print "Location: $reload\n\n"; } elsif ($form{'cmd'} eq 'logout') { print "Location: $reload\n\n"; } else { Jcode::convert( \$html,'utf8' ); $html =~ s/__article__/$KIJI/; $html =~ s/__comment__/$COMM/; $html =~ s/__trackback__/$TRACKB/; print "Content-type: text/html; charset=utf-8\n\n"; print $html; } } ## #### ■インデックス作成 ## sub MakeIndex { $make_log = 0; $make_index = 0; &makeBlog(); $no_disp = 1; $rdf = <<"EOF"; # トラックバック Ping URL の自動検知 $blog_title $reload $blog_title ja $REF_DATE[0] EOF $rdf .= "\n"; foreach (@RFD_URL) { $rdf .= "\n"; } $rdf .= <<"EOF"; EOF foreach $n (0..$#RFD_URL) { $rdf .= <<"EOF"; $RFD_TITLE[$n] $RFD_URL[$n] $RFD_DES[$n] $RFD_WRITER[$n] $REF_DATE[$n] EOF } $rdf .= "\n"; Jcode::convert( \$rdf,'utf8' ); if (!open(f,"> $index_rdf")) { &error($!,'インデックスRDFファイルが無いか、パーミッションが読み書き可能な状態に設定されていません.'); } print f $rdf; close(f); } ## #### ■プレビュー ## sub preView { $form{'body'} =~ s/<//g; $form{'body'} =~ s/&/&/g; $form{'body'} =~ s/\n/
\n/g; $js = <<"EOF"; EOF if (open(f,$base)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n$meta/i; } if ($line =~ /<\/head>/i) { $line =~ s/<\/head>/$js<\/head>/i; } if ($line =~ //) { $blog = "$point1$form{'title'} $point2\n"; $blog .= "$point3$form{'body'}$point4\n"; $blog .= "$hr2\n
"; if ($form{'writer'} ne "") { $blog .= "by $form{'writer'} "; } $blog .= "DATE ¦ 固定リンク"; if ($form{'comment'} == 1) { $blog .= " ¦ コメント"; } if ($form{'trackback'} == 1) { $blog .= " ¦ トラックバック"; } $blog .= "
\n"; $line =~ s//$blog/; } if ($line =~ /<\/body>/) { $line =~ s/<\/body>/
<\/form><\/div>

\n<\/body>/; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } Jcode::convert( \$html,'utf8' ); print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } ## #### ■プレビュー(コメント) ## sub preView2 { $form{'body'} =~ s/\n/
\n/g; $js = <<"EOF"; EOF if (open(f,$base)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n$meta/i; } if ($line =~ /<\/head>/i) { $line =~ s/<\/head>/$js<\/head>/i; } if ($line =~ //) { $form{'uname'} =~ s/\n//g; if ($form{'uname'} eq "") { $form{'uname'} = "(名前なし)"; } if ($form{'url'}) { $form{'url'} = " $form{'uname'} "; } else { $form{'url'} = $form{'uname'}; } $blog = "

$pinコメント

\n"; $blog .= "$form{'body'}
\n"; $blog .= "
$hr2名前: $form{'url'} ¦ DATE"; $blog .= "

\n"; $line =~ s//$blog/; } if ($line =~ /<\/body>/) { $line =~ s/<\/body>/

<\/form><\/div>

\n<\/body>/; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } Jcode::convert( \$html,'utf8' ); print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } ## #### ■トラックバック送信履歴 ## sub tb_hist { &getBlog($form{'blog'}); $html = <<"EOF"; トラックバック送信履歴
トラックバック送信履歴

EOF foreach $j (split("\0",$key{'tburl'})) { ($senddate,$url) = split(/\t/,$j,2); $senddate = &getTime($senddate); $html .= "[$senddate]
$url

\n"; } $html .= <<"EOF"; 閉じる EOF Jcode::convert( \$html,'utf8' ); print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } ## #### ■投稿処理(データ記録) ## sub Write { local($html); if ($form{'body'} eq "" || $form{'title'} eq "") { &error("タイトルまたは内容が書かれていません."); } $form{'title'} =~ s/\n//g; $Title = $form{'title'}; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; } $form{'body'} =~ s/<//g; $form{'body'} =~ s/&/&/g; $form{'body'} =~ s/\n/
/g; if ($form{'mod'}) { # 修正 $blogFileName = $form{'mod'}; &getBlog($form{'mod'}); } elsif ($form{'z1'}) { eval 'use Time::Local;'; if (!$@) { $z6 = $form{'z6'}; $z5 = $form{'z5'}; $z4 = $form{'z4'}; $z3 = $form{'z3'}; $z2 = $form{'z2'} -1; $z1 = $form{'z1'} -1900; eval '$time = timelocal($z6,$z5,$z4,$z3,$z2,$z1);'; if ($@) { &error("エラー","日付指定が間違っています。存在しない日付です。","- $@"); } $blogFileName = $form{'z1'} . $form{'z2'} . $form{'z3'} . $form{'z4'} . $form{'z5'} . $form{'z6'}; } else { $blogFileName = sprintf("%04d%02d%02d%02d%02d%02d",$year,$mon +1,$mday,$hour,$min,$sec); } } else { $blogFileName = sprintf("%04d%02d%02d%02d%02d%02d",$year,$mon +1,$mday,$hour,$min,$sec); } $mkdir_check = 1; # フォルダが存在しない場合は作成する ($dir_year,$dir_month) = &findDir($blogFileName); if (!$form{'mod'} && -e "$base_dir$dir_year/$dir_month/$blogFileName$ext") { &error("エラー","既に存在している記事と同じ時刻です。","1秒でも変えて新規投稿してください。"); } if (!open(f,"> $base_dir$dir_year/$dir_month/$blogFileName$ext")) { &error($!); } if ($form{'mod'}) { print f "date:$key{'date'}\n"; } else { print f "date:$time\n"; } print f "title:$form{'title'}\n"; if ($form{'writer'} ne "") { print f "writer:$form{'writer'}\n"; } print f "body:$form{'body'}\n"; print f "comment:$form{'comment'}\n"; print f "trackback:$form{'trackback'}\n"; print f "ip:$ENV{'REMOTE_ADDR'}\n"; if ($form{'mod'}) { foreach (split("\0",$key{'tb'})) { print f "tb:$_\n"; } foreach (split("\0",$key{'cm'})) { print f "cm:$_\n"; } foreach (split("\0",$key{'tburl'})) { print f "tburl:$_\n"; } } close(f); chmod(0666,"$base_dir$dir_year/$dir_month/$blogFileName$ext"); if ($form{'mod'}) { # 修正時 &rotation('kiji',"$Title ",$blogFileName); if ($key{'cm'} && $key{'comment'} == 1 && $form{'comment'} == 0) { # コメント記録があり、コメント受付から受付しないに変更した時は最新の…から削除する foreach $j (split("\0",$key{'cm'})) { ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); &rotation('comment','',$key); } } if ($key{'tb'} && $key{'trackback'} == 1 && $form{'trackback'} == 0) { foreach $j (split("\0",$key{'tb'})) { ($key,$blog_name,$title,$url,$excerpt) = split(/\t/,$j,5); &rotation('trackback','',$key); } } if ($key{'cm'} && ($key{'title'} ne $form{'title'})) { &saikin(1,$blogFileName,$form{'title'}); } # コメントがあり、題名の変更があった場合 if ($key{'cm'} && $key{'comment'} == 0 && $form{'comment'} == 1) { &saikin(1,"",""); } # コメント記録があり、コメント受付しないから受付に変更した時は最新の…を更新 if ($key{'tb'} && $key{'trackback'} == 0 && $form{'trackback'} == 1) { &saikin(1,"",""); } } else { &rotation('kiji',"$Title ",''); } # 最新の記事を更新 if ($form{'ping'}) { &ping($blogFileName); } undef %key; $make_index = $make_log = 1; if ($blogFileName =~ /^(\d\d\d\d\d\d)(\d+)/) { $view_blog_month = $1; } } ## #### ■投稿処理(前後処理等) ## sub ModFile { local($num) = @_; local($html,$mae,$ato) = ""; if ($num =~ /^(\d{6})(\d{8})$/) { $permalink = 1; } # 固定リンク if (!$num) { return 0; } &getAllFiles(); @blogs = reverse sort @all; foreach $i (0..$#blogs) { if ($blogs[$i] == $num) { $target = $i; last; } # 対象となるブログの順位を調査 } if ($blogs[$target +1] && $#blogs != $target) { # 直前のブログHTMLの情報を取る if ( &getBlog($blogs[$target +1]) ) { if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; } ($dir_year,$dir_month) = &findDir($blogs[$target +1]); $mae = "≪ $key{'title'}  ¦ "; } } if ($blogs[$target -1] && $target > 0) { # 直後のブログHTMLの情報を取る if ( &getBlog($blogs[$target -1]) ) { if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; } ($dir_year,$dir_month) = &findDir($blogs[$target -1]); $ato = " ¦ $key{'title'} ≫"; } } &getBlog($num); $Title = $key{'title'}; $Title =~ s/\n//g; $Title =~ s{ < [^<>]* > }{}xsg; $Writer = $key{'writer'}; $Writer =~ s/\n//g; $Writer =~ s/<//g; $Writer =~ s/"//g; $Writer =~ s{ < [^<>]* > }{}xsg; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; } $kiji{$num} = $Title; # 最近の記事の一覧用 $cm = 0; foreach $j (split("\0",$key{'cm'})) { ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); $comm{$key} = "$uname\0$Title\0$num"; # 最近のコメントの一覧用 $cm++; } $tb = 0; foreach $j (split("\0",$key{'tb'})) { ($key,$blog_name,$title,$url,$exp) = split(/\t/,$j,5); $trackb{$key} = "$blog_name\0$url\0$title\0$num"; # 最近のトラックバックの一覧用 $tb++; } $excerpt = $key{'body'}; $excerpt =~ s/\n//g; $excerpt =~ s/&/&/g; $excerpt =~ s/"/"/g; $excerpt =~ s{ < [^<>]* > }{}xsg; if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,252) . ' ..'; } $date = &getTime_forRDF($key{'date'}); $rdf = <<"EOF"; # トラックバック Ping URL の自動検知 EOF if (open(f,$base)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n\n$meta$rdf/i; } if ($line =~ //i) { $line =~ s//$blog_title: $Title /i; } if ($line =~ //i && $keitai_url) { $QR_url = $reload . "/k/$num"; $QR_url =~ tr/ /+/; $QR_url =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; $QR = "   URLを携帯に送る\n"; if ($qr_image) { # QRコード生成 (QRコードは株式会社デンソーウェーブの登録商標です) $QR .= "
\n"; } $line =~ s//$QR/i; } if ($line =~ //) { $DATE = &getTime($key{'date'}); $blog = "



\n"; $blog .= "$point1$key{'title'} $point2\n"; $blog .= "$point3$key{'body'}$point4\n"; ($dir_year,$dir_month) = &findDir($num); if ($key{'writer'} ne "") { $writer = "by $key{'writer'} ¦ "; } else { $writer = ""; } $blog .= "$hr2\n
$writer$DATE ¦ 固定リンク\n"; if ($key{'comment'} == 1) { $blog .= " ¦ コメント($cm) ¦ コメントを書く"; } if ($key{'trackback'} == 1) { $blog .= " ¦ トラックバック($tb)"; } if ($keitai_url) { $blog .= " ¦ 携帯"; } $blog .= "

\n"; if ($ADMIN) { $blog .= "\n"; #$blog .= "\n\n\n"; $blog .= "

\n"; $blog .= "
\n"; } if ($key{'trackback'} == 1) { $blog .= "

$pinトラックバック

\n"; $blog .= "この記事へのトラックバックURL:
\n"; $blog .= "$reload/$num

\n"; foreach $j (split("\0",$key{'tb'})) { ($key,$blog_name,$title,$url,$excerpt) = split(/\t/,$j,5); $date = &getTime($key); $blog .= "» $title [$blog_nameから]"; $blog .= " ×
"; $blog .= "$excerpt ... 続きを読む\n"; $blog .= "$hr2受信: $date

\n"; } } if ($key{'comment'} == 1) { $write_form = <<"EOF";


$pinコメントを書く

※(必須)名前:

メールアドレス(任意):
    

URL(任意):

この情報を登録する

※(必須)内容:

パスワード(任意):

EOF if ($HumanCheck) { $write_form .= "※(必須)ヒューマンチェック(選択した計算結果を入力):
\n"; } $write_form .= <<"EOF";

EOF $blog .= "

$pinコメント

\n"; foreach $j (split("\0",$key{'cm'})) { ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); $DATE = &getTime($key); $email =~ s/\@/@/; $uname =~ s/\n//g; if ($uname eq "") { $uname = "(名前なし)"; } if ($url) { $url = "$uname "; } elsif ($email) { $url = "$uname ";} else { $url = $uname; } $blog .= "$point3$body$point4\n"; $blog .= "$hr2名前: $url ¦ $DATE ×


\n"; } $blog .= $write_form; } $line =~ s//$blog/; } # 最新の記事 if ($line =~ //) { $file = $base_dir . 'kiji' . $ext; $KIJI = ""; if (open(f,$file)) { while () { s/\n//g; s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/; $KIJI .= "$_

\n"; } close(f); $line =~ s//__article__/; } } # 最新のコメント if ($line =~ //) { $file = $base_dir . 'comment' . $ext; $COMM = ""; if (open(f,$file)) { while () { s/\n//g; s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/<\/a> \( /<\/a> on /g; # 旧バージョンのフォーマット変換 s/<\/a>\)/<\/a>/g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g; $COMM .= "$_

\n"; } close(f); $line =~ s//__comment__/; } } # 最新のトラックバック if ($line =~ //) { $file = $base_dir . 'trackback' . $ext; $TRACKB = ""; if (open(f,$file)) { while () { s/
//g; # 旧バージョンのフォーマット変換 s/<\/small><\/td><\/tr><\/table>//g; # 旧バージョンのフォーマット変換 s/$base_url\d{4}\/\d{2}\/(\d{14})$ssi/$reload\/permalink\/$1/g; $TRACKB .= "$_

\n"; } close(f); $line =~ s//__trackback__/; } } # カレンダー if ($line =~ //) { ($dir_year,$dir_month) = &findDir($num); if (opendir(d,"$base_dir$dir_year/$dir_month")) { @d = readdir(d); close(d); } else { @d = (); } @blog2 = (); %blog = (); foreach $file (reverse sort @d) { next if $file eq '.'; next if $file eq '..'; if ($file =~ /^(\d{4}\d{2}\d{2})\d{6}$ext/) { $blog{$1}++; } # その日の記事件数の調査(カレンダー用) } if (($dir_year < $year - 10 || $dir_year > $year + 1) || ($dir_month < 1 || $dir_month > 12)) { $ret = &calendar($year,$month); } else { $ret = &calendar($dir_year,$dir_month); } $line =~ s//$ret/; } # 過去ログ if ($line =~ //) { &getAllFiles(); foreach $file (@all) { if ($file =~ /^(\d\d\d\d\d\d)(\d\d)(\d\d\d\d\d\d)$ext/) { $list{$1} = 1; } } $ret = ""; foreach $key (reverse sort keys %list) { if ($key =~ /^(\d\d\d\d)(\d\d)$/) { $y = $1; $m = $m2 = $2; $m2 =~ s/0(\d)/ $1/; #$m2 =~ s/0/ /; $monthList = "$y年$m2月"; } else { next; } $ret .= "$monthList
\n"; } $ret .= "
\n"; $line =~ s//$ret/; } if ($line =~ //) { $line =~ s///g; } if ($line =~ /\0/) { $line =~ s/\0/--/g; } $html .= $line; } if ($html =~ /<\/body>/i) { $html =~ s/<\/body>/$copyright\n<\/body>/i; } if ($form{'cmd'} eq 'write2') { print "Location: $reload/permalink/$num\n\n"; exit; } if ($permalink) { # 固定リンクをCGI出力時 Jcode::convert( \$html,'utf8' ); $html =~ s/__article__/$KIJI/; $html =~ s/__comment__/$COMM/; $html =~ s/__trackback__/$TRACKB/; print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } return $all[$target +1],$all[$target -1]; # ひとつ前,ひとつ後 } ## #### ■携帯処理(メニュー) ## sub Keitai_menu { $max = 20; # 携帯メニューで一覧する記事数の上限 $Keitai = 1; $kiji = "$blog_title


\n"; &getAllFiles(); @blogs = reverse sort @all; $all_blogs = @blogs - $max; foreach $i (0 .. $#blogs) { $c++; if ($c > $max) { last; } if ($c > 1) { $kiji .= "
\n"; } &getBlog($blogs[$i]); if ($key{'title'} eq "") { $Title = "(題名なし)"; } elsif (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . '..'; } $key{'title'} =~ s/\n//g; $key{'title'} =~ s{ < [^<>]* > }{}xsg; @j = split("\0",$key{'cm'}); $j = @j; if ($c <= 9) { $accesskey = " accesskey=$c directkey=$c"; $accesskey2 = "$c)"; } else { $accesskey = $accesskey2 = ""; } if ($key{'comment'} != 1 || $j == 0) { $ck = ""; } else { $ck = "($j)"; } $kiji .= "$accesskey2$key{'title'}$ck"; } $kiji .= "
他$all_blogs件/()内はコメント数

\n"; if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n/i; } if ($line =~ //i) { $line =~ s//$blog_title/i; } if ($line =~ //) { $line =~ s//$kiji/; } if ($line =~ /class=".*" /) { $line =~ s/class=".*" //g; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } print "Content-type: text/html; charset=Shift_JIS\n\n"; print $html; exit; } ## #### ■携帯処理(固定リンク) ## sub Keitai { local($num) = @_; if ($num !~ /^(\d{6})(\d{8})$/) { &error("Not Found"); } $Keitai = 1; &getAllFiles(); @blogs = reverse sort @all; foreach $i (0..$#blogs) { if ($blogs[$i] == $num) { $target = $i; last; } # 対象となるブログの順位を調査 } if ($blogs[$target +1] && $#blogs != $target) { # 直前のブログHTMLの情報を取る if ( &getBlog($blogs[$target +1]) ) { if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; } ($dir_year,$dir_month) = &findDir($blogs[$target +1]); $mae = "*)前"; } } if ($blogs[$target -1] && $target > 0) { # 直後のブログHTMLの情報を取る if ( &getBlog($blogs[$target -1]) ) { if (length($key{'title'}) > 30) { $key{'title'} = &z_substr($key{'title'},0,30) . ' ..'; } ($dir_year,$dir_month) = &findDir($blogs[$target -1]); $ato = "#)次"; } } &getBlog($num); $Title = $key{'title'}; $Title =~ s/\n//g; $Title =~ s{ < [^<>]* > }{}xsg; $key{'body'} =~ s{ < [^<>]* > }{}xsg; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 20) { $Title = &z_substr($Title,0,20) . '..'; } if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n/i; } if ($line =~ //i) { $line =~ s//$blog_title: $Title/i; } if ($line =~ //) { $DATE = &getTime($key{'date'}); $blog .= "$key{'title'}


\n"; $key{'body'} =~ s/
/ /g; $size = length($key{'body'}) - 300 . "バイト"; if (length($key{'body'}) > 300) { $key{'body'} = &z_substr($key{'body'},0,300) . "..続き(あと$size〜)"; } $blog .= "$key{'body'}
\n"; if ($key{'comment'} == 1) { $i = 1; foreach $j (reverse split("\0",$key{'cm'})) { if ($i == 1) { $blog .= "コメント(最新順)
\n"; } if ($i > 10) { @j = split("\0",$key{'cm'}); $j = @j; $j -= 10; $blog .= "他$j件
\n"; last; } ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); $uname =~ s/\n//g; if ($uname eq "") { $uname = "(名前ナシ)"; } $body =~ s/
/ /g; $size = length($body) - 50 . "バイト"; if (length($body) > 50) { $body = "■$uname》" . &z_substr($body,0,50) . "..続き(あと$size〜)"; } else { $body = "■$uname》$body"; } $blog .= "$body
\n"; $i++; } if ($key{'cm'}) { $blog .= "
\n"; } else { $blog .= "コメントはありません
\n"; } } if ($key{'writer'} ne "") { $writer = "by $key{'writer'} ¦ "; } else { $writer = ""; } $blog .= "$writer$DATE
\n"; $blog .= "$mae $ato MENU\n"; $line =~ s//$blog/; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } print "Content-type: text/html; charset=Shift_JIS\n\n"; print $html; exit; } ## #### ■携帯処理(補助処理) ## sub Keitai2 { if ($form{'num'} !~ /^(\d{6})(\d{8})$/) { &error("Not Found"); } $Keitai = 1; &getBlog($form{'num'}); $Title = $key{'title'}; $Title =~ s/\n//g; $Title =~ s{ < [^<>]* > }{}xsg; $key{'body'} =~ s{ < [^<>]* > }{}xsg; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 20) { $Title = &z_substr($Title,0,20) . '..'; } if (open(f,$base_k)) { @template = ; close(f); } # テンプレート読み込み foreach $line (@template) { if ($line =~ //i) { $line =~ s//\n/i; } if ($line =~ //i) { if ($form{'target'} ne "") { $line =~ s//$blog_title: $Titleに対するコメント/i; } else { $line =~ s//$blog_title: $Title/i; } } if ($line =~ //) { if ($form{'target'} eq "") { $key{'body'} =~ s/
/ /g; $key{'body'} = &z_substr($key{'body'},300); $blog .= "..$key{'body'}
\n"; } else { foreach $j (split("\0",$key{'cm'})) { ($key,$uname,$email,$url,$body,$ip) = split(/\t/,$j,6); if ($key eq $form{'target'}) { $body =~ s/
/ /g; $body = &z_substr($body,50); $blog .= "..$body\n"; last; } } } $blog .= "
\n*)戻る\n"; $line =~ s//$blog/; } if ($line =~ //) { $line =~ s///g; } $html .= $line; } print "Content-type: text/html; charset=Shift_JIS\n\n"; print $html; exit; } ## #### ■保存フォルダ判定 ## sub findDir { local($blogFileName) = @_; if ($blogFileName =~ /^(\d{4})(\d{2})\d{8}$/) { $dir_year = $1; $dir_month = $2; } elsif ($blogFileName =~ /^(\d{4})(\d{2})/) { $dir_year = $1; $dir_month = $2; } else { return; } if (!-e "$base_dir$dir_year/" && $mkdir_check) { # $mkdir_check:なければ作成(新規投稿時のみ) if (!mkdir("$base_dir$dir_year",0777)) { &error($!); } } if (!-e "$base_dir$dir_year/$dir_month/" && $mkdir_check) { if (!mkdir("$base_dir$dir_year/$dir_month",0777)) { &error($!); } } return($dir_year,$dir_month); } ## #### ■投稿処理(コメントデータ記録) ## sub Write2 { if ($form{'num'} eq "") { &error("不明なエラー"); } &getBlog($form{'num'}); if ($key{'comment'} ne "1") { &error('この記事はコメントを受け付けません.'); } local($html); if ($form{'body'} eq "" || $form{'uname'} eq "") { &error("名前またはタイトルが書かれていません."); } if ($HumanCheck) { if ($form{'HC'} eq "") { &error("システムエラーが発生しました."); } if ($form{'HC2'} eq "") { &error("計算式 $form{'HC'} の答えを入力してください."); } ($add1,$add2) = split(/\+/,$form{'HC'},2); $kotae = $add1 + $add2; if ($form{'HC2'} ne $kotae) { &error("計算が間違っています. 計算式 $form{'HC'} の答えは $kotae です."); } } if ($spam_comment) { @comment_result = getcode( \$form{'body'} ); if ($comment_result[0] eq 'ascii') { &error("このコメントは受け付けられませんでした. お問い合わせください."); } } $form{'body'} =~ s/\n/
/g; if ($form{'passwd'} ne "") { $crypted_pwd = &Crypt($form{'passwd'}); } ($dir_year,$dir_month) = &findDir($form{'num'}); if (!open(f,">> $base_dir$dir_year/$dir_month/$form{'num'}$ext")) { &error($!); } print f "cm:$time\t$form{'uname'}\t$form{'email'}\t$form{'url'}\t$form{'body'}\t$ENV{'REMOTE_ADDR'}\t$crypted_pwd\n"; close(f); $Name = $form{'uname'}; if ($Name eq "") { $Name = "(名前なし)"; } elsif (length($Name) > 20) { $Name = &z_substr($Name,0,20) . ' ..'; } $Title = $key{'title'}; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; } &rotation('comment',"$Name ( $Title )",''); # 最新のコメントを更新 $form{'uname'} =~ s/<//g; $form{'uname'} =~ s/&/&/g; $form{'uname'} =~ s/\;/;/g; $form{'email'} =~ s/&/&/g; $form{'email'} =~ s/\;//g; $form{'url'} =~ s/&/&/g; $form{'url'} =~ s/\;//g; if ($sendmail_set) { &sendmail($admin_email,"[$blog_title] コメントがありました","名前:$form{'uname'}\n\n$form{'body'}\n\n[固定リンク]\n$reload/permalink/$form{'num'}#$time"); } if ($form{'cookie'}) { &setCookie('uname',$form{'uname'},1); &setCookie('email',$form{'email'},1); &setCookie('url',$form{'url'},1); } else { &setCookie('uname',"",'x'); &setCookie('email',"",'x'); &setCookie('url',"",'x'); } &ModFile($form{'num'}); } ## #### ■ ## sub getBlog { local($filename) = @_; if ($filename !~ /^\d{14}$/) { return 0; } undef %key; ($dir_year,$dir_month) = &findDir($filename); if (!open(f,"$base_dir$dir_year/$dir_month/$filename$ext")) { return 0; } while () { s/\n//g; ($key,$val) = split(/:/,$_,2); $key{$key} .= "\0" if (defined($key{$key})); $key{$key} .= $val; } close(f); } ## #### ■トラックバック受信 ## sub receive_trackback { local($num) = @_; &getBlog($num); if ($key{'trackback'} ne "1") { &to_xml('1',''); exit; } # 受け付けない ($dir_year,$dir_month) = &findDir($num); if (!-e "$base_dir$dir_year/$dir_month/$num$ext") { &to_xml('1','File Not Found'); exit; } $URL = $form{'url'}; if ($URL eq "") { &to_xml('1',''); exit; } $blog_name = $form{'blog_name'}; $blog_name =~ s/\n//g; if ($spam_blogname && $blog_name eq "") { &to_xml('1',''); exit; } elsif ($blog_name eq "") { $blog_name = "(ブログ名なし)"; } $Title = $form{'title'}; $Title =~ s/\n//g; $Title =~ s/&/&/g; if ($spam_title && $Title eq "") { &to_xml('1',''); exit; } elsif ($Title eq "") { $Title = "(題名なし)"; } $excerpt = $form{'excerpt'}; $excerpt =~ s/\n//g; $excerpt =~ s/&/&/g; $excerpt =~ s{ < [^<>]* > }{}xsg; if ($spam_excerpt) { @result = getcode( \$excerpt ); if ($result[0] eq 'ascii') { &to_xml('1',''); exit; } } if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,249) . ' ..'; } ($dir_year,$dir_month) = &findDir($num); if (!open(DB,">> $base_dir$dir_year/$dir_month/$num$ext")) { &to_xml('1',''); exit; } print DB "tb:$time\t$blog_name\t$Title\t$URL\t$excerpt\n"; close(DB); if (length($blog_name) > 60) { $blog_name = &z_substr($blog_name,0,60) . ' ..'; } if (length($Title) > 30) { $Title = &z_substr($Title,0,30) . ' ..'; } &rotation('trackback',"$Title ($blog_name) «",''); if ($sendmail_set) { &sendmail("","[$blog_title] トラックバックがありました","題名:$Title($blog_name)\n$URL\n\n$excerpt \n\nトラックバック元:$reload/permalink/$num"); } &ModFile($num); # 固定ページを作成 $make_index = 1; $view_blog_month = $num; $no_disp = 1; &makeBlog(); &to_xml('0',''); exit; } ## #### ■トラックバックピング ## sub ping { local($blogFileName) = @_; @ping = split(/\n/,$form{'ping'}); foreach $tburl (@ping) { $Title = $form{'title'}; if (length($Title) > 60) { $Title = &z_substr($Title,0,60) . ' ..'; } $Title =~ s/>/>/g; $Title =~ s/</]* > }{}xsg; $Excerpt = $form{'body'}; $Excerpt =~ s/\n//g; $Excerpt =~ s{ < [^<>]* > }{}xsg; if (length($Excerpt) > 252) { $Excerpt = &z_substr($Excerpt,0,249) . ' ..'; } ($dir_year,$dir_month) = &findDir($blogFileName); $Url = "$reload/permalink/$blogFileName"; Jcode::convert( \$blog_title, 'utf8' ); Jcode::convert( \$Excerpt, 'utf8' ); Jcode::convert( \$Title, 'utf8' ); my $trackback = new Net::Trackback::Ping; $trackback->ping_url( $tburl ); $trackback->title( $Title ); $trackback->url( $Url ); $trackback->excerpt( $Excerpt ); $trackback->blog_name( $blog_title ); my $client = new Net::Trackback::Client; my $return = $client->send_ping( $trackback ); my $msg = new Net::Trackback::Message; $msg->message( $return ); $xml = $msg->to_xml( $return ); if (open(f,">> $base_dir$dir_year/$dir_month/$blogFileName$ext")) { print f "tburl:$time\t$tburl\n"; close(f); } } } ## #### ■ ## sub to_xml { local($code,$msg) = @_; print <<"EOF"; Content-Type: text/xml\n $code $msg EOF } ## #### ■トラックバック Ping の一覧を受信する ## sub mode_rss { local($num) = @_; if (! &getBlog($num) ) { &to_xml('1','File Not Found'); exit; } $Title = $key{'title'}; $Title =~ s/\n//g; $Title =~ s{ < [^<>]* > }{}xsg; if ($Title eq "") { $Title = "(題名なし)"; } elsif (length($Title) > 60) { $Title = &z_substr($Title,0,60) . ' ..'; } Jcode::convert( \$Title,'utf8' ); $excerpt = $key{'body'}; $excerpt =~ s/\n//g; $excerpt =~ s/&/&/g; $excerpt =~ s{ < [^<>]* > }{}xsg; if (length($excerpt) > 252) { $excerpt = &z_substr($excerpt,0,249) . ' ..'; } Jcode::convert( \$excerpt,'utf8' ); print <<"EOF"; Content-Type: text/xml\n 0 $Title $reload/permalink/$num $excerpt ja-jp EOF } ## #### ■ ## sub getwday { # 曜日判定 local ($year,$month,$day) = @_; local ($base,$i); # 2月の日数(うるう年の判定) $days[2] = 28; unless ($year % 4) { $days[2] = 29; } unless ($year % 100) { $days[2] = 28; } unless ($year % 400) { $days[2] = 29; } # Zeller(ツェラー)の公式 $base = (($year - 1) * 365) + int(($year - 1) / 4) - int(($year - 1) / 100) + int(($year - 1) / 400); # そこへ該当年の日数を加算 $i = $month; while ( --$i ) { $base += $days[$i]; } #1週間7日で除算した余りが曜日 ... 0なら日曜、1なら月曜 ... 6なら土曜。 return ($base + $day) % 7; } ## #### ■ ## sub urlencoded { local($line) = @_; $line =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; $line =~ tr/ /+/; $line; } ## #### ■ ## sub setCookie { local($name,$cookie,$exp) = @_; if ($exp == 1) { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); $expires = "; expires=$date_gmt"; } elsif ($exp eq 'x') { $expires = "; expires=Sun, 01-Jan-1995 01:00:00 GMT"; # クッキーを完全消去するには正確な過去を設定する(ブラウザを正常に閉じたあとに実行される) } else { $expires = ''; } $cookie =~ s/</</g; $cookie =~ s/>/>/g; print "Set-Cookie: $name=$cookie$expires\n"; } ## #### ■暗号化 ## sub Crypt { my $mypass = $_[0]; srand(); my @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); my $nsalt = $saltset[int(rand(64))] . $saltset[int(rand(64))]; return crypt($mypass,$nsalt); } ## #### ■ ## sub getTime { local($time) = @_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); # (秒,分,時,日,月(0〜11),年(年号-1900),曜日(0〜6),1月1日から何日目,サマータイムの有無) ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); if ($Keitai) { return sprintf("%02d:%02d %s\.%02d",$hour,$min,$mon_array[$mon],$mday); } else { return sprintf("%02d:%02d, %s, %s %02d, %04d",$hour,$min,$wday_array2[$wday],$mon_array[$mon],$mday,$year +1900); } # 例 15:05, Saturday, May 14, 2005 } sub getTime_forRDF { local($time) = @_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); return sprintf("%04d-%02d-%02dT%02d:%02d:%02d%s",$year +1900,$mon +1,$mday,$hour,$min,$sec,$timezone); # フォーマット済み(変更しないこと) } ## #### ■ ## sub upForm { $html = <<"EOF"; 画像アップロード

画像アップロード

画像
別名を付ける(任意/半角英数字)
重複があれば上書きする

EOF Jcode::convert( \$html,'utf8' ); print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } ## #### ■ ## sub upImg { foreach $in (@in) { ($name) = $in =~ /\bname="([^"]+)"/i; ($name) = $in =~ /\bname=([^\s:;]+)/i unless defined $name; if ($name !~ /upfile/) { next; } ($ctype) = $in =~ /\s*Content-type:\s*"([^"]+)"/i; ($ctype) = $in =~ /\s*Content-Type:\s*([^\s:;]+)/i unless defined $ctype; if ($ctype eq '') { &error("エラー","ファイルタイプを識別できません."); } elsif ($ctype =~ m#^image/(.*)#i) { $type = $1; if ($type =~ /^gif$/i) { $fext = '.gif'; } elsif ($type =~ /^(.*)jp(.*)g$/i) { $fext = '.jpg'; } elsif ($type =~ /^(.*)png$/i) { $fext = '.png'; } else { &error("エラー","扱えないファイルを検出しました. -> $ctype"); } } else { &error("エラー","送信されていないか、扱えないファイルを検出しました."); } if ($in{'upname'} ne "") { $filename = $in{'upname'}; } else { ($filename) = $in =~ /\bfilename="([^"]*)"/i; @filename = split(/[\\\/]/,$filename); ($filename,$e) = split(/\./,$filename[$#filename]); } if ($filename =~ /\W/) { &error("エラー",'ファイル名(拡張子を除く)は半角英数字である必要があります.','閉じてもう一度やり直してください.'); } if (!$in{'w'} && -e "$img_dir$filename$fext") { &error("ファイル名が重複しています."); } if (!open(IMAGE,"> $img_dir$filename$fext")) { &error($!); } binmode(IMAGE); print IMAGE $in{$name}; close(IMAGE); chmod(0666,"$img_dir$filename$fext"); } $html = <<"EOF"; 画像アップロード EOF Jcode::convert( \$html,'utf8' ); print "Content-type: text/html; charset=utf-8\n\n"; print $html; exit; } ## #### ■ファイルローテーション ## sub rotation { local($fname,$value,$del) = @_; if ($value ne "") { $value .= "\n"; Jcode::convert( \$value, 'utf8' ); } $i = 0; @new = (); if (!-e "$base_dir$fname$ext" && $value ne "") { if (open(F, "> $base_dir$fname$ext")) { print F $value; close(F); chmod(0666,"$base_dir$fname$ext"); } } elsif (open(F, "+< $base_dir$fname$ext")) { flock F, 2; while () { if (/.*/) { s/.*/$newTitle /; } if ($value ne "" && //) { $_ = $value; } # 修正時(記事) elsif (//) { next; } # 削除時(記事/コメント/トラックバック) push(@new,$_); $i++; if ($i >= $maxLog - 1) { last; } } eval 'truncate F,0;'; seek(F,0,0); if ($value ne "" && $del eq "") { print F $value; } print F @new; close(F); } } ## #### ■メール処理 ## sub sendmail { local($from,$subject,$body) = @_; require "./base64.pl"; $timezone =~ s/://g; @mon_array3 = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @wday_array3 = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date_now = sprintf("%s, %02d %s %04d %02d:%02d:%02d $timezone",$wday_array3[$wday],$mday,$mon_array3[$mon],$year,$hour,$min,$sec); $MailValue = "Date: $date_now\n"; $MailValue .= "X-Sender: $ENV{'REMOTE_ADDR'}\n"; $MailValue .= "X-Mailer: bloq [www.rescue.ne.jp]\n"; $subject = &base64'b64encode($subject); eval 'chomp($subject);'; chop($subject) if $@ ne ''; $MailValue .= "Subject: =?ISO-2022-JP?B?$subject?=\n"; if ($from =~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { $MailValue .= "Reply-To: $from\n"; } $MailValue .= "From: nobody\n"; $MailValue .= "To: $admin_email\n"; $MailValue .= "\n"; # セパレータ $body =~ s/>/>/g; $body =~ s/<//\n/g; $MailValue .= "$body\n\n"; $MailValue .= "[$blog_title]\n"; $MailValue .= "$reload\n\n"; Jcode::convert( \$MailValue, 'jis' ); if (open(OUT,"| $sendmail -t")) { print OUT $MailValue; close(OUT); } } ## #### ■全角混在用substr() # 出典 Perl Tips by あけび for Shift_JIS ## sub z_substr { local($s,$p,$l) = @_; $s =~ s/(.)/$1\0/g; $s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2\0\0/g; $s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2); $s =~ tr/\0//d; $s; } ## #### ■アクセス解析 ## sub analyze { $gif = $img_dir . $gif; $gif2 = $img_dir . $gif2; if ($form{'date'} ne "") { ; } else { #------------------------------------------------------ # データ取得 opendir(DIR,$log_dir); @ls = readdir(DIR); close(DIR); foreach $file (@ls) { next if $file eq '.'; next if $file eq '..'; next if $file eq $log_file; next if $file eq 'ip.cgi'; next if -d $file; if (-M "$log_dir$file" > $max_record) { unlink "$log_dir$file"; } else { ($file,$ext) = split(/\./,$file,2); $count = "x"; $log = "$log_dir$file.dat"; if (!open(LOG,$log)) { ; } else { $count = ; $count =~ s/\n//g; close(LOG); push(@BASE,$file); } $file{$file} = $count; $q++; } } #------------------------------------------------------ print <<"EOF"; Content-type: text/html; charset=Shift_JIS\n アクセス解析

アクセス解析

EOF if ($q == 0) { print "\n"; } else { $border = $f = 0; foreach $file (sort { $file{$b} <=> $file{$a} } keys %file) { $bar = $file{$file}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $width{$file} = $bar; } foreach $file (reverse sort keys %file) { $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($file =~ /(\d\d\d\d)(\d\d)(\d\d)/) { $y = $1; $m = $2 + 0; $d = $3 + 0; ($youbi) = $wday_array[&getwday($y,$m,$d)]; } print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
  $y年$m月$d日($youbi)     $file{$file}


※ アクセスがない日のグラフは表\示されません。( $max_record日分保存 )
※ グラフは相対表\示です。
EOF exit; } #------------------------------------------------------ if ($form{'date'} =~ /(\d\d\d\d)(\d\d)(\d\d)/) { $y = $1; $m = $2 + 0; $d = $3 + 0; ($youbi) = $wday_array[&getwday($y,$m,$d)]; $date = "$y年$m月$d日($youbi)"; } $log = "$log_dir$form{'date'}.dat"; if (!open(LOG,$log)) { &error('データが開けません','データファイルが削除されたか、何らかの理由で読み込ません。'); } $count = ; $count =~ s/\n//g; @lines = ; close(LOG); foreach $data (@lines) { $data =~ s/\n//g; ($HOUR,$ref,$host,$host2,$agent,$keitai,$OS) = split(/\t/,$data,7); $all++; if ($HOUR ne '') { $hour{$HOUR}++; $j++; } if ($ref ne '') { $ref{$ref}++; $k++; } if ($host ne '') { $host{$host}++; $l++; } if ($host2 ne '') { $host2{$host2}++; $o++; } if ($agent ne '') { $agent{$agent}++; $m++; } if ($keitai ne '') { $keitai{$keitai}++; $p++; } if ($OS ne '') { $os{$OS}++; $n++; } } #------------------------------------------------------ print <<"EOF"; Content-type: text/html; charset=Shift_JIS\n アクセス解析

アクセス解析

時間帯別 | 参照元 | リモートホスト | プロクシ経由調査 | ブラウザ | 携帯アクセス調査 | OS

対象日 $date
総サンプル数 [$all]アクセス

||| 時間帯別

EOF foreach $hour (sort { $hour{$b} <=> $hour{$a} } keys %hour) { $hourmax = $hour{$hour}; last; } $magnification = $hourmax / 100; $f = 0; foreach $hour (0 .. 23) { $hour = sprintf("%02d",$hour); if ($j != 0) { $bar = $hour{$hour}; } print "\n"; } else { $blank = 100 - $bar; if ($blank != 0 ) { print "
"; } print "$hour{$hour}
"; print "\n"; next; } } print <<"EOF"; EOF foreach $hour (0 .. 23) { if ($hour < 12) { $bgcolor = "bgcolor=#eeddff"; } else { $bgcolor = "bgcolor=#ffeedd"; } print "\n"; } print <<"EOF";
\n"; $bar = $bar / $magnification; $bar = int($bar); if ($bar == 0) { print "
$hour

||| 参照元

EOF if ($k == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $ref (sort { $ref{$b} <=> $ref{$a} } keys %ref) { $num++; if ($num > $max) { print "\n"; last; } $bar = $ref{$ref}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if (length($ref) > 70) { $url = substr($ref,0,67) . "..."; } else { $url = $ref; } #$url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; if ($before eq '') { $number = "1"; } if ($before == $ref{$ref}) { $number = ""; } else { $number = $num; } $before = $ref{$ref}; if ($ref =~ /^http:\/\//) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } } print <<"EOF";
None
.
.
.
$number  $url   $ref{$ref}
$number  $url   $ref{$ref}

||| リモートホスト

EOF if ($l == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $host (sort { $host{$b} <=> $host{$a} } keys %host) { $num++; if ($num > $max) { print "\n"; last; } $bar = $host{$host}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($before eq '') { $number = "1"; } if ($before == $host{$host}) { $number = ""; } else { $number = $num; } $before = $host{$host}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
.
.
.
$number  $host   $host{$host}

||| プロクシ経由調査

EOF if ($o == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $host2 (sort { $host2{$b} <=> $host2{$a} } keys %host2) { $num++; if ($num > $max) { print "\n"; last; } $bar = $host2{$host2}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($before eq '') { $number = "1"; } if ($before == $host2{$host2}) { $number = ""; } else { $number = $num; } $before = $host2{$host2}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
.
.
.
$number  $host2   $host2{$host2}

※ ?マークは匿名串、パケット代節約サービス経由等の可能\性.

||| ブラウザ

EOF if ($m == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $agent (sort { $agent{$b} <=> $agent{$a} } keys %agent) { $num++; if ($num > $max) { print "\n"; last; } $bar = $agent{$agent}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($before eq '') { $number = "1"; } elsif ($before == $agent{$agent}) { $number = ""; } else { $number = $num; } $before = $agent{$agent}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
.
.
.
$number  $agent   $agent{$agent}

||| 携帯アクセス調査

EOF if ($p == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $keitai (sort { $keitai{$b} <=> $keitai{$a} } keys %keitai) { $num++; if ($num > $max) { print "\n"; last; } $bar = $keitai{$keitai}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($before eq '') { $number = "1"; } elsif ($before == $keitai{$keitai}) { $number = ""; } else { $number = $num; } $before = $keitai{$keitai}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
.
.
.
$number  $keitai   $keitai{$keitai}

||| OS

EOF if ($n == 0) { print "\n"; } else { $before = ''; $num = $border = $f = 0; foreach $os (sort { $os{$b} <=> $os{$a} } keys %os) { $num++; if ($num > $max) { print "\n"; last; } $bar = $os{$os}; if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; } else { $bar = $bar / $magnification; } $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } if ($before eq '') { $number = "1"; } if ($before == $os{$os}) { $number = ""; } else { $number = $num; } $before = $os{$os}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print <<"EOF";
None
.
.
.
$number  $os   $os{$os}


※ 解析結果は必ずしも正確な情報ではなく、おおまかなアクセス状態を解析するものです。

EOF exit; } ## #### ■アクセス解析(データ取得) ## sub analyze_log { local($ref,$OS,$agent,$host,$host2,$keitai); local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $today = sprintf("%04d%02d%02d",$year +1900,$mon +1,$mday); $HOUR = sprintf("%02d",$hour); if (!-e $log_dir) { if (!mkdir($log_dir,0777)) { &error($!); } } $ip_chk = $log_dir . 'ip.cgi'; $IP = $ENV{'REMOTE_ADDR'}; $hit = 0; if (!-e $ip_chk) { open(F,"> $ip_chk"); print F "$time\t$IP\n"; close(F); chmod(0666,$ip_chk); } elsif (open(F,"+< $ip_chk")) { flock F, 2; while ($line = ) { if ($line =~ /(\d+)\t(.+)/) { $keika = $1; $ip = $2; if ($keika + 86400 < $time) { next; } } else { $ip = $line; next; } if ($ip =~ /$IP/) { $hit = 1; } push(@IP,$line); } eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる seek(F,0,0); print F @IP; if (!$hit) { print F "$time\t$IP\n"; } close(F); } opendir(DIR,$log_dir); @ls = readdir(DIR); close(DIR); foreach $file (@ls) { next if $file eq '.'; next if $file eq '..'; next if $file eq 'count.dat'; next if $file eq 'ip.cgi'; next if -d $file; if (-M "$log_dir$file" > $max_record) { unlink "$log_dir$file"; } } if (!$hit) { #------------------------------------------------------ # 参照元 ($ref) $ref = $ENV{'HTTP_REFERER'}; $ref =~ s//>/g; if ($ref eq "" && $ENV{'HTTP_WEFERER'} ne "") { $ref = "Field blocked by Norton"; } #------------------------------------------------------ # OS調査 ($OS) $agent = $ENV{'HTTP_USER_AGENT'}; $agent =~ s//>/g; $agent =~ s/User-Agent: //g; if ($agent =~ /Win(.*)95/i) { $OS = "Windows 95"; } elsif ($agent =~ /Vista/i) { $OS = "Windows Vista"; } elsif ($agent =~ /98; Win/i) { $OS = "Windows Me"; } elsif ($agent =~ /Win(.*)98/i) { $OS = "Windows 98"; } elsif ($agent =~ /WinNT/i) { $OS = "Windows NT4.0"; } elsif ($agent =~ /Windows NT 5\.0/i) { $OS = "Windows 2000"; } elsif ($agent =~ /Windows NT 5/i) { $OS = "Windows XP"; } elsif ($agent =~ /Windows NT/i) { $OS = "Windows NT"; } elsif ($agent =~ /(Mac_|Macintosh)/i) { $OS = "Macintosh"; } elsif ($agent =~ /X11/i) { $OS = "X11"; } elsif ($agent =~ /Linux/i) { $OS = "Linux"; } elsif ($agent =~ /SunOS/i) { $OS = "SunOS"; } elsif ($agent =~ /FreeBSD/i) { $OS = "FreeBSD"; } elsif ($agent =~ /WebTV/i && $agent =~ /MSIE/) { $OS = "DreamCast"; } elsif ($agent =~ /WebTV/i) { $OS = "WebTV"; } elsif ($agent =~ /AIX/i) { $OS = "AIX"; } elsif ($agent =~ /OSF1/i) { $OS = "OSF1"; } elsif ($agent =~ /NEWS-OS/i) { $OS = "NEWS-OS"; } elsif ($agent =~ /IRIX/i) { $OS = "IRIX"; } elsif ($agent =~ /HP-UX/i) { $OS = "HP-UX"; } elsif ($agent =~ /BSD/i) { $OS = "BSD"; } else { $OS = "その他"; } #------------------------------------------------------ # IPアドレス調査 ($host) $host = &nslookup($ENV{'REMOTE_ADDR'}); if ($host =~ /(.*)\.(\d+)$/) { substr($host,0,1) = 'x'; } elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; } elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; } if ($agent =~ /Google.*Proxy/i && $host =~ /google\.com/) { $host = ""; } sub nslookup { local($addr) = @_; local($host,$ip); if ($addr =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/) { $ip = "$1.$2.$3.$4"; $host = (gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0]; $host =~ y/A-Z/a-z/; if ($host ne "") { return $host; } else { return $ip; } } else { return $addr; } } #------------------------------------------------------ # プロクシ調査 ($host2) if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_VIA'}; } if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_X_FORWARDED_FOR'}; } if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_FORWARDED'}; } $host2 = &nslookup($host2); if ($host2 =~ /(.*)\.(\d+)$/) { substr($host2,0,1) = 'x'; } elsif ($host2 =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host2 = "\*\.$2\.$3\.$4"; } elsif ($host2 =~ /(.*)\.(.*)\.(.*)$/) { $host2 = "\*\.$2\.$3"; } elsif ($ENV{'HTTP_USER_AGENT'} =~ /via/i || $ENV{'HTTP_USER_AGENT'} =~ /Proxy/i || $ENV{'HTTP_USER_AGENT'} =~ /Gateway/i) { $host2 = "?"; } else { $host2 = ""; } if ($agent =~ /Google.*Proxy/i && $host =~ /google\.com/) { $host2 = "Google経由"; } #------------------------------------------------------ # ブラウザ($agent)とプラットフォーム($keitai)調査 if ($agent =~ /Opera/) { $agent = "Opera"; } elsif ($agent =~ /JBH/i) { $agent = "JBH"; } elsif ($agent =~ /JustView/i) { $agent = "JustView"; } elsif ($agent =~ /Plala-Browser/i) { $agent = "Plala-Browser"; } elsif ($agent =~ /DreamPassport/i) { $agent = "DreamCast"; } elsif ($agent =~ /SonicPassport/i) { $agent = "DreamCast"; } elsif ($agent =~ /WWWC/i) { $agent = "WWWC"; } elsif ($agent =~ /HotJava/i) { $agent = "HotJava"; } elsif ($agent =~ /Lynx/i) { $agent = "Lynx"; } elsif ($agent =~ /w3m/i) { $agent = "w3m"; } elsif ($agent =~ /OmniWeb/i) { $agent = "OmniWeb"; } elsif ($agent =~ /iCab/i) { $agent = "iCab"; } elsif ($agent =~ /Lite/) { $agent = "Lite"; } elsif ($agent =~ /AppleWebKit/) { $agent = "Safari"; } elsif ($agent =~ /Goo|mogimogi|moget|Slurp|Googlebot|Robot|InfoSeek Sidewinder|aruyo|NettuhanCom|ZyBorg|indexpert|User-Agent: |sohu-search|appie|MyApp/i) { $agent = "検索ロボット"; } elsif ($agent =~ /.*\(.*http:\/\/.*\)/i) { $agent = "検索ロボット"; } elsif ($agent eq "") { $agent = "検索ロボット?"; } elsif ($agent =~ /Google CHTML Proxy/i && $host =~ /google\.com/) { $agent = "Google変換(imode版)"; } elsif ($agent =~ /Google WAP Proxy/i && $host =~ /google\.com/) { $agent = "Google変換(ezweb版)"; } elsif ($agent =~ /MSIE (\d+)/) { $agent = "Internet Explorer $1"; } elsif ($agent =~ /Netscape6\/(\d+)/) { $agent = "Netscape-6 $1"; } elsif ($agent =~ /Mozilla\/(\d+)/ && $agent =~ /Gecko/ && $agent !~ /Netscape/) { $agent = "Mozilla $1"; } elsif ($agent =~ /Mozilla\/(\d+)/) { $agent = "Netscape Navigator $1"; } elsif ($agent =~ /DoCoMo\/(.+)\/(.+)\/(.+)$/) { $agent = "DoCoMo $1"; $keitai = "DoCoMo"; } elsif ($agent =~ /J-PHONE\/(.+)\/(.+)$/) { $agent = "J-PHONE $1"; $keitai = "J-PHONE"; } elsif ($agent =~ /KDDI-(.+) UP\.Browser\/(\d)\./) { $agent = "UP.Browser $2"; $keitai = "au"; } elsif ($agent =~ /UP\.Browser\/(\d)\.-(.)(.)(.)(.)/) { $agent = "UP.Browser $1"; $carr = $4; if ($carr eq "T") { $keitai = "TU-KA"; } else { $keitai = "au"; } } elsif ($agent =~ /ASTEL\/(.+)\/(.+)$/) { $agent = "ASTEL $1"; $keitai = "ASTEL"; } else { $agent = "その他"; } #------------------------------------------------------ # アクセスデータ記録 if (!-e "$log_dir$today\.dat") { open(F,"> $log_dir$today\.dat"); print F "0"; close(F); chmod(0666,"$log_dir$today\.dat"); } if (open(F,"+< $log_dir$today\.dat")) { flock F, 2; $count = ; @LOG = ; $count =~ s/\n//g; $count ++; eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる seek(F,0,0); print F "$count\n"; print F @LOG; print F "$HOUR\t$ref\t$host\t$host2\t$agent\t$keitai\t$OS\n"; close(F); } #------------------------------------------------------ # 累計カウント if (!-e "$log_dir$log_file") { open(F,"> $log_dir$log_file"); print F "1"; close(F); chmod(0666,"$log_dir$log_file"); } elsif (open(F,"+< $log_dir$log_file")) { flock F, 2; $count = ; $count =~ s/\n//g; $count ++; eval 'truncate F,0;'; # truncate()が使えないサーバでは致命的なエラーとなる seek(F,0,0); print F $count; close(F); } } #------------------------------------------------------ # 読み出し if (!open(LOG,"$log_dir$log_file")) { $count = 'ERR'; } else { $count = ; $count =~ s/\n//g; close(LOG); } $log = "$log_dir$today.dat"; if (!open(LOG,$log)) { $today_count = 0; } else { $today_count = ; $today_count =~ s/\n//g; close(LOG); } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 24*60*60); $yesterday = sprintf("%04d%02d%02d",$year +1900,$mon +1,$mday); $log = "$log_dir$yesterday.dat"; if (!open(LOG,$log)) { $yesterday_count = 0; } else { $yesterday_count = ; $yesterday_count =~ s/\n//g; close(LOG); } $fmt = <<"EOF"; # カウンター表示書式
本日   $today_count
昨日   $yesterday_count
累計   $count
EOF $fmt; } ## #### ■メンテナンスモード ## sub maintenance { if (@remove) { foreach (@remove) { $moddel{'del'} = $_; &modDel(); } } &getAllFiles(); if ($form{'now'} eq "") { $form{'now'} = 0; } if ($form{'add'} eq "") { $form{'add'} = 20; } $now = $form{'add'} + $form{'now'}; $HTML = <<"EOF"; メンテナンスモード

メンテナンスモード

EOF $i = $c = 0; foreach $num (0 .. $#all) { $i++; if ($i <= $form{'now'}) { next; } &getBlog($all[$num]); $key{'title'} =~ s{ < [^<>]* > }{}xsg; $key{'body'} =~ s{ < [^<>]* > }{}xsg; if (length($key{'title'}) > 50) { $key{'title'} = &z_substr($key{'title'},0,50) . '..'; } if (length($key{'body'}) > 100) { $key{'body'} = &z_substr($key{'body'},0,100) . '..'; } if ($all[$num] =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/) { $y = $1; $m = $2; $d = $3; $hh = $4; $mm = $5; $ss = $6; } if ($m < 10) { $m =~ s/0/ /; } if ($d < 10) { $d =~ s/0/ /; } if ($i % 2) { $color = "#ffffff"; } else { $color = "#efefef"; } $c++; $HTML .= "\n"; if ($i >= $now) { last; } } $HTML .= <<"EOF";
投稿日題名ライター本文
$y/$m/$d $hh:$mm:$ss$key{'title'}$key{'writer'} $key{'body'} 

EOF if ($#all ne $i - 1) { $selected{$form{'add'}} = " selected"; $HTML .= <<"EOF";

EOF } $HTML .= <<"EOF"; ※アップロードした画像はメンテナンス対象外です。  ※タグ覚え img src="img/   .jpg"
ブログに戻る

EOF print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; exit; } ## #### ■エラー表示 ## sub error { # SJIS出力 local(@msg) = @_; $error = <<"EOF"; ERROR

$msg[0]

EOF foreach (1..$#msg) { $error .= "$msg[$_]
\n"; } $error .= <<"EOF"; EOF print "Content-type: text/html; charset=Shift_JIS\n\n"; print $error; exit; } ## #### ■ロゴ ## sub copyright { local($file) = @_; @array = ( "47","49","46","38","39","61","77","00","14","00","c4","00","00","fd","fd","fd","9d","9d","9d","dc","dc","dc","5e","5e","5e","ec", "ec","ec","2f","2f","2f","1f","1f","1f","4e","4e","4e","0f","0f","0f","8d","8d","8d","6e","6e","6e","ad","ad","ad","3f","3f","3f", "7e","7e","7e","bd","bd","bd","cc","cc","cc","00","00","00","fc","fc","fc","00","00","00","00","00","00","00","00","00","00","00", "00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00", "00","00","00","00","00","21","f9","04","00","00","00","00","00","2c","00","00","00","00","77","00","14","00","40","05","ff","20", "10","34","64","69","9e","68","aa","ae","6c","eb","be","30","1b","00","40","13","dd","90","73","33","4c","f4","20","90","60","22", "c2","08","3a","1e","91","20","24","12","50","16","08","84","e0","21","58","88","38","82","40","c5","4e","99","bb","79","af","ca", "de","20","d8","18","43","7a","56","6e","ae","11","7c","80","d7","ca","80","97","50","80","20","90","de","88","21","4c","b3","e5", "ff","80","81","82","83","84","85","80","6f","4b","79","88","6a","8c","8d","8d","3a","37","75","41","0c","7d","86","96","97","98", "99","81","8b","8e","9d","9e","6a","94","35","5e","5d","5e","0f","10","0b","a3","36","02","41","7b","08","36","57","09","0e","b2", "90","a4","80","ab","09","0a","55","11","ab","90","5f","10","78","05","03","37","07","7b","43","be","5c","0e","6c","67","44","46", "ca","0d","ab","41","c2","08","0b","a6","10","07","cc","7c","a2","9a","db","dc","dd","37","9c","9f","e1","8e","a1","7e","6c","03", "0d","53","72","de","dd","01","0a","b5","37","63","98","88","03","04","c9","43","4d","0c","cf","ca","e2","8c","e4","a3","05","0c", "f6","2c","58","a5","2e","ca","90","01","05","ae","28","48","b0","e4","4a","03","59","0c","74","41","10","26","e0","c0","2a","06", "0b","1c","8c","49","d0","c0","c0","0d","53","bd","be","91","32","a0","a5","89","80","2b","ea","d2","ff","20","3b","29","80","89", "92","64","64","a2","04","d1","72","aa","5a","8f","22","d9","fc","70","c9","d3","c4","40","1d","61","f0","20","10","98","e2","85", "4d","81","3a","0c","a0","09","89","c4","45","4b","84","3a","92","7e","29","a2","02","c1","00","81","1b","ab","9c","1e","33","f2", "a7","49","c8","31","3a","1e","5c","9d","22","d5","0b","ce","49","34","ce","c5","58","cb","b6","2d","0b","33","fc","e2","f6","a3", "a1","60","96","dd","bb","78","f3","ea","dd","cb","b7","af","5f","59","0c","e5","0a","ce","b9","ae","b0","61","41","e0","06","87", "f3","17","01","08","16","ad","87","31","11","43","10","72","95","c7","4b","88","50","79","59","90","45","c0","83","7d","83","19", "27","81","54","e0","5a","04","02","23","f0","9c","ec","e5","46","75","83","00","57","f3","3c","48","10","5b","00","89","94","11", "16","34","00","f9","e7","8a","6d","75","ab","09","ac","6e","a9","f2","a5","b2","00","6f","60","3a","29","e3","d8","ce","39","80", "51","cf","54","c2","01","c9","80","30","03","06","04","10","18","23","40","80","81","6b","d3","9a","c8","41","f0","44","61","ee", "68","4d","f4","58","8d","c0","7d","01","84","06","43","df","a5","61","80","1a","42","00","01","01","85","1b","48","2a","72","e5", "91","08","fb","28","d7","43","00","e4","d5","03","81","16","03","50","16","81","cd","3b","84","e1","00","10","03","72","5c","d1", "4b","01","36","34","31","c6","77","3d","70","42","dd","56","4a","34","c0","c3","28","21","a5","61","56","0f","06","11","33","15", "32","ca","68","b1","07","1c","ef","bd","71","93","2c","ac","60","83","96","36","49","68","e6","05","02","f4","45","c0","10","1e", "7b","34","d1","45","14","a6","05","70","4d","14","bd","78","a7","0e","77","5e","01","78","4a","6f","07","fa","60","df","0d","4d", "20","10","5b","7f","4a","7c","16","c4","78","cd","48","c1","9e","1d","0f","ac","22","8c","02","06","20","71","96","74","da","70", "d4","80","31","5f","0c","70","00","9a","3e","0c","91","0c","4f","07","0c","60","4c","02","0b","e8","46","1c","13","24","f4","42", "80","02","07","20","17","a2","00","09","08","a9","c0","9d","6c","dc","49","a5","35","26","90","15","27","0f","0d","00","81","80", "02","0b","04","30","26","0f","c2","4c","3a","5d","64","98","1a","52","cf","2c","4c","2a","d6","c9","83","0c","34","17","8a","1b", "7f","95","6a","ea","a9","a8","a6","aa","aa","2c","0f","00","10","02","00","3b"); if (!-e $file) { open(f,"> $file"); foreach (@array) { $data = pack('C*',hex($_)); print f $data; } close(f); } print "Content-type: image/gif\n\n"; foreach (@array) { $data = pack('C*',hex($_)); print $data; } exit; }