七行プログラミング (452レス)
上下前次1-新
278: 266 [] 04/03/15 14:12 ID:jJ3gsLA0(1) AAS
#! /usr/bin/perl
sub r{$r=$_[0]?"tab-separated-values\nContent-Disposition: attachment;filenam".
"e=log.csv":"plain";print"Content-Type: text/$r\n\n"}if(($a,$f,$t,$k)=split/&/,
$ENV{QUERY_STRING}){r $a;for($f...$t){/^\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)
&&(print)while<F>}}else{r;s/^\d$/0$&/for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;
$m++;$m=~s/^\d$/0$&/;open F,">>$y$m$d.txt";print F join("\t",$h,$n,$s,@ENV{
REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}
>>266266(6): nobody [] 04/03/04 17:41 ID:yJd59Upc(1) AAS
accesslog.cgi - 7行アクセス解析。
SSIで埋め込むことで記録。例:<!--#exec cgi="accesslog.cgi"-->
データを見るときは http://○○/accesslog.cgi?20040304&MSIE 6
みたいにパラメータ’日付 & 検索文字列(省略可))を渡して呼び出します。
正直perl歴はまだ半年で、テクニック的なものは使えないのでこの程度です。
#! /usr/bin/perl
sub z{local(*z)=$_[0];$z=~s/^(\d)$/0$1/;}print"Content-Type:text/plain\n\n";%e=
%ENV;$q=$e{'QUERY_STRING'};($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;z(*m);z(
*d);z(*h);z(*n);z(*s);if(!$q){open(F,">>$y$m$d.txt");print F
"$h$n$s<>$e{'REMOTE_ADDR'}<>$e{'HTTP_USER_AGENT'}<>$e{'HTTP_REFERER'}\n";}else{
($p,$k)=split(/&/,$q);open(F,"$p.txt");while(<F>){$c++;if($_=~/$k/){print;$t++;
}}print"\n全$c件/ヒット$t件\n";}close(F);
です。
>>268268(1): 266 [] 04/03/05 18:15 ID:EBEJkXEP(1) AAS
しっかりと読みました。
>>267さんが短くしてくれたおかげで、妥協した機能がつけれました。
日付の範囲指定を可能にして、データをtab区切りで記録して
ファイルを表示するのではなくCSV(TSV)としてDLするようにしてみました。
#! /usr/bin/perl
print"Content-Disposition: attachment;filename=log.csv;\nContent-Type: text/t".
"ab-separated-values\n\n";if(($f,$t,$k)=split/&/,$ENV{QUERY_STRING}){for($f...$
t){/^\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)&&(print)while<F>}}else{s/^\d$/0$&/
for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;$m=~s/^\d$/0$&/;open F,">>$y$m".
"$d.txt";print F join("\t",$h,$n,$s,@ENV{REMOTE_ADDR,HTTP_USER_AGENT,
HTTP_REFERER}),"\n"}
>>267さんのにただ付け足した感じです。
それでも、たった一日でものすごい勉強になりました。
はアクセスログ記録モードで呼び出したときもCSVのダウンロードダイアログが出る
という致命的なバグがありました。すみません。
バグ修正と、さらにパラメータで画面に表示/ダウンロードを選択できるようにしました。
また、REQUEST_URIも記録するようにしたので、サイト全体の解析にも使えるようになったと思います。
スクリプト名は他にあわせて、7accesslog.cgi と変更しようと思います。
こんなので掲載していただけるのであれば是非お願いします。
このスレのおかげで完成したと思っているので、私としては権利等の主張をする
つもりはありませんのでGPLあたりの他のスクリプト同様のライセンスにしてください。
■使用法
・記録時はSSI等で呼び出します。>>271271(1): nobodyさん [sage] 04/03/12 09:36 ID:??? AAS
● SSI での使用
__END__ トークン以下に
%s<br />all:%06d today:%03d yesterday:%03d
HTML ファイルの body 要素内に
<!--#include virtual="/cgi-bin/7rwcntr.cgi"-->
● JavaScript 経由で CGI プログラムとして使用
__END__ トークン以下に
function writeCount() {
document.write("%s<br />all:%06d today:%03d yesterday:%03d");
}
HTML ファイルの header 要素内に
<script src="/cgi-bin/7rwcntr.cgi?1" type="text/javascript"></script>
body 要素内に
<script type="text/javascript"><!--
writeCount();
//-->
</script>
さんみたいにJavaScriptでも呼び出せそうな気はします。
・表示およびダウンロード時はパラメータをつけて普通に呼び出します。
パラメータなし アクセスログを記録。
日付.txt に 時,分,秒,REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER を記録します。
パラメータあり アクセスログを表示/ダウンロード
第1パラメータ ・・・ 0:表示 1:ダウンロード
第2パラメータ ・・・ ログの取得開始日(yyyymmdd)
第3パラメータ ・・・ ログの取得終了日(yyyymmdd)
第4パラメータ ・・・ ログ取得時の絞込みキーワード(省略すると全件取得)
(例) 外部リンク[cgi]:hoge.com
この例では、2004年3月1日〜2004年3月31日までの「MSIE」を含むログがダウンロードされます。
上下前次1-新書関写板覧索設栞歴
あと 174 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.013s