2009-07-29 9 views
7

Webページカウンタを実装するには、どのような方法が良いですか?信頼できるウェブページカウンタを実装する方法

これは単純な問題ですが、検索エンジンのクローラやロボットを扱うときや、同じユーザーが複数回クリックしたり、クリックを更新したりするときに問題になります。

具体的には、リンクをクリックするだけでユーザーが「クリックした」ことを確実にする良い方法は何ですか? IPアドレス?クッキー?これらの両方にはいくつかの欠点があります(IPアドレスは必ずしも一意ではなく、クッキーはオフにすることができます)。

また、データを保存する最も良い方法は何ですか?カウンタを個別にインクリメントするか、または各クリックをレコードとしてログテーブルに格納し、時折まとめます。

どれでもライブの経験が参考になる、

+++リック---

+1

あなたは非常に難しい質問をしています。クリックミスの問題をGoogleがどのように扱うのか考えてみると、あなたの質問のアスワルの大きさについての考えが得られます。 – backslash17

+0

私は同意します。簡単な問題ではありません。なぜWebサーバーが優れた分析ソリューションを提供していないのか疑問に思っています。私はそれについてGoogleアナリティクスを叩いて、それを完了と呼んでいると言っている。確かに壊れた車輪を再発明しようとしていない限り。 – madcolor

+0

わかりましたが、私はここでそれを求めています: - }。私は実際にここでの分析を行っているわけではありませんが、少なくとも半分の信頼性の高いビューの数を表示するためにここに似ているカウンターです。 –

答えて

2

だから私はここのコメントに基づいて少しこれを使って遊んだ。私が思いついたのは、簡単なフィールドでカウンターを数えることです。私のアプリケーションでは、Viewsプロパティを持つコードスニペットエンティティがあります。

public bool LogSnippetView(string snippetId, string ipAddress, string userAgent) 
{ 
    if (string.IsNullOrEmpty(userAgent)) 
     return false; 

    userAgent = userAgent.ToLower(); 

    if (!(userAgent.Contains("mozilla") || !userAgent.StartsWith("safari") || 
     !userAgent.StartsWith("blackberry") || !userAgent.StartsWith("t-mobile") || 
     !userAgent.StartsWith("htc") || !userAgent.StartsWith("opera"))) 
     return false; 

    this.Context.LogSnippetClick(snippetId, IpAddress); 
} 

ストアドプロシージャが、その後一時的にスニペットIDを保存、最新のビューを保持するために別のテーブルを使用しています。うまくいけば、ブラウザでなければなりませんだけで何

スニペットが表示されている場合の方法は除外さ(ホワイトリスト) 、入力された日付とIPアドレス。各ビューがログに記録され、新しいビューが到着すると、直近2分以内に同じIPアドレスがこのスニペットにアクセスしたかどうかが確認されます。もしそうなら、何も記録されません。

新しいビューの場合は、ビューが記録され(SnippetId、IP、入力済み)、実際のビューフィールドがスニペットテーブルで更新されます。

新しいビューでない場合は、4分を超えて記録されたビューでテーブルがクリーンアップされます。これにより、いつでもViewログテーブルにエントリ数が少なくなります。

ここでストアドプロシージャです:

ALTER PROCEDURE [dbo].[LogSnippetClick] 
    -- Add the parameters for the stored procedure here 
    @SnippetId AS VARCHAR(MAX), 
    @IpAddress AS VARCHAR(MAX)   
    AS 
    BEGIN 

    SET NOCOUNT ON; 

    -- check if don't allow updating if this ip address has already 
    -- clicked on this snippet in the last 2 minutes 
    select Id from SnippetClicks 
     WHERE snippetId = @SnippetId AND ipaddress = @IpAddress AND 
       DATEDIFF(minute, Entered, GETDATE()) < 2  

    IF @@ROWCOUNT = 0 
    BEGIN    
     INSERT INTO SnippetClicks 
      (SnippetId,IpAddress,Entered) VALUES 
      (@SnippetId,@IpAddress,GETDATE())   
     UPDATE CodeSnippets SET VIEWS = VIEWS + 1 
      WHERE id = @SnippetId 
    END 
    ELSE 
    BEGIN 
     -- clean up 
     DELETE FROM SnippetClicks WHERE DATEDIFF(minute,Entered,GETDATE()) > 4 
    END 
END 

は、これはかなりうまく動作するようです。他の人が言ったように、これは完璧ではありませんが、最初のテストでは十分だと思われます。

0

あなたがPHPを使用して取得する場合は、特定のユーザーからの活動を追跡するためにセッションを使用することができます。データベースと連動して、特定のIPアドレスからの活動を追跡することができます。これは、同じユーザーであると想定される可能性があります。

ヒット数を制限する(たとえば、5秒間に1ヒットを超えないようにする)タイムスタンプを使用して、サイトへの新しい「訪問数」が発生したときを知らせる(例えば、最後のヒットが10分以上前だった場合) 。

ボットや訪問者の傾向(ブラウザの使用状況など)を検出するのに役立つ$ _SERVER []プロパティがあります。

編集: 私はヒットとしてページビューをヒットとしてカウントし、新しいセッションが作成されたときに+1を訪問したことがあります。&ヒットをトラッキングしました。それはかなり信頼性がありました(私が使用した目的のために十分に信頼できる以上でした)。クッキーをサポートしていない(したがってセッションをサポートしていない)ブラウザと、セッションを無効にするユーザーは今日はまれですので、過度に正確な理由がない限り

+0

IPアドレスは長期的に信頼性がありません – Cameron

+0

ASP.NET(MVC)を使用していますが、セッションはオプションですが、ロボットからのクッキーレスアクセスには役立ちません。プラスのセッションでは、このアプリが必要としないオーバヘッドが少しあります。 –

4

セッションと組み合わせてIPアドレスを使用するIPアドレスの新しいセッションごとにカウンターを1つカウントします。あなたが思うなら、このデータをログデータベースに保存できますあなたはそれを調べる必要があります。これは、あなたのサイトがトラフィックを最も多く得たとき、1日あたりのトラフィック量、IPなどを計算するのに便利です。

0

私はあなただったら、あなたが言ったように、すべてのソリューション(例えば、クッキー、IPアドレスなど)は、信頼性が低い傾向にある。だから、私はあなたの最善の策はあなたのシステムで冗長性を使用することだと思います:クッキー、 "フラッシュクッキー"(共有オブジェクト)、IPアドレス(おそらくユーザーエージェントと組み合わせて)、およびログインしているユーザーのユーザーIDを使用してください。

未知のクライアントには一意のIDが与えられ、クライアントのマシンに格納されて(必要に応じて)取得され、要求ごとに再送信されるようなスキームを実装できます。次に、IPアドレス、ユーザーエージェント、ユーザーID(およびあなたが考えることができる他のもの)をすべての一意のIDに、またはその逆に結びつけることができます。すべてのクリックのタイムスタンプとユニークIDはどこかのデータベーステーブルに記録され、各クリック(少なくともあなたのウェブサイトへのクリック)は、同じユニークIDの最後のクリックの最近の経過に応じて通過または拒否される可能性があります。これはおそらく短期間のクリックバーストには十分信頼できるものであり、長期的にはそれほど重要ではないでしょう(ページカウントではなくクリックアップの問題)。

フレンドリーロボットは適切に設定されている必要があり、実際の人から正しく識別され、個別に処理されるように、既知のロボットユーザーエージェントのリスト(私は単純なGoogle検索の後にhereを見つけました)

+0

ありがとうキャメロン。これは私がここにいるところです。質問のポイントは、より良いアプローチがあるかどうかを確認することでした。 –

関連する問題