七行プログラミング (452レス)
前次1-
抽出解除 レス栞

266
(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);
267
(1): 04/03/04 21:42 ID:??? AAS
>>266
初級者お断りとは言わないし、むしろどんどんコードを書き込んでほしい
けれど、http://cm.xrea.cc/techinfo.cgi は一通り読んでほしいな。

ハッシュキーのクォート、ブロック末のセミコロン、関数の括弧、暗黙の
代入が行われる変数 etc etc... 文法的に省略可能な部分が沢山残って
いるのはちょっとねぇ。

print"Content-Type: text/plain\n\n";if(($_,$k)=split/&/,$ENV{QUERY_STRING}){/^
\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)&&($t++,print)while<F>;print"\n全$.件/".
"ヒット$t件"}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('<>',"$h$n$s",@ENV{REMOTE_ADDR
,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

Perl の習熟度に自信がないなら、自力で何とか10行、ぐらいのサイズ
から載せてくれたら、スレの住人がよってたかって縮めるんじゃないかな。
268
(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さんのにただ付け足した感じです。
それでも、たった一日でものすごい勉強になりました。
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"}

>>266です。
>>268はアクセスログ記録モードで呼び出したときもCSVのダウンロードダイアログが出る
という致命的なバグがありました。すみません。

バグ修正と、さらにパラメータで画面に表示/ダウンロードを選択できるようにしました。
また、REQUEST_URIも記録するようにしたので、サイト全体の解析にも使えるようになったと思います。
スクリプト名は他にあわせて、7accesslog.cgi と変更しようと思います。

こんなので掲載していただけるのであれば是非お願いします。
このスレのおかげで完成したと思っているので、私としては権利等の主張をする
つもりはありませんのでGPLあたりの他のスクリプト同様のライセンスにしてください。

■使用法
・記録時はSSI等で呼び出します。>>271さんみたいにJavaScriptでも呼び出せそうな気はします。
・表示およびダウンロード時はパラメータをつけて普通に呼び出します。
パラメータなし  アクセスログを記録。
   日付.txt に 時,分,秒,REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER を記録します。
パラメータあり  アクセスログを表示/ダウンロード
   第1パラメータ ・・・ 0:表示 1:ダウンロード
   第2パラメータ ・・・ ログの取得開始日(yyyymmdd)
   第3パラメータ ・・・ ログの取得終了日(yyyymmdd)
   第4パラメータ ・・・ ログ取得時の絞込みキーワード(省略すると全件取得)
   (例) http://hoge.com/7accesslog.cgi?1&20040301&20040331&MSIE
   この例では、2004年3月1日〜2004年3月31日までの「MSIE」を含むログがダウンロードされます。
280
(1): 266 04/03/16 18:36 ID:??? AAS
>7accesslog
for で $f..$t ってやると、月や年をまたいだ時、
無駄なファイルオープン(できないやつ)が多発するので
そこをなんとかしたいです・・・。

ヘタレな私にはいい方法が思いつきませんが。
283
(1): 266 04/03/17 10:18 ID:??? AAS
($a,$f,$t,$k)=@ARGV;$k=~s/%([\da-f]{2})/pack"H2",$1/egi;$l=$f.($t?"-$t":"").($k
?"-$k":"");print"Content-Type: text/",$a?"tab-separated-values\nContent-Dispo".
"sition: attachment;filename=log$l.csv":plain,"\n\n";$f?do{/^\d{4}(\d\d)(\d\d)$
/x&&$1*$2&&$1<13&&$2<32&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1,<F>)for$f..$t
||$f}:do{s/^\d$/0$&/for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;$m=~s/^\d$/0
$&/x;open F,">>$y$m$d.txt";print F join("\t",$y,$m,$d,$h,$n,$s,@ENV{REQUEST_URI
,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

■記録時
・ログファイルに日付も記録するよう変更。
(日付範囲を指定してログ表示した際に日付が無いとわけわからないため)

■閲覧時
・ダウンロード時のファイル名に抽出条件を盛り込むよう変更。
・1〜12月の1〜31日の間だけファイルオープンを試みるよう変更。

いろいろ増やしたらshebang無し七行になっちゃいました。
291
(1): 266 04/03/18 14:52 ID:vM8w8oY1(1)調 AAS
#! /usr/bin/perl
($a,$f,$t,$k)=@ARGV;$k=~s/%([\da-f]{2})/pack H2,$1/egi;print"Content-Type: te".
"xt/",$a?"tab-separated-values\nContent-Disposition: attachment;filename=$f".($
t&&"-$t").($k&&"-$k").'.log':plain,"\n\n";sub l{localtime}$f?do{/^....(..)(..)$
/x&$1*$2&$1<13&$2<32&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1,<F>)for$f..$t||$
f}:do{open F,sprintf">>%d%02d%02d.txt",(l)[5]+1900,(l)[4]+1,(l)[3];print F join
("\t",''.l,@ENV{REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

・書き込み時のファイル名構築の際に関数lを使用するよう変更
・0月も0日も除外するようあらためて変更
>>290さんの末尾の空フィールドができないよう変更

皆さんのおかげで再びshebang入り七行達成しました。
しかし、>>288-289のツールがあるなら、閲覧モードは不要だったりして・・・。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル アボンOFF

ぬこの手 ぬこTOP 0.026s