So-net無料ブログ作成
検索選択

Python CGI で作るアクセスカウンタ~LOGファイル版~ [プログラム三昧]このエントリーを含むはてなブックマーク#

Python CGI を利用して、アクセスカウンタを作ります。 第一歩は、LOGファイルを作ることから。

動機

このアクセスカウンタを作る動機になったのは、某BLOG某記事にあった一言「一体どこからいらっしゃってるのかが気になります。」です。 BLOGパーツにもアクセスカウンタがあります。 また、BLOGのアクセス解析という機能もあります。 しかし、もっと詳しく分析する必要が出てきたときには、何らかの仕掛けを入れてアクセス記録をデータベース化したいと思うはずです。

条件は、「BLOGのドメインの外にアクセスカウンタを置く必要がある。」です。 これは、BLOGそのものに手を付けるわけにはいかないし、自前でBLOGを立ち上げる気も無いからです。

JavaScript : visitor_world8.js

まず、HTML文書からJavaScriptを呼び出します。 呼び出すスクリプトがこれです。

//
//   Access counter in a log file
//
// $Id: visitor_world8.js,v 1.3 2009/06/16 20:11:37 noritan Exp $

//
//   Construct a javascript statement
//   to invoke a CGI with parameters as text/javascript.
//
document.writeln('<script type="text/javascript" charset="utf-8"'
+ ' src="http://noritan.org/cgi/visitor_world8.cgi'
+ '?URL=' + escape(document.URL)
+ "&HTTP_REFERER=" + escape(document.referrer)
+ '"></script>');

//

このスクリプトでは、HTML文書のURL (document.URL) とその参照元 (document.referrer) をパラメータとして付けて "visitor_world8.cgi" というCGIを呼び出すタグを作ります。 たとえば、こんなタグが生成されます。

<script type="text/javascript" charset="utf-8" src="http://noritan.org/cgi/visitor_world8.cgi?URL=http://noritan.org/&HTTP_REFERER=http://noritan-micon.blog.so-net.ne.jp/"></script>

これら二つのパラメータは、CGIを呼び出すと書き換えられて失われてしまいます。 そのため、JavaScriptで拾い上げておく必要があったのです。

スクリプトが出した出力に従って、スクリプトが動くという仕組みは、非常に奇妙ですが、できるみたいです。 無限連鎖しないように気をつける必要があると思います。

他にもCGIを呼び出すタグはあります。 画像を呼び出す"IMG"タグもその一つです。 "IMG"の使用も考えましたが、CGIから正しい画像ファイルを返すプログラムを作るのが面倒だったため、テキストを返すだけで済む"SCRIPT"を使用しています。

CGI : visitor_world8.cgi

"JavaScript"から呼び出された"CGI"は、以下の"JavaScript"記述を返します。

document.writeln('<div>OK</div>')

もちろん、これは表面上の話で、裏では、アクセス記録を残すプログラムが動いています。

#!/usr/local/bin/python
#
#   Access counter in a log file
#
# $Id: visitor_world8.cgi,v 1.1 2009/06/16 20:06:41 noritan Exp $

import os
import sys
import cgi
import urllib
import time
import cgitb

# Show error as a page description.
sys.stderr = sys.stdout
cgitb.enable()

# Get a POST data.
form = cgi.FieldStorage()

# Construct a parameter table
#   All from the parameters
#   Some from the environment variables
data = {}
for name in form:
    data[name] = str(form.getvalue(name))
for name in ('REMOTE_ADDR', 'REMOTE_HOST'):
    data[name] = str(os.environ[name])

# Show HTTP response
print """Content-type: text/javascript; charset="utf-8"

document.writeln('<div>OK</div>')
"""

# Record in a log file
f = open("XXXXXXXXXX.txt", "a+")

try:
    now = time.time()
    asctime = time.strftime(
        "%Y-%m-%d (%A) %H:%M:%S",
        time.localtime(now)
    )
    f.write("%s\n" % asctime)
    for name in data:
        f.write('%s : %s\n' % (name, data[name]))
    f.write("\n")
finally:
    # Abort if failed.
    f.close()

#

このバージョンでは、アクセス記録をログファイルに残していきます。 ただし、ログファイル名は、諸般の事情により伏字になっています。

ログファイルに記録する内容は、時刻、文書URL、参照元URL、クライアントのIPアドレス、クライアントのホスト名です。 ログファイルには、こんな感じの記述が並びます。

2009-06-17 (Wednesday) 05:58:36
URL : http://noritan-micon.blog.so-net.ne.jp/
REMOTE_HOST : xxxxxxxxxx.xxxxxxxxxx.net
HTTP_REFERER : http://noritan.org/
REMOTE_ADDR : xxx.xxx.xxx.xxx

クライアントに関する情報は、伏字としました。

運用してみたら

このアクセスカウンタを設置するには、BLOGに以下のタグを埋め込みます。 現在は、右側のカラムの"POWERED BY"の下に埋め込んでいます。 地味に表示されている"OK"がこのスクリプトを実行した結果です。

<script type='text/javascript' charset='utf-8' src='http://noritan.org/cgi/visitor_world8.js'></script>

ほぼ、丸一日、当BLOGにこのスクリプトを仕掛けておいたところ、LOGファイルは200Kバイトを超えました。 このままでは、巨大なファイルが出来上がってしまうので、早いとこ情報をデータベースに放り込むプログラムを作らなくては。

参考文献

JavaScript – The Definitive Guide 5e

JavaScript – The Definitive Guide 5e

  • 作者: D Flanagan
  • 出版社/メーカー: Pragma
  • 発売日: 2006/08/25
  • メディア: ペーパーバック
Learning Python 3e (Learning)

Learning Python 3e (Learning)

  • 作者: M Lutz
  • 出版社/メーカー: Pragma
  • 発売日: 2007/11/06
  • メディア: ペーパーバック

nice!(0)  コメント(0)  トラックバック(1)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。