#!/usr/local/bin/perl ################################################################################ # 高機能アクセス解析CGI Standard版(解析結果表示用) # Ver 2.3 # Copyright(C) futomi 2001 # http://www.futomi.com/ ############################################################################### my $COPYRIGHT = '
futomi\'s CGI Cafe 高機能アクセス解析CGI Standard版 Ver 2.3
'; unless(-e './jcode.pl') { &ErrorPrint('jcode.plがありません。'); } unless(-e './accconfig.cgi') { &ErrorPrint('accconfig.cgiがありません。'); } use Time::Local; require './accconfig.cgi'; require './jcode.pl'; use CGI; $| = 1; my $query = new CGI; my $mode = $query->param('MODE'); my $ana_month = $query->param('MONTH'); my $ana_day = $query->param('DAY'); # このCGIのURLを特定する。 my $CGI_URL; if($MANUAL_CGIURL =~ /^http:\/\//) { $CGI_URL = $MANUAL_CGIURL; } else { $CGI_URL = &GetCgiUrl; } # パスワード認証 my(%Cookie, $RequestPass, $RepeatFlag); if($AUTHFLAG) { %Cookie = &GetCookie; $RequestPass = $query->param('PASS'); $RepeatFlag = 0; if($Cookie{'PASS'}) { $RequestPass = $Cookie{'PASS'}; $RepeatFlag = 1; } unless(&Auth($RequestPass)) { &PrintAuthForm($RepeatFlag); } } # 曜日を定義する。 my @week_map = ('日', '月', '火', '水', '木', '金', '土'); # 定義ファイルを読み取る my %tld_list = &ReadDef('country_code.dat'); my %langcode_list = &ReadDef('language.dat'); # 過去ログリストを取得する my %LogList = &GetPastLogList; # 解析対象のログディレクトリ、ログファイルを特定 my($SelectedLogFile, $SelectedLogFileName) = &GetSelectedLogFile; # 入力値チェック &InputCheck; # ログファイルを読み取る if(-e $SelectedLogFile) { open(LOGFILE, "$SelectedLogFile") || &ErrorPrint("アクセスログ「$SelectedLogFile」をオープンできませんでした"); } else { &ErrorPrint("アクセスログ($SelectedLogFile)がありません。"); } my($date_check, $RemoteHostBuff, $CookieBuff, $RequestBuff, $RefererBuff, $UserAgentBuff, $AcceptLangBuff, $ScreenBuff); my(%all_date, %date, %remote_host, %request, %referer, %user_agent, %accept_language, %screen); my($date_check_mon, $date_check_day); my $i = 0; while() { chop; next if($_ eq ''); if(/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+\"([^\"]+)\"\s+\"([^\"]+)\"\s+\"([^\"]+)\"/) { $date_check = $1; $RemoteHostBuff = $2; $CookieBuff = $3; $RequestBuff = $5; $RefererBuff = $6; $UserAgentBuff = $7; $AcceptLangBuff = $8; $ScreenBuff = $9; } else { next; } next if($date_check eq ''); $all_date{$i} = $date_check; $date_check_mon = substr($date_check, 0, 6); $date_check_day = substr($date_check, 6, 2); $date_check_day =~ s/^0//; if($mode eq 'MONTHLY' || $mode eq 'DAILY') { next unless($date_check_mon eq $ana_month); if($mode eq 'DAILY') { next unless($date_check_day eq $ana_day); } } $date{$i} = $date_check; $remote_host{$i} = $RemoteHostBuff; $request{$i} = $RequestBuff; $referer{$i} = $RefererBuff; $user_agent{$i} = $UserAgentBuff; $accept_language{$i} = $AcceptLangBuff; $screen{$i} = $ScreenBuff; $i ++; } close(LOGFILE); my $loglines = $i; # 対象ログ数のチェック unless($loglines >= 1) { &ErrorPrint('対象のログが一件もありません。'); } # 対象ログの調査開始時と調査終了時を調べる my($min_date, $max_date); ($min_date, $max_date) = &AnalyzeDateRange; # ログファイルのサイズを調べる(バイト) my $log_size = &AnalyzeLogfileSize($SelectedLogFile); # アクセス元HOST名、国名ランキングを調べる &AnalyzeRemoteHost; # ブラウザー表示可能言語一覧を調べる %language_list = &AnalyzeAcceptLang; # OS, ブラウザーを調べる &AnalyzeUserAgent; # 時間別、曜日別、日付別、月別リクエスト数を調べる &AnalyzeRequestDate; # Request Report を調べる &AnalyzeRequestResource; # リンク元URL、検索エンジンの検索キーワードを調べる &AnalyzeReferer; # スクリーン情報を調べる &AnalyzeScreen; # ヘッダー出力 &HtmlHeader; # 解析概要を出力 &PrintSummary; # リンク出力 &PrintLink; # アクセス元トップレベルドメイン(TLD)を出力 &PrintRemoteTLD; # アクセス元ドメイン名を出力 &PrintRemoteDomain; # アクセス元ホスト名を出力 &PrintRomoteHost; # ブラウザー表示可能言語レポートを出力 &PrintHttpLang; # ブラウザーレポートを出力 &PrintHttpUserAgentBrowser; # プラットフォームレポートを出力 &PrintHttpUserAgentPlatform; # 月別リクエスト数レポート # 全指定解析モードの場合にのみ出力する。 if($mode eq '') { &PrintRequestMonthly; } # 日付別リクエスト数レポート # 月指定解析モードの場合にのみ出力する。 if($mode eq 'MONTHLY') { &PrintRequestDaily; } # 時間別アクセス数レポート &PrintRequestHourly; # 曜日別アクセス数レポート unless($mode eq 'DAILY') { &PrintRequestWeekly; } # Request Report を出力 &PrintRequestFile; # リンク元サイトレポート &PrintRefererSite; # リンク元URLを出力 &PrintRefererUrl; # 検索エンジンの検索キーワードを出力 &PrintKeyword; # 画面解像度を出力 &PrintResolution; # 画面色深度を出力 &PrintColorDepth; # ビデオメモリーサイズ推定出力 &PrintVideoMemory; # リンク出力 &PrintLink; # フッターを出力 &HtmlFooter; exit; sub AnalyzeDateRange { # 対象ログの調査開始時と調査終了時を調べる my($min_date) = 99999999999999; my($max_date) = 0; my($i); for $i (keys(%date)) { if($all_date{$i} > $max_date) { $max_date = $date{$i}; } if($date{$i} < $min_date) { $min_date = $date{$i}; } } return($min_date, $max_date); } # ログファイルのサイズを調べる(KB) sub AnalyzeLogfileSize { my($File) = @_; my(@log_stat) = stat($File); my($log_size) = $log_stat[7]; return $log_size; } # アクセス元ホスト名、ドメイン名、国名ランキングを調べる sub AnalyzeRemoteHost { my($i, $tld, $sld, $thld, @dom_buff); for $i (keys(%remote_host)) { $host_list{$remote_host{$i}} ++; @dom_buff = split(/\./, $remote_host{$i}); $tld = pop(@dom_buff); $sld = pop(@dom_buff); $thld = pop(@dom_buff); if($tld eq '' || $tld =~ /[^a-zA-Z]/) { $country_list{'?'} ++; } else { $country_list{$tld} ++; } if($tld eq '' && $sld eq '' && $thld eq '') { $domain_list{'?'} ++; } elsif($tld =~ /[^a-zA-Z]/) { $domain_list{'?'} ++; } else { if(length($tld) >= 3) { $domain_list{"$sld\.$tld"} ++; } else { $domain_list{"$thld\.$sld\.$tld"} ++; } } } } # ブラウザー表示可能言語一覧を調べる sub AnalyzeAcceptLang { my(%language_list, $i ,@buff, $max, $j, $lang_tmp, $value_tmp, $lang, $value); for $i (keys(%accept_language)) { @buff = split(/,/, $accept_language{$i}); $max = 0; undef $lang; for $j (@buff) { ($lang_tmp, $value_tmp) = split(/\;/, $j); $value_tmp =~ s/q=//; $value_tmp = 1 if($value_tmp eq ''); if($max < $value_tmp) { $lang = $lang_tmp; $value = $value_tmp; $max = $value_tmp; } } $language_list{"\L$lang"} ++; } return %language_list; } sub AnalyzeUserAgent { # OS, ブラウザーを調べる my($ua, $platform, $platform_v, $browser, $browser_v); for $ua (keys(%user_agent)) { ($platform, $platform_v, $browser, $browser_v) = &User_Agent($user_agent{$ua}); $browser_list{$browser} ++; $browser_v_list{"$browser:$browser_v"} ++; $platform_list{"$platform"} ++; $platform_v_list{"$platform:$platform_v"} ++; } } sub AnalyzeRequestDate { # 時間別、曜日別、日付別、月別リクエスト数を調べる my($hourly, $daily_y, $daily_m, $daily_d, @daily_array); for $key (keys(%date)) { $hourly = substr($date{$key}, 8, 2); $hourly_list{$hourly} ++; $daily_y = substr($date{$key}, 0, 4); $daily_m = substr($date{$key}, 4, 2); $daily_d = substr($date{$key}, 6, 2); @daily_array = localtime(timelocal(0, 0, 0, $daily_d, $daily_m - 1, $daily_y)); $daily_list{$daily_array[6]} ++; $date_list{"$daily_y$daily_m$daily_d"} ++; $monthly_list{"$daily_y$daily_m"} ++; } } sub AnalyzeRequestResource { # Directory Report, Request Report を調べる my(@req_buff, $req_dir, $cnt, $uri); my($HtmlFilePath, $Index,$FileTest, $HitFlag, $RequestUri); for $key (keys(%request)) { if($request{$key} =~ /\/$/) { $_ = $request{$key}; m|^https*://[^\/]+/(.*)$|; $RequestUri = "/$1"; $HtmlFilePath = $ENV{'DOCUMENT_ROOT'}.$RequestUri; $HitFlag = 0; for $Index (@DIRECTORYINDEX) { $FileTest = $HtmlFilePath.$Index; if(-e $FileTest) { $uri = $request{$key}.$Index; $HitFlag = 1; last; } } unless($HitFlag) {$uri = $request{$key};} } else { $uri = $request{$key}; } $request_list{$uri} ++; } } sub AnalyzeReferer { # リンク元URL、検索エンジンの検索キーワードを調べる my($key, $url, $getstr, @parts, $part, $name, $value, %variables, $word, $decode_str); for $key (keys(%referer)) { next if($referer{$key} eq ''); next unless($referer{$key} =~ /^http/); $referer_list{$referer{$key}} ++; ($url, $getstr) = split(/\?/, $referer{$key}); next if($getstr eq ''); @parts = split(/\&/, $getstr); %variables = (); for $part (@parts) { ($name, $value) = split(/=/, $part); $variables{$name} = $value; } $search_word = ''; if($url =~ /lycos/) { $word = $variables{'query'}; } elsif($url =~ /\.yahoo\./) { $word = $variables{'p'}; } elsif($url =~ /\.infoseek\./) { $word = $variables{'qt'}; } elsif($url =~ /\.goo\.ne\.jp/) { $word = $variables{'MT'}; } elsif($url =~ /google.com/) { $word = $variables{'q'}; } elsif($url =~ /navi\.ocn\.ne\.jp/) { if($url =~ /search\./) { $word = $variables{'kw'}; } else { $word = $variables{'keyword'}; } } elsif($url =~ /excite\./) { $word = $variables{'s'}; } elsif($url =~ /fresheye\.com/) { $word = $variables{'kw'}; } elsif($url =~ /para\.cab\.infoweb\.ne\.jp/) { $word = $variables{'Querystring'}; } elsif($url =~ /\.dragon\.co\.jp/) { $word = $variables{'query'}; } elsif($url =~ /inetg\.com/) { $word = $variables{'key'}; } elsif($url =~ /search\.biglobe\.ne\.jp/) { $word = $variables{'q'}; } elsif($url =~ /\.msn\./) { $word = $variables{'q'}; } elsif($url =~ /\.isize\./) { $word = $variables{'QueryString'}; } elsif($url =~ /search\.odn\.ne\.jp\//) { $word = $variables{'QueryString'}; } next if($word eq ''); $decode_str = &URL_Decode($word); &jcode::convert(\$decode_str, "sjis"); $search_word{$decode_str} ++; } } sub AnalyzeScreen { for $key (keys(%screen)) { if($screen{$key} eq '-' || $screen{$key} eq '') { next; } ($ScreenWidth, $ScreenHeight, $ColorDepth) = split(/\s/, $screen{$key}); $ScreenResolution{"$ScreenWidth×$ScreenHeight"} ++; $ScreenColorDepth{"$ColorDepth"} ++; $VideoMemorySize = (int($ScreenWidth * $ScreenHeight * $ColorDepth * 10 / 8 / 1024 / 1024)) / 10; unless( ($VideoMemorySize*10)%10 == 0) { $VideoMemorySize = int($VideoMemorySize) + 1; } $VideoMemory{$VideoMemorySize} ++; } } sub PrintSummary { my($min_year) = substr($min_date, 0, 4); my($min_mon) = substr($min_date, 4, 2); my($min_mday) = substr($min_date, 6, 2); my($min_hour) = substr($min_date, 8, 2); my($min_min) = substr($min_date, 10, 2); my($min_sec) = substr($min_date, 12, 2); my($max_year) = substr($max_date, 0, 4); my($max_mon) = substr($max_date, 4, 2); my($max_mday) = substr($max_date, 6, 2); my($max_hour) = substr($max_date, 8, 2); my($max_min) = substr($max_date, 10, 2); my($max_sec) = substr($max_date, 12, 2); # 対象ログ内の対象月のリストを作成する my(%year_mon_list, $year_mon); for $i (keys(%all_date)) { $year_mon = substr($all_date{$i}, 0, 6); $year_mon_list{$year_mon} ++; } print "
\n"; print '概要',"\n"; print "\n"; # ページビュー欄出力 print "\n"; print " \n"; print " \n"; print "\n"; # ログファイル欄出力 print "\n"; print "\n"; print " \n"; print " \n"; print "\n"; print "\n"; # ログファイルサイズ欄出力 print "\n"; print " \n"; print " \n"; print "\n"; # ログローテーションサイズ欄出力 my($LogSizeRate) = int(($log_size * 100 / $LOTATION_SIZE) * 10) / 10; if($LogSizeRate > 100) {$LogSizeRate = 100;} my($LogSizeGraphMaxLen) = 150; #ピクセル my($LogSizeGraphLen) = int($LogSizeGraphMaxLen * $LogSizeRate / 100); #ピクセル print "\n"; print " \n"; print " \n"; print "\n"; # 解析モード欄出力 print "\n"; print " \n"; print " \n"; } elsif($mode eq 'MONTHLY') { print "月指定 $tmp_year年 $tmp_mon月\n"; } else { print "全指定\n"; } print "\n"; # 解析モード指定欄出力 print "\n"; print "\n"; print "\n"; print " \n"; print " \n"; print "\n"; print "\n"; # 解析対象期間欄出力 print "\n"; print " \n"; print " \n"; print "\n"; print "
ページビュー$loglines
ログファイル\n"; print ' \n"; print " \n"; print "
ログファイルサイズ$log_size バイト
ログローテーションサイズ\n"; print " \n"; print " \n"; print " \n"; print "
$LOTATION_SIZE バイト(使用率 $LogSizeRate%)\n"; print "
\n"; print "
 
\n"; print "
\n"; print "
\n"; print "
解析モード\n"; $tmp_year = substr($ana_month, 0, 4); $tmp_mon = substr($ana_month, 4, 2); if($mode eq 'DAILY') { print "日指定 $tmp_year年 $tmp_mon月 $ana_day日
解析モード指定\n"; print " \n"; print ' \n"; if($mode eq 'DAILY') { print " 日\n"; } else { print " 日\n"; } print " \n"; print "
解析対象期間$min_year/$min_mon/$min_mday $min_hour:$min_min:$min_sec 〜 $max_year/$max_mon/$max_mday $max_hour:$max_min:$max_sec
\n"; print "
\n"; } sub PrintLink { print "
\n"; print '国別ドメイン名レポート | アクセス元ドメイン名レポート | アクセス元ホスト名レポート | ブラウザー表示可能言語レポート | ブラウザーレポート | プラットフォーム レポート | '; if($mode eq 'MONTHLY') { print '日付別アクセス数レポート | '; } if($mode eq '') { print '月別アクセス数レポート | '; } print '時間別アクセス数レポート | '; unless($mode eq 'DAILY') { print '曜日別アクセス数レポート | '; } print 'リクエストレポート | リンク元サイトレポート | リンク元URLレポート | 検索エンジンの検索キーワード レポート | クライアント画面解像度 レポート | クライアント画面色深度 レポート | クライアントビデオメモリーサイズ レポート'; print "

\n"; } sub PrintRemoteTLD { # 国別ドメイン名レポート print "
\n"; print '国別ドメイン名レポート',"\n"; print '',"\n"; print '',"\n"; my $order = 1; foreach $key (ValueSort(\%country_list)) { $rate = int($country_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $order ++; } print "
順位TLD国名リクエスト数グラフ
$order$key$tld_list{$key}$country_list{$key}"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
\n"; print "

\n"; } sub PrintRemoteDomain { # アクセス元ドメイン名レポート print "
\n"; print 'アクセス元ドメイン名レポート',"\n"; print '',"\n"; print '',"\n"; $order = 1; $dsp_order = 1; foreach $key (ValueSort(\%domain_list)) { unless($domain_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($domain_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $pre_velue = $domain_list{$key}; $order ++; } print "
順位ドメイン名リクエスト数グラフ
$dsp_order$key$domain_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
\n"; print "

\n"; } sub PrintRomoteHost { # アクセス元ホスト名レポート print "
\n"; print 'アクセス元ホスト名レポート',"\n"; print '',"\n"; print '',"\n"; $order = 1; $dsp_order = 1; foreach $key (ValueSort(\%host_list)) { unless($host_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($host_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $pre_velue = $host_list{$key}; $order ++; } print "
順位ホスト名リクエスト数グラフ
$dsp_order
$key$host_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
\n"; print "

\n"; } sub PrintHttpLang { # ブラウザー表示可能言語レポート print "
\n"; print 'ブラウザー表示可能言語レポート',"\n"; print '',"\n"; print '',"\n"; my $lang_order = 1; foreach $key (ValueSort(\%language_list)) { $rate = int($language_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $lang_order ++; } print "
順位言語リクエスト数グラフ
$lang_order"; if($key eq '') { print "不明"; } else { print "$langcode_list{$key} ($key)"; } print "$language_list{$key}"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
\n"; print "

\n"; } sub PrintHttpUserAgentBrowser { # ブラウザーレポート print "
\n"; print 'ブラウザーレポート',"\n"; print '',"\n"; print '',"\n"; my $browser_order = 1; foreach $key (ValueSort(\%browser_list)) { $rate = int($browser_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; for $key1 (sort(keys(%browser_v_list))) { if($key1 =~ /^$key:/) { $rate2 = int($browser_v_list{$key1} * 10000 / $loglines) / 100; $GraphLength2 = int($GRAPHMAXLENGTH * $rate2 / 100); $v = $key1; $v =~ s/^$key://; print ""; print "\n"; } } $browser_order ++; } print "
順位ブラウザーリクエスト数グラフ
$browser_order"; if($key eq '') { print " 不明$browser_list{$key}"; } else { print " $key$browser_list{$key}"; } if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
  • $v
  • $browser_v_list{$key1}"; if($rate2 < 1) { print "\ \;"; } else { print ""; } print " ($rate2%)
    \n"; print "

    \n"; } sub PrintHttpUserAgentPlatform { # platform レポート print "
    \n"; print 'プラットフォーム レポート',"\n"; print '',"\n"; print '',"\n"; my $os_order = 1; foreach $key (ValueSort(\%platform_list)) { $rate = int($platform_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; for $key1 (sort(keys(%platform_v_list))) { if($key1 =~ /^$key:/) { $rate2 = int($platform_v_list{$key1} * 10000 / $loglines) / 100; $GraphLength2 = int($GRAPHMAXLENGTH * $rate2 / 100); $v = $key1; $v =~ s/^$key://; print ""; print "\n"; } } $os_order ++; } print "
    順位Operating Systemリクエスト数グラフ
    $os_order"; if($key eq '') { print " 不明$platform_list{$key}"; } else { print " $key$platform_list{$key}"; } if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
  • $v
  • $platform_v_list{$key1}"; if($rate2 < 1) { print "\ \;"; } else { print ""; } print " ($rate2%)
    \n"; print "

    \n"; } sub PrintRequestMonthly { print "
    \n"; print '月別アクセス数レポート',"\n"; print '',"\n"; print '',"\n"; for $key (keys(%monthly_list)) { $tmp_year = substr($key, 0, 4); $tmp_mon = substr($key, 4, 2); $rate = int($monthly_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); if($monthly_list{$key} > 0) { print "\n"; $key ++; } print "
    リクエスト数グラフ
    $tmp_year年 $tmp_mon月"; } else { print "
    $tmp_year年 $tmp_mon月"; } print "$monthly_list{$key}"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRequestDaily { print "
    \n"; print '日付別アクセス数レポート',"\n"; print '',"\n"; print '',"\n"; $key = 1; my($tmp_year) = substr($ana_month, 0, 4); my($tmp_mon) = substr($ana_month, 4, 2); my($last_day) = &LastDay($tmp_year, $tmp_mon); while($key <= $last_day) { if($key < 10) { $tmp_day = "0$key"; } else { $tmp_day = $key; } $rate = int($date_list{"$tmp_year$tmp_mon$tmp_day"} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); $tmp_cnt = $date_list{"$tmp_year$tmp_mon$tmp_day"}; $tmp_cnt = 0 if($date_list{"$tmp_year$tmp_mon$tmp_day"} eq ''); $youbi = &Youbi($tmp_year, $tmp_mon, $key); if($tmp_cnt > 0) { print "\n"; $key ++; } print "
    日付リクエスト数グラフ
    $tmp_year年 $tmp_mon月 $tmp_day日 ("; } else { print "
    $tmp_year年 $tmp_mon月 $tmp_day日 ("; } if($youbi == 0) { print "$week_map[$youbi]"; } elsif($youbi == 6) { print "$week_map[$youbi]"; } else { print "$week_map[$youbi]"; } print ")$tmp_cnt"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRequestHourly { # 時間別アクセス数レポート print "
    \n"; print '時間別アクセス数レポート',"\n"; print '',"\n"; print '',"\n"; $key = 0; until ($key ==24) { if($key < 10) { $key1 = "0$key"; } else { $key1 = $key; } $rate = int($hourly_list{$key1} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); $hourly_list{$key1} = 0 if($hourly_list{$key1} eq ''); print "\n"; $key ++; } print "
    時間リクエスト数グラフ
    $key$hourly_list{$key1}"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRequestWeekly { # 曜日別アクセス数レポート print "
    \n"; print '曜日別アクセス数レポート',"\n"; print '',"\n"; print '',"\n"; $key = 0; until($key == 7) { $rate = int($daily_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); $daily_list{$key} = 0 if($daily_list{$key} eq ''); print "\n"; $key ++; } print "
    曜日リクエスト数グラフ
    $week_map[$key]$daily_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRequestFile { # Request Report を表示 print "
    \n"; print 'リクエストレポート',"\n"; print '',"\n"; print '',"\n"; my($order) = 1; my($dsp_order) = 1; my($key, $HtmlTitle); foreach $key (ValueSort(\%request_list)) { unless($request_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($request_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); $HtmlTitle = &GetHtmlTitle($key); print "\n"; $pre_velue = $request_list{$key}; $order ++; } print "
    順位ファイルリクエスト数グラフ
    $dsp_order"; if($HtmlTitle) { print "$HtmlTitle"; } else { print "Page Has No Title"; } print "
    $key
    $request_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRefererSite { # リンク元サイト print "
    \n"; print 'リンク元サイトレポート',"\n"; print '',"\n"; print '',"\n"; my($key, $dsp_url); my($order) = 1; my($dsp_order) = 1; my($refererSite_list) = (); my($url, $site, @url_parts, $Flag, $ExceptUrl); for $url (keys %referer_list) { $Flag = 0; if(scalar @MY_SITE_URLs) { for $ExceptUrl (@MY_SITE_URLs) { if($url =~ /^$ExceptUrl/) { $Flag = 1; last; } } } if($Flag) {next;} @url_parts = split(/\//, $url); $site = "http://$url_parts[2]/"; $refererSite_list{$site} += $referer_list{$url}; } foreach $key (ValueSort(\%refererSite_list)) { unless($refererSite_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($refererSite_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); if(length($key) > 50) { $dsp_url = substr($key, 0, 50); $dsp_url .= '...'; } else { $dsp_url = $key; } print "\n"; $pre_velue = $refererSite_list{$key}; $order ++; } print "
    順位サイトリクエスト数グラフ
    $dsp_order$dsp_url$refererSite_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintRefererUrl { # リンク元URL print "
    \n"; print 'リンク元URLレポート',"\n"; print '',"\n"; print '',"\n"; my($key, $dsp_url, $ExceptUrl, $Flag); my($order) = 1; my($dsp_order) = 1; foreach $key (ValueSort(\%referer_list)) { $Flag = 0; if(scalar @MY_SITE_URLs) { for $ExceptUrl (@MY_SITE_URLs) { if($key =~ /^$ExceptUrl/) { $Flag = 1; last; } } } if($Flag) {next;} unless($referer_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($referer_list{$key} * 10000 / $loglines) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); # 表示するURLを、50文字に縮める if(length($key) > 50) { $dsp_url = substr($key, 0, 50); $dsp_url .= '...'; } else { $dsp_url = $key; } print "\n"; $pre_velue = $referer_list{$key}; $order ++; } print "
    順位URLリクエスト数グラフ
    $dsp_order$dsp_url$referer_list{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintKeyword { # 検索エンジンの検索キーワードを表示する。 print "
    \n"; print '検索エンジンの検索キーワード レポート',"\n"; print '',"\n"; print '',"\n"; my($key, $dsp_url); my($order) = 1; my($dsp_order) = 1; my($cnt, $word); $cnt = 0; for $word (keys(%search_word)) { $cnt += $search_word{$word}; } foreach $key (ValueSort(\%search_word)) { unless($search_word{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($search_word{$key} * 10000 / $cnt) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $pre_velue = $search_word{$key}; $order ++; } print "
    順位キーワードリクエスト数グラフ
    $dsp_order$key$search_word{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintResolution { # 解像度を表示する。 print "
    \n"; print 'クライアント画面解像度レポート',"\n"; print '',"\n"; print '',"\n"; my($key, $dsp_url); my($order) = 1; my($dsp_order) = 1; my($cnt); $cnt = 0; for $key (keys(%ScreenResolution)) { $cnt += $ScreenResolution{$key}; } foreach $key (ValueSort(\%ScreenResolution)) { unless($ScreenResolution{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($ScreenResolution{$key} * 10000 / $cnt) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $pre_velue = $ScreenResolution{$key}; $order ++; } print "
    順位解像度リクエスト数グラフ
    $dsp_order$key$ScreenResolution{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintColorDepth { # 色深度を表示する。 print "
    \n"; print 'クライアント画面色深度 レポート',"\n"; print '',"\n"; print '',"\n"; my($key); my($order) = 1; my($dsp_order) = 1; my($cnt); $cnt = 0; for $key (keys(%ScreenColorDepth)) { $cnt += $ScreenColorDepth{$key}; } foreach $key (ValueSort(\%ScreenColorDepth)) { unless($ScreenColorDepth{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($ScreenColorDepth{$key} * 10000 / $cnt) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); $ColorCount = 2 ** $key; print "\n"; $pre_velue = $ScreenColorDepth{$key}; $order ++; } print "
    順位色深度リクエスト数グラフ
    $dsp_order$ColorCount色($key bit)$ScreenColorDepth{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } sub PrintVideoMemory { # ビデオメモリーサイズを表示する。 print "
    \n"; print 'クライアントビデオメモリーサイズ レポート',"\n"; print '',"\n"; print '',"\n"; my($key); my($order) = 1; my($dsp_order) = 1; my($cnt); $cnt = 0; for $key (keys(%VideoMemory)) { $cnt += $VideoMemory{$key}; } foreach $key (ValueSort(\%VideoMemory)) { unless($VideoMemory{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $ROW); } $rate = int($VideoMemory{$key} * 10000 / $cnt) / 100; $GraphLength = int($GRAPHMAXLENGTH * $rate / 100); print "\n"; $pre_velue = $VideoMemory{$key}; $order ++; } print "
    順位メモリーサイズリクエスト数グラフ
    $dsp_order$key MB$VideoMemory{$key}\n"; if($rate < 1) { print ""; } else { print ""; } print " ($rate%)
    \n"; print "

    \n"; } # URLエンコードされた文字列を、デコードして返す sub URL_Decode { my($str) = @_; $str =~ s/\+/ /g; $str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; return $str; } # 西暦、月、日を引数に取り、曜日コードを返す。 # 日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6 sub Youbi { my($year, $month, $day) = @_; my($time) = timelocal(0, 0, 0, $day, $month - 1, $year); my(@date_array) = localtime($time); return $date_array[6]; } # 西暦と月を引数に取り、該当月の最終日を返す sub LastDay { my($year, $month) = @_; $month =~ s/^0//; if($month =~ /[^0-9]/ || $year =~ /[^0-9]/) { return ''; } if($month < 1 && $month > 12) { return ''; } if($year > 2037 || $year < 1900) { return ''; } my($lastday) = 1; my($time) = timelocal(0, 0, 0, 1, $month-1, $year-1900); my(@date_array) = localtime($time); my($mon) = $date_array[4]; my($flag) = 1; my($count) = 0; while($flag) { if($mon ne $date_array[4]) { return $lastday; $flag = 0; } $lastday = $date_array[3]; $time = $time + (60 * 60 * 24); @date_array = localtime($time); $count ++; last if($count > 40); } } sub DateConv { my($day_time) = @_; my(@temp) = split(/ /, $day_time); $day_time = $temp[0]; my($day, $hour, $min, $sec) = split(/:/, $day_time); my($mday, $mon, $year) = split(/\//, $day); %month = ( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04', 'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12' ); $mon = $month{$mon}; return '' if($mon eq ''); my($conv_time) = "$year$mon$mday$hour$min$sec"; return $conv_time; } sub HtmlHeader { print "Content-type: text/html\n"; if($AUTHFLAG) { $CookieHeaderString = &SetCookie('PASS', $RequestPass); print "$CookieHeaderString\n"; } print "\n"; open(HEAD, "./header.temp"); my $line; while() { $line = $_; $line =~ s/\$COPYRIGHT\$/$COPYRIGHT/g; print "$line"; } close(HEAD); } sub HtmlFooter { open(FOOT, "./footer.temp"); my $line; while() { $line = $_; $line =~ s/\$COPYRIGHT\$/$COPYRIGHT/g; print "$line"; } close(FOOT); } sub ErrorPrint { local($message) = @_; &HtmlHeader; print "
    \n"; print "$message\n"; print "
    \n"; &HtmlFooter; exit; } sub InputCheck { if($mode eq 'DAILY') { if($ana_day =~ /[^0-9]/) { &ErrorPrint('日付は、半角数字で指定してください。'); } $tmp_year = substr($ana_month, 0, 4); $tmp_mon = substr($ana_month, 4, 2); $last_day = &LastDay($tmp_year, $tmp_mon); if($ana_day > $last_day || $ana_day < 1) { &ErrorPrint('日付が正しくありません。'); } } } # 連想配列を値(value)でソートした連想配列を返す sub ValueSort { my $x = shift; my %array=%$x; return sort {$array{$b} <=> $array{$a};} keys %array; } # 指定された定義ファイルを読み取り、連想配列を返す。 sub ReadDef { my($file) = @_; my(@buff, %array); open(FILE, "$file") || &ErrorPrint("$file をオープンできませんでした。"); while() { chop; @buff = split(/=/); $array{$buff[0]} = $buff[1]; } close(FILE); return %array; } sub Auth { my($RequestPass) = @_;; if($RequestPass eq $PASSWORD) { return 1; } else { return 0; } } sub PrintAuthForm { my($Repeat) = @_; print $query->header; my($Title) = '管理者ログイン画面 [futomi\'s CGi Cafe 高機能アクセス解析CGI]'; print $query->start_html(-title=>$Title, -BGCOLOR=>'white'); if($Repeat) { print "パスワードが違います。\n"; } print $query->start_form(-method=>'POST',-action=>$CGI_URL); print $query->br; print "パスワード "; print $query->password_field(-name=>'PASS'); print $query->submit(-name=>'submit', -value=>' 認 証 '); print $query->endform; exit; } sub SetCookie { my($CookieName, $CookieValue) = @_; # URLエンコード $CookieValue =~ s/([^\w\=\& ])/'%' . unpack("H2", $1)/eg; $CookieValue =~ tr/ /+/; my($CookieHeaderString) = "Set-Cookie: $CookieName=$CookieValue\;"; return $CookieHeaderString; } sub GetCookie { my(@CookieList) = split(/\; /, $ENV{'HTTP_COOKIE'}); my(%Cookie) = (); my($key, $CookieName, $CookieValue); for $key (@CookieList) { ($CookieName, $CookieValue) = split(/=/, $key); $CookieValue =~ s/\+/ /g; $CookieValue =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $Cookie{$CookieName} = $CookieValue; } return %Cookie; } sub GetCgiUrl { my $url; $url = $ENV{'SCRIPT_URI'}; if($url =~ /^http/) { return $url; } if($ENV{'REDIRECT_URL'}) { $url = 'http://'.$ENV{'HTTP_HOST'}.$ENV{'REDIRECT_URL'}; } else { $url = 'http://'.$ENV{'HTTP_HOST'}.$ENV{'SCRIPT_NAME'}; } return $url; } sub GetSelectedLogFile { my $LogDir = $LOG; $LogDir =~ s/\/([^\/]*)$//; my $LogFileName = $1; my $SelectedLogFileName = $query->param('LOG'); unless($SelectedLogFileName) { if($LOTATION == 2) { my $DateStr = &GetToday; $SelectedLogFileName = "$LogFileName\.$DateStr"; } else { $SelectedLogFileName = $LogFileName; } } my $SelectedLogFile = "$LogDir/$SelectedLogFileName"; return($SelectedLogFile, $SelectedLogFileName); } sub GetPastLogList { my %LogList = (); my $LogDir = $LOG; $LogDir =~ s/\/([^\/]*)$//; my $LogFileName = $1; $LogList{$LogFileName} = $LOG; unless($LogDir) {$LogDir = '.';} opendir(LOGDIR, "$LogDir") || &ErrorPrint("ログ格納ディレクトリ「$LogDir」をオープンできませんでした。"); my @FileList = readdir(LOGDIR); for $key (@FileList) { if($key =~ /^$LogFileName\.[0-9]{8}$/) { $LogList{$key} = "$LogDir\/$key"; } } return %LogList; } sub GetToday { my(@Date) = localtime(time + $TIMEDIFF*60*60); my($Year) = $Date[5] + 1900; my($Mon) = $Date[4] + 1; my($Day) = $Date[3]; if($Mon < 10) {$Mon = "0$Mon";} if($Day < 10) {$Day = "0$Day";} return $Year.$Mon.$Day; } #指定したドキュメントルートからのパスから、タイトルを取得する。 sub GetHtmlTitle { my($URL) = @_; my($Title, $Path); my($HtmlFile); if($URL2PATH_FLAG) { my($key); for $key (keys %URL2PATH) { if($URL =~ /^$key/) { $HtmlFile = $URL; $HtmlFile =~ s/^$key/$URL2PATH{$key}/; } } unless($HtmlFile) { return ''; } } else { $_ = $URL; m|http://[^/]+/(.*)|; $Path = '/'.$1; $HtmlFile = $ENV{'DOCUMENT_ROOT'}.$Path; } my($HitFlag) = 0; unless(-e $HtmlFile) {return ''}; open(HTML, "$HtmlFile") || return ''; while() { chop; $LineString = $_; if( $LineString =~ /([^<]*)<\/title>/i ) { $Title = $1; $HitFlag = 1; last; } if( $LineString =~ /<\/head>/i ) {last;} } close(HTML); if($HitFlag) { &jcode::convert(\$Title, "sjis"); return $Title; } else { return ''; } } sub GetCgiUrl { my $uri; ($uri) = split(/\?/, $ENV{'REQUEST_URI'}); my $CGI_URL = "http://" . $ENV{'HTTP_HOST'} . $uri; return $CGI_URL; } sub User_Agent { my($user_agent, $remote_host) = @_; if($user_agent =~ /DoCoMo/i) { $platform = 'DoCoMo'; @agetPart = split(/\//, $user_agent); $browser = 'DoCoMo'; $browser_v = $agetPart[1]; $platform_v = $agetPart[2]; if($platform_v eq '') { $platform_v = ''; } } elsif($user_agent =~ /Cuam Ver([0-9\.]+)/i) { $platform = 'Windows'; $platform_v = ''; $browser = 'Cuam'; $browser_v = $1; } elsif($user_agent =~ /^JustView\/([0-9\.]+)/) { $platform = 'Windows'; $platform_v = ''; $browser = 'JustView'; $browser_v = $1; } elsif($user_agent =~ /^sharp pda browser\/([0-9\.]+).*\((.+)\//) { $platform = 'ZAURUS'; $platform_v = $2; $browser = 'sharp_pda_browser'; $browser_v = $1; } elsif($user_agent =~ /^Mozilla\/.+ \(DreamPassport\/([0-9\.])/) { $platform = 'Dreamcast'; $platform_v = ''; $browser = 'DreamPassport'; $browser_v = $1; } elsif($user_agent =~ /^Sonybrowser2 \(.+\/PlayStation2 .+\)/) { $platform = 'PlayStation2'; $platform_v = ''; $browser = 'Sonybrowser2'; $browser_v = ''; } elsif($user_agent =~ /UP\.Browser/i) { $browser = 'UP.Browser'; @agentPart = split(/ /, $user_agent); @agentPart2 = split(/\//, $agentPart[0]); ($browser_v, $platform_v) = split(/\-/, $agentPart2[1]); my(%devid_list) = ( 'TSI1'=>'au,701G', 'KCI1'=>'au,702G', 'KCI2'=>'au,703G', 'MAI1'=>'au,704G', 'MAI2'=>'au,704G', 'SNC1'=>'au,705G', 'SNI1'=>'au,705G', 'HI01'=>'au,C201H', 'DN01'=>'au,C202DE', 'TS11'=>'au,C301T', 'HI11'=>'au,C302H', 'CA11'=>'au,C303CA', 'SY11'=>'au,C304A', 'SY11'=>'au,C304SA', 'SN11'=>'au,C305SN', 'KC11'=>'au,C307K', 'MA11'=>'au,C308P', 'MA12'=>'au,C308P', 'HI12'=>'au,C309H', 'TS12'=>'au,C310T', 'CA12'=>'au,C311CA', 'SY12'=>'au,C401SA', 'DN11'=>'au,C402DE', 'ST11'=>'au,C403ST', 'SN12'=>'au,C404S', 'SY13'=>'au,C405SA', 'SN13'=>'au,C406S', 'SYC1'=>'au,D301SA', 'TSI1'=>'au,D302T', 'TSC1'=>'au,D302T', 'KCC1'=>'au,D303K', 'KCC2'=>'au,D304K', 'MAC1'=>'au,D305P', 'SNC1'=>'au,D306S', 'SNI1'=>'au,D306S', 'D2'=>'DoCoMo,D2', 'P-PAT'=>'DoCoMo,P-PAT', 'KCT1'=>'TU-KA,TK01', 'KCT2'=>'TU-KA,TK02', 'KCT4'=>'TU-KA,TK03', 'KCT5'=>'TU-KA,TK04', 'KCT6'=>'TU-KA,TK05', 'MAT1'=>'TU-KA,TP01', 'SYT1'=>'TU-KA,TS01', 'SYT2'=>'TU-KA,TS02', 'TST1'=>'TU-KA,TT01', 'TST2'=>'TU-KA,TT02', 'TST3'=>'TU-KA,TT03' ); if($devid_list{$platform_v} eq '') { $platform = ''; $platform_v = ''; } else { ($platform, $platform_v) = split(/,/, $devid_list{$platform_v}); } } elsif($user_agent =~ /^J-PHONE\/(.+)\/(.+)/) { $platform = 'J-PHONE'; $browser = 'J-PHONE'; $browser_v = $1; $platform_v = $2; } elsif($user_agent =~ /^ASTEL\/(.+)\/(.+)\/(.+)\//) { $platform = 'ASTEL'; $browser = 'ASTEL'; $browser_v = ''; $platform_v = substr($2, 0, 5); } elsif($user_agent =~ /^Mozilla\/.+ AVE-Front\/(.+) \(.+\;Product=(.+)\;.+\)/) { $browser = 'NetFront'; $browser_v = $1; $platform = $2; $platform_v = ''; } elsif($user_agent =~ /^Mozilla\/.+ Foliage-iBrowser\/([0-9\.]+) \(WinCE\)/) { $platform = 'Windows'; $platform_v = 'CE'; $browser = 'Foliage-iBrowser'; $browser_v = $1; } elsif($user_agent =~ /^Mozilla\/.+\(compatible\; MSPIE ([0-9\.]+)\; Windows CE/) { $platform = 'Windows'; $platform_v = 'CE'; $browser = 'PocketIE'; $browser_v = $1; } elsif($user_agent =~ /^Mozilla\/.+\(compatible\; MSIE .+\)/) { if($user_agent =~ /NetCaptor ([0-9\.]+)/) { $browser = 'NetCaptor'; $browser_v = $1; } elsif($user_agent =~ /Opera ([0-9\.]+)/) { $browser = 'Opera'; $browser_v = $1; } else { $browser = 'InternetExplorer'; $user_agent2 = $user_agent; $user_agent2 =~ s/ //g; @buff = split(/\;/, $user_agent2); @version_buff = grep(/MSIE/i, @buff); $browser_v = $version_buff[0]; $browser_v =~ s/MSIE//g; if($browser_v =~ /^([0-9]+)\.([0-9]+)/) { $browser_v = "$1\.$2"; } } if($user_agent =~ /Windows 3\.1/i) { $platform = 'Windows'; $platform_v = '3.1'; } elsif($user_agent =~ /Win32/i) { $platform = 'Windows'; $platform_v = '32'; } elsif($user_agent =~ /Windows 95/i) { $platform = 'Windows'; $platform_v = '95'; } elsif($user_agent =~ /Windows 98/i) { $platform = 'Windows'; if($user_agent =~ /Win 9x 4\.90/) { $platform_v = 'Me'; } else { $platform_v = '98'; } } elsif($user_agent =~ /Windows NT 5\.0/i) { $platform = 'Windows'; $platform_v = '2000'; } elsif($user_agent =~ /Windows NT/i && $user_agent !~ /Windows NT 5\.0/i) { $platform = 'Windows'; $platform_v = 'NT'; } elsif($user_agent =~ /Windows CE/i) { $platform = 'Windows'; $platform_v = 'CE'; } elsif($user_agent =~ /Mac/i) { $platform = 'MacOS'; if($user_agent =~ /Mac_68000/i) { $platform_v = '68K'; } elsif($user_agent =~ /Mac_PowerPC/i) { $platform_v = 'PowerPC'; } } elsif($user_agent =~ /WebTV/i) { $platform = 'WebTV'; @buff2 = split(/ /, $user_agent); @buff3 = split(/\//, $buff2[1]); $platform_v = $buff3[1]; } else { $platform = ''; $platform_v = ''; } } elsif($user_agent =~ /^Mozilla\/([0-9\.]+).*\(.+\; [NIU]/) { $browser = 'NetscapeNavigator'; $browser_v = $1; if($user_agent =~ /Netscape6\/([0-9\.]+)/) { $browser_v = $1; } if($user_agent =~ /Win95/) { $platform = 'Windows'; $platform_v = '95'; } elsif($user_agent =~ /Win 9x 4\.90/i) { $platform = 'Windows'; $platform_v = 'Me'; } elsif($user_agent =~ /Win98/i) { $platform = 'Windows'; $platform_v = '98'; } elsif($user_agent =~ /WinNT/i) { $platform = 'Windows'; $platform_v = 'NT'; } elsif($user_agent =~ /Windows NT 5\.0/i) { $platform = 'Windows'; $platform_v = '2000'; } elsif($user_agent =~ /Macintosh/i) { $platform = 'MacOS'; if($user_agent =~ /68K/i) { $platform_v = '68K'; } elsif($user_agent =~ /PPC/i) { $platform_v = 'PowerPC'; } } elsif($user_agent =~ /SunOS/i) { $platform = 'SunOS'; @buff2 = split(/\;/, $user_agent); @buff3 = split(/ /, $buff2[2]); $platform_v = $buff3[2]; } elsif($user_agent =~ /Linux/i) { $platform = 'Linux'; @buff2 = split(/ /, $user_agent); $flag = 0; for $key (@buff2) { if($flag) { $platform_v = $key; last; } $flag = 1 if($key =~ /^Linux$/i); } } elsif($user_agent =~ /FreeBSD/i) { $platform = 'FreeBSD'; @buff2 = split(/ /, $user_agent); $flag = 0; for $key (@buff2) { if($flag) { $platform_v = $key; last; } $flag = 1 if($key =~ /^FreeBSD$/i); } } elsif($user_agent =~ /NetBSD/i) { $platform = 'NetBSD'; $platform_v = ''; } elsif($user_agent =~ /AIX/i) { $platform = 'AIX'; $platform_v = ''; } elsif($user_agent =~ /IRIX/i) { $platform = 'IRIX'; @buff2 = split(/ /, $user_agent); $flag = 0; for $key (@buff2) { if($flag) { $platform_v = $key; last; } $flag = 1 if($key =~ /^IRIX$/i); } } elsif($user_agent =~ /HP-UX/i) { $platform = 'HP-UX'; $platform_v = ''; } elsif($user_agent =~ /OSF1/i) { $platform = 'OSF1'; @buff2 = split(/ /, $user_agent); $flag = 0; for $key (@buff2) { if($flag) { $platform_v = $key; last; } $flag = 1 if($key =~ /^OSF1$/i); } } else { $platform = ''; $platform_v = ''; } } else { $platform = ''; $platform_v = ''; $browser = ''; $browser_v = ''; } return ($platform, $platform_v, $browser, $browser_v); }