#! /usr/bin/perl
##
##★★★★ ↑ は、プロバイダーもしくはレンタルサーバー会社から指定された path を指定してください。
## 開発時: #!c:/perl/bin/perl.exe
## 転送時: #! /usr/local/bin/perl
## 転送時: #! /usr/bin/perl
##
#############################################################################
## 履歴
#############################################################################
##
## 実行テスト開始 2005/02/28
## β版完成 2005/02/28
## 開発開始 2005/02/21
##
#############################################################################
## 固定値定義
#############################################################################
require './jcode.pl';
require './mimew.pl';
$kanjicode = 'sjis'; # ↓保存されるファイルの漢字コード( windows='sjis' linux,unix='euc' 'jis' のいずれか)
##メール関連の定義
$sendmail = '/usr/sbin/sendmail';
$fromAddress = "demand\@k-systemtrading.com";
$mailTitle = "【語ろう】アクセスログ削除連絡 − リンク";
@toAddress = (
#############################################
## ここに転送先のアドレスを登録していく
#############################################
## 受け取るアドレス @マークの前には'\'が必要
"contact\@k-systemtrading.com",
);
# データ保存ファイル
$visitorFile = "./link.log";
$lnkFile = "./link.csv";
&main();
exit(0);
#############################################################################
## ここからプログラム ( わからない人は触ってはダメ )
#############################################################################
sub main
{
###########################################
#### 初期処理
###########################################
( $browser , $tmp ) = &getBrowser();
( $today , $nowtime , $weekstr ) = &getLocalTime();
( $host , $addr ) = &getHost( $ENV{'REMOTE_HOST'} , $ENV{'REMOTE_ADDR'} );
&initForm( $kanjicode );
###########################################
#### ログ参照指示
###########################################
### if ( $form{'logdisp'} eq 'on' ){
### goto log_disp;
### }
###########################################
#### ファイルサイズを調べて大きくなっているならメールする
###########################################
$maxsize = 1024 * 256;
if ( -s $visitorFile > $maxsize || $form{'mailsend'} eq 'on' ){
## ファイルがサイズmaxに達している場合
&hostMail();
## 削除
unlink( $visitorFile );
}
##########################
# ログファイル更新
# 基本的なログ
##########################
&addFile( $visitorFile );
##########################
## アドレスjump
##########################
$orderURL = "http://www.k-systemtrading.com"; # jump先URL
##########################
# ライセンスファイルを調べる
##########################
@usrList = &filePaser( $lnkFile );
for ( $i = 0 ; $i <= $#usrList ; $i++ ){
($lno,$seo,$url) = split( /,/ , $usrList[$i] );
if ( $seo eq 'on' ){
if ( $form{'n'} eq $lno ){
$orderURL = $url;
}
}else{
if ( $ENV{'HTTP_REFERER'} =~ /k-systemtrading.com/ ){
if ( $form{'n'} eq $lno ){
$orderURL = $url;
}
}
}
}
print "Location: $orderURL\n\n";
exit( 0 );
log_disp:
&setContentType( $kanjicode );
&dispLog();
## print "aaaaaaaaaa
";
## print "$ENV{'HTTP_REFERER'}
";
## print "aaaaaaaaaa
";
## print "$orderURL
";
exit( 0 );
}
#############################################################################
# ファイルの解体汎用
# use:
# &filePaser();
#############################################################################
sub filePaser
{
local( $filename ) = @_;
local( $i );
undef @tmpdata;
if ( open( TMPFILE , "<$filename" )){
@tmpdata = ;
close( TMPFILE );
for ( $i = 0 ; $i <= $#tmpdata ; $i++ ){
$tmpdata[$i] =~ s/\n//g; #改行を抜く
}
}
return @tmpdata;
}
#############################################################################
# &dispLog()
#############################################################################
sub dispLog
{
local( $i , $olddate , $count );
local( $indate , $intime , $domain , $ip , $afeno , $uri , $ref , $link );
#####################
# ヘッダ
#####################
print <<"_HTML_";
_HTML_
undef @filedata;
if ( open( FILE , "<$visitorFile" )){
@filedata = ;
close( FILE );
$olddate = 0;
$count = 0;
for ( $i = $#filedata ; $i > -1 ; $i-- ){
( $indate , $intime , $domain , $ip , $afeno , $uri , $ref ) = split(/,/, $filedata[ $i ] );
if ( $indate eq '' ){
next;
}
$link = $ref;
if ( length( $ref ) > 72 ){
$ref = substr( $ref , 0 , 72 );
$ref .= "...";
}
$col1 = "16%";
$col2 = "9%";
$col3 = "75%";
#####################
# 日付変更線
#####################
if ( $olddate ne $indate ){
if ( $olddate ne 0 ){
print <<"_HTML_";
合計:$count |
_HTML_
}
print <<"_HTML_";
|
_HTML_
$count = 0;
}
#####################
# 内容
#####################
print <<"_HTML_";
$indate $intime
|
$afeno
|
$domain ($ip)
|
|
|
$uri
|
|
|
$ref
|
|
_HTML_
$olddate = $indate;
$count++;
}
}
#####################
# フッタ
#####################
print <<"_HTML_";
_HTML_
}
#############################################################################
# 漢字コード処理
# use:
# &setContentType( 'sjis' );
#############################################################################
sub setContentType
{
local( $code ) = @_;
####漢字コードをあわせる
if ( $code eq 'sjis' ){
print "Content-type: text/html; charset=shift_jis\n\n";
}elsif ( $code eq 'euc' ){
print "Content-type: text/html; charset=euc-jp\n\n";
} elsif ( $code eq 'jis' ){
print "Content-type: text/html; charset=iso-2022-jp\n\n";
}
}
#############################################################################
# 確認ファイルにデータを追加
# use:
# &addFile();
#############################################################################
sub addFile
{
local( $addFileName ) = @_;
if ( !( -e "$addFileName" )){ # ファイルが無い場合は新規で作成する
open( FILE , ">$addFileName" );
close( FILE );
chmod( 0600 , "$addFileName" );
}
if ( open( FILE , ">>$addFileName" )){ # 追加モードで開く
#######################
#今回のデータを追加
print FILE "$today,"; # 0:日付
print FILE "$nowtime,"; # 1:時間
print FILE "$host,"; # 2:ドメイン
print FILE "$addr,"; # 3:IP
$data = $form{'a'};
$data =~ s/\,/,/g;
print FILE "$data,"; # 4:アフェリエイト番号
$data = $ENV{'REQUEST_URI'};
$data =~ s/\,/,/g;
print FILE "$data,"; # 5:どんな指示できたのか?
$data = $ENV{'HTTP_REFERER'};
$data =~ s/\,/,/g;
print FILE "$data,"; # 6:どこから来たのか?
print FILE "\n"; # 改行
close( FILE );
}
}
#############################################################################
# ユーザーへのメール送信
# use:
# &hostMail
#############################################################################
sub hostMail
{
local( $ii );
#############################
# 管理者に送るメール
#############################
undef @upFile;
$subject = $mailTitle;
$message = "";
$message .= "■アクセス者\n";
$message .= "$host $addr\n\n";
$message .= "■日時\n";
$message .= "$today $nowtime\n\n";
$message .= "━━━━━━━━\n";
$message .= "このメールはシステムより自動配信されています。\n";
$message .= "このメールへの返信は絶対に行わないで下さい。\n";
$message .= "\n\n";
$upFile[0] = $visitorFile;
for ( $ii = 0 ; $ii <= $#toAddress ; $ii++ ){
&sendMailEx( $fromAddress , $toAddress[$ii] , $subject , $message , @upFile );
}
}
#############################################################################
# use:
# &sendMailEx();
#############################################################################
sub sendMailEx
{
local( $fromAddress , $toAddr , $subject , $message , @upFile ) = @_;
local( $i , $header , $body );
$bound = '3IwuWmML'; # 適当な文字列
undef @base64Data;
for ( $i = 0 ; $i <= $#upFile ; $i++ ){
if ( open( TMPFILE , "<$upFile[$i]" )){
$sdata = join('',);
close( TMPFILE );
$base64Data[$i] = &bodyencode($sdata, "b64");
$base64Data[$i] .= &benflush("b64");
}
@datas = split(/\//,$upFile[$i]);
$upFile[$i] = $datas[ $#datas ];
$upFile[$i] =~ tr/A-Z/a-z/;
}
###########################
$header = "";
## $header .= "FormMailer: FormMail\n";
$header .= "Return-Path: $fromAddress\n";
$header .= "To: $toAddr\n";
$header .= "From: $fromAddress\n";
$header .= "Subject: $subject\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$bound\"\n";
$body = "";
$body .= "--$bound\n";
$body .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
$body .= "Content-Transfer-Encoding: 7bit\n\n";
$body .= "$message\n";
$body .= "\n";
for ( $i = 0 ; $i <= $#upFile ; $i++ ){
$body .= "--$bound\n";
$body .= "Content-Type: application/octet-stream; name=\"$upFile[$i]\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "Content-Disposition: attachment; filename=\"$upFile[$i]\"\n";
$body .= "\n";
$body .= "$base64Data[$i]\n";
$body .= "\n";
}
$body .= "--$bound--\n\n\n";
&jcode::convert(*header,'jis');
&jcode::convert(*body,'jis');
$header .= "Content-length: " . length($body) . "\n\n";
if ( $ENV{ 'HTTP_HOST' } ne 'localhost' ){
if ( !open( MAIL , "| $sendmail -t")){
goto sendMailEx_end;
}
print MAIL "$header\n$body";
close(MAIL);
}else{
if ( !open( MAIL , "|C:/bin/sendmail -t")){
goto sendMailEx_end;
}
print MAIL "From: $fromAddress\n";
print MAIL "To: $toAddr\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$message\n";
for ( $i = 0 ; $i <= $#upFile ; $i++ ){
print MAIL "$upFile[$i]\n";
}
print MAIL "\n\n";
close(MAIL);
}
return 1;
sendMailEx_end:
####print "<$fonttype $fontstyleE>メール送信に失敗しました$fonttype>\n";
return 0;
}
#############################################################################
# 時間を得る
# use:
# ( $today , $nowtime , $weekstr ) = &getLocalTime();
#############################################################################
sub getLocalTime
{
local( @week ) = ( "日" , "月" , "火" , "水" , "木" , "金" , "土" );
local( $sec , $min , $hour , $day , $mon , $year , $weekday );
$ENV{'TZ'} = "JST-9";
( $sec , $min , $hour , $day , $mon , $year , $weekday ) = localtime( time );
$mon++;
$year += 1900;
if ( $mon <= 9 ){
$mon = "0$mon";
}
if ( $day <= 9 ){
$day = "0$day";
}
if ( $hour <= 9 ){
$hour = "0$hour";
}
if ( $min <= 9 ){
$min = "0$min";
}
return( "$year.$mon.$day" , "$hour:$min" , $week[ $weekday ] );
}
#############################################################################
# ホスト名を得る
# use:
# ( $host , $addr ) = &host( $ENV{'REMOTE_HOST'} , $ENV{'REMOTE_ADDR'} );
#############################################################################
sub getHost
{
local( $host , $addr ) = @_;
if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4",split(/\./,$addr)),2) || $addr;
}
if ($host =~ /(.*)\.(\d+)$/) { ; }
elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; }
elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; }
return( $host , $addr );
}
#############################################################################
# ヘッダ表示
# use:
# &getBrowser();
#############################################################################
sub getBrowser
{
local( $agent2 , $agent , $group );
$agent2 = $agent = $ENV{'HTTP_USER_AGENT'};
if ($agent =~ /AOL/) { $group = '' ; $agent = 'AOL'; }
elsif ($agent =~ /Opera/i) { $group = '' ; $agent = 'Opera'; }
elsif ($agent =~ /MSIE 3/i) { $group = 'IE' ; $agent = 'MSIE3'; }
elsif ($agent =~ /MSIE 4/i) { $group = 'IE' ; $agent = 'MSIE4'; }
elsif ($agent =~ /MSIE 5/i) { $group = 'IE' ; $agent = 'MSIE5'; }
elsif ($agent =~ /MSIE 6/i) { $group = 'IE' ; $agent = 'MSIE6'; }
elsif ($agent =~ /MSIE 7/i) { $group = 'IE' ; $agent = 'MSIE7'; }
elsif ($agent =~ /MSIE 8/i) { $group = 'IE' ; $agent = 'MSIE8'; }
elsif ($agent =~ /Mozilla\/2/i) { $group = 'NS' ; $agent = 'Netscape 2'; }
elsif ($agent =~ /Mozilla\/3/i) { $group = 'NS' ; $agent = 'Netscape 3'; }
elsif ($agent =~ /Mozilla\/4/i) { $group = 'NS' ; $agent = 'Netscape 4'; }
elsif ($agent =~ /Netscape ?6/i) { $group = 'NS' ; $agent = 'Netscape 6'; }
elsif ($agent =~ /Netscape\/7/i) { $group = 'NS' ; $agent = 'Netscape 7'; }
elsif ($agent =~ /Netscape\/8/i) { $group = 'NS' ; $agent = 'Netscape 8'; }
elsif ($agent =~ /Mozilla\/5/i) { $group = '' ; $agent = 'Mozilla'; }
elsif ($agent =~ /Netscape/i && $agent =~ /Gecko/i) { $group = '' ; $agent = 'Mozilla'; }
elsif ($agent =~ /Lynx/i) { $group = '' ; $agent = 'Lynx'; }
elsif ($agent =~ /Cuam/i) { $group = '' ; $agent = 'Cuam'; }
elsif ($agent =~ /Ninja/i) { $group = '' ; $agent = 'Ninja'; }
elsif ($agent =~ /WWWC/i) { $group = '' ; $agent = 'WWWC'; }
elsif ($agent =~ /DoCoMo/i) { $group = '' ; $agent = 'DoCoMo'; }
elsif ($agent =~ /J-PHONE/i) { $group = '' ; $agent = 'J-PHONE'; }
elsif ($agent =~ /UP\.Browser/i) { $group = '' ; $agent = 'EZweb'; }
elsif ($agent =~ /L\-mode/i) { $group = '' ; $agent = 'L-mode'; }
elsif ($agent =~ /ASTEL/i) { $group = '' ; $agent = 'ASTEL'; }
elsif ($agent =~ /PDXGW/i) { $group = '' ; $agent = 'H"'; }
return( $group , $agent );
}
#############################################################################
# フォームからの情報を連想配列 %form に入れる
# &initForm('euc');
#############################################################################
sub initForm
{
local($query, @assocarray, $assoc, $property, $value, $charcode, $method);
$charcode = $_[0];
$method = $ENV{'REQUEST_METHOD'};
$method =~ tr/A-Z/a-z/;
if ($method eq 'post') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
} else {
### 「GET」はセキュリティの為非対応にする
$query = $ENV{'QUERY_STRING'};
}
@assocarray = split(/&/, $query);
foreach $assoc (@assocarray) {
($property, $value) = split(/=/, $assoc);
if ( $property ne 'ls' ){ ## しかし ls の場合は+を使いたいのでspaceは困る
$value =~ tr/+/ /; ## 文章入力時に必要になるのではずせない…
}
$value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, $charcode);
$form{$property} = $value;
}
}
#############################################################################
# 排他制御 解除
# use:
# &lockExecute( ファイル名 );
#############################################################################
sub lockExecute
{
local( $filename ) = @_;
if ( $lockuse eq 1 ){
if ( open( LOCKFILE, ">$filename")){ # 新規で作成
flock( LOCKFILE , 2 );
print LOCKFILE "lock!";
$locksts = 1;
}
}
}
#############################################################################
# 排他制御 解除
# use:
# &unlockExecute();
#############################################################################
sub unlockExecute
{
if ( $lockuse eq 1 ){
if ( $locksts eq 1 ){
close( LOCKFILE );
flock( LOCKFILE , 8 );
$locksts = 0;
}
}
}