閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);) 閲覧数の履歴が残る実用的な「アクセスカウンタ(履歴付き)」を作ってみた。 09/09/23 【背景】アクセスカウンタを利用してみて、現在までの総アクセス数はわかるものの どの様な流れでアクセス数が伸びて来たのか?以前は頻繁に閲覧されていたが、 現在の閲覧数は減っているのか?別サイトでこのページを紹介されたきっかけで 閲覧数が急増した記録を残しておきたい。とのニーズが出てきました。 これらのニーズに対応した、「履歴付き」アクセスカウンタを作成しました。 【特徴】Cookie機能を利用し、6時間内の再訪問の場合は、カウンタがカウント アップしない様に工夫してみた。 また、ページの閲覧頻度がどの様に推移しているかが見られる様に10カウント毎の 日時が記録される様に工夫してみた。 また、どのページでもこのアクセスカウンタが利用できる様に「Webユーザコント ロール(*.ascx)」で部品化した。 ・カウント記録ファイルとして「ファイル名+HistoryCounter.txt」ファイルが自動作成されます。 開発環境:VWD2005+AJAX1.0+Toolkit + SQL Server2005 サーバ:ASP.NET2.0+AJAX1.0 + SQL Server2005 【稼動サンプル】 http://www.kuri6005.fscs.jp/4AspNet10/Counter/ascxCounterTest.aspx #ref(HistoryCounter.JPG); 【HistoryCounter.ascx】アクセスカウンタ(履歴付き)部品 <%@ Control Language="VB" ClassName="HistoryCounter" %> <%@ Import Namespace = "Microsoft.VisualBasic.FileIO" %> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim HOLDTIME As Integer = 360 'Cookie保持時間(分) Dim INTERVAL As Integer = 10 'カウント履歴を保存する間隔 Dim stDT(100, 1) As String 'カウンタ情報配列変数 Dim arrayNum, i As Integer '配列行数取得変数 If Not Page.IsPostBack Then 'ポストバック表示でない場合 'カウンタ情報保存ファイルの定義:プログラムファイル名+HistoryCounter.csv Dim sr As String = Server.MapPath(System.IO.Path.GetFileNameWithoutExtension(Request.ServerVariables("URL")) & "HistoryCounter.csv") If System.IO.File.Exists(sr) Then '*HistoryCounter.csvファイルが既に存在する場合 'counter情報の読込み Dim parser As New TextFieldParser(sr) parser.TextFieldType = FieldType.Delimited '固定長データではなく可変長データを宣言 parser.SetDelimiters(",") ' 区切り文字はコンマ arrayNum = 0 While Not parser.EndOfData Dim row As String() = parser.ReadFields() '1行読み込み ' 配列rowの要素は読み込んだ行の各フィールドの値 stDT(arrayNum, 0) = row(0) stDT(arrayNum, 1) = row(1) arrayNum += 1 End While 'Cookieハンドルの定義 Dim cok As HttpCookie = Request.Cookies(System.IO.Path.GetFileNameWithoutExtension(Request.ServerVariables("URL")) & "CokCheck") If Not (cok Is Nothing) Then 'Cookie情報があった場合 'Counter情報の表示 Literal1.Text = "閲覧数: " & stDT(0, 0) & "<br>" & "<br>" For i = (arrayNum - 1) To 1 Step -1 Literal1.Text &= stDT(i, 0).ToString & ": " & stDT(i, 1).ToString & "<br>" Next 'Cookie情報の更新 cok.Values("cokcount") = stDT(0, 0) cok.Expires = DateTime.Now.AddMinutes(HOLDTIME) Response.Cookies.Add(cok) Else 'Cookie情報がなかった場合 'インスタンスをセット 'Cookieの新規作成 cok = New HttpCookie(System.IO.Path.GetFileNameWithoutExtension(Request.ServerVariables("URL")) & "CokCheck") 'カウンタをカウントアップする stDT(0, 0) += 1 stDT(0, 1) = Now() 'キリ番情報の追加 If (stDT(0, 0) Mod INTERVAL) = 0 Then stDT(arrayNum, 0) = stDT(0, 0) stDT(arrayNum, 1) = Now() arrayNum += 1 End If 'Counter情報の表示 Literal1.Text = "閲覧数: " & stDT(0, 0) & "<br>" & "<br>" For i = (arrayNum - 1) To 1 Step -1 Literal1.Text &= stDT(i, 0).ToString & ": " & stDT(i, 1).ToString & "<br>" Next 'Counter情報の更新書出し '入力するテキスト Dim strInputText As String = stDT(0, 0) & ", " & stDT(0, 1) & vbCrLf For i = 1 To arrayNum - 1 strInputText &= stDT(i, 0) & ", " & stDT(i, 1) & vbCrLf Next 'ファイルに書出し System.IO.File.WriteAllText(sr, strInputText) 'Cookie情報の更新 cok.Values("cokcount") = stDT(0, 0) cok.Expires = DateTime.Now.AddMinutes(HOLDTIME) Response.Cookies.Add(cok) End If Else '*HistoryConuter.csvファイルが存在しない場合 'Cookieハンドルの定義 Dim cok As HttpCookie = Request.Cookies(System.IO.Path.GetFileNameWithoutExtension(Request.ServerVariables("URL")) & "CokCheck") 'インスタンスをセット cok = New HttpCookie(System.IO.Path.GetFileNameWithoutExtension(Request.ServerVariables("URL")) & "CokCheck") 'カウンタ情報をセット stDT(0, 0) = 1 stDT(0, 1) = Now() 'Counter情報の表示 Literal1.Text = "閲覧数: " & stDT(0, 0) & "<br>" 'Counter情報の更新書出し Dim strInputText As String = stDT(0, 0) & ", " & stDT(0, 1) & vbCrLf 'ファイルに書出し System.IO.File.WriteAllText(sr, strInputText) 'Cookie情報の更新 cok.Values("cokcount") = stDT(0, 0) cok.Expires = DateTime.Now.AddMinutes(HOLDTIME) Response.Cookies.Add(cok) End If End If End Sub </script> <asp:Literal ID="Literal1" runat="server"></asp:Literal> 【ascxCounterTest.aspx】稼動確認フォーム <%@ Page Language="VB" %> <%@ Register Src="HistoryCounter.ascx" TagName="HistoryCounter" TagPrefix="uc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Label1.Text = "こんにちは、" & TextBox1.Text & " さん!" End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> アクセスカウンタ(履歴付き)09/09/22<br /> (Webユーザコントロール(*.ascx)仕様) <br /> <br /> 【ダミー機能】あいさつを返してくれる<br /> お名前:<asp:TextBox ID="TextBox1" runat="server" Width="152px"></asp:TextBox> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="送信" /><br /> <asp:Label ID="Label1" runat="server"></asp:Label><br /> <br /> <uc1:HistoryCounter ID="HistoryCounter1" runat="server" /> </div> </form> </body> </html> 【参考にしたページ】 1.アクセスカウンタを作ろう http://ufcpp.net/study/aspx/counter.html 2.自分自身のファイル名を取得する法 http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-37253.htm 3.CSVファイルを読み込むには? 6/08/16 http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html 4.[[アクセスカウンタ]] 09/08/13 【サーバ設置時のハマリポイント】 このアクセスカウンタ部品CounterControl.ascxをサーバに設置し、利用しようと したところエラーが発生し、最初はうまく動いてくれなかった。原因は、対象フォル ダに「書き込み権限」の許可がされていなかった為、*Counter.txtファイルが書き込 めなかったからだった。 皆さん、サーバ対象フォルダの「書き込み権限」の許可設定を忘れないようにしま しょう。 09/08/13 (設定操作) サーバにloginし、「ファイルのフォルダの管理(ファイルマネジャ)」で 対象プログラムを設置したフォルダのWeb Visitorの「書き込み」にチェックを付け、 「Apply」ボタンをクリックし、情報更新を行う。 #ref(textRW02.JPG); #comment_nospam #vote(参考になった[0],ふつう[0],参考にならなかった[0])