#! /usr/local/bin/ruby # # $Id: googletoday,v 1.2 2003/02/09 09:16:19 tamada Exp $ # =begin 作成者: たまだ(tamada@oikaze.com) なにこれ: apache のアクセスログを解析し、どんな検索文字列で Google からやってきた人がいるのかを解析するフィルタです。 「今日ぐる」として http://oikaze.com/~tamada/Diary/ に載せるためのスクリプトです。 アイデアは http://www.higuchi.ecei.tohoku.ac.jp/~miyabi/diary/ より頂きました。 ライセンス: 無償・無保証・著作権放棄 http://nais.to/~yto/doc/zb/0002.html より。 最新バージョン: http://oikaze.com/~tamada/Products/junk/#google (簡単な説明) http://oikaze.com/~tamada/Products/junk/googletoday (プログラム本体) 必須ライブラリ: getoptlong, kconv, date, cgi, uconv uconv 以外はデフォルトで入っていると思う。 uconv は http://raa.ruby-lang.org/list.rhtml?name=Uconv にて取得・インストールしてください。 問題点: (fix)・UTF-8 でエンコードされていた場合、文字化けが起こります。 ・apache のログで combine を選択していることを前提としています。 ・やっつけで書かれたプログラムです。 ・作者が実装言語である ruby を知りません。 =end require 'getoptlong' require 'kconv' require 'date' require 'cgi' require 'uconv' MONTH = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]; def print_usage print "\ Usage: googletoday [OPTION] [access_log_file] -d, --date=DATE 日付を指定。フォーマットは day/month/year という形式。 -h, --help このメッセージを表示 " end def parse_options options = Hash.new parser = GetoptLong.new parser.set_options(['--date', '-d', GetoptLong::REQUIRED_ARGUMENT], ['--help', '-h', GetoptLong::NO_ARGUMENT]); parser.each_option { |name, arg| options[name.sub(/^--/, '')] = arg; } if options['help'] print_usage exit 0 end return options; end def getQuery(referer) url, params = referer.split("?") if params == nil return referer end list = params.split("&") list.each{|param| key, value = param.split("=") if key == "q" or key == "as_q" value = CGI::unescape(value); begin if referer =~ /(?:ie|oe)=utf-?8/i value = Uconv.u8toeuc(value) else value = Kconv.toeuc(value); end rescue => e e.backtrace end return value end } return referer end def getResults(regexp) results = Array.new while line = gets() if regexp.match(line) if line =~ /www.google/ and not line =~ /(gif|jpg|png|css)/ and not line =~ /Googlebot/ host, aa = line.split(" ") time = line.scan(/\[.*\]/) (request, referer, useragent) = line.scan(/\".*?\"/) query = getQuery(referer) query = data = format("%s: %s[%s]\n", query, request.split(" ")[1], useragent) results.push(data) end end end return results end def main options = parse_options date = Date::today if options['date'] then d, month, year = options['date'].split("/") month = MONTH.index(month) if MONTH.include?(month) pattern = format("%02d/%s/%d", d.to_i, MONTH[month.to_i], year.to_i) else pattern = format("%02d/%s/%d", date.day, MONTH[date.month - 1], date.year); end regexp = Regexp.new(pattern, nil) results = getResults(regexp) print results end main