Vì vậy, tôi đã chơi xung quanh với điều này một chút dựa trên các nhận xét tại đây. Những gì tôi nghĩ ra là đếm số lượt truy cập trong một lĩnh vực đơn giản. Trong ứng dụng của tôi, tôi có các thực thể đoạn mã với thuộc tính Chế độ xem.
Khi một đoạn được xem là một phương pháp lọc ra (danh sách trắng) chỉ là những gì hy vọng sẽ được các trình duyệt:
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);
}
Các thủ tục lưu trữ sau đó sử dụng một bảng riêng biệt để tạm thời giữ quan điểm mới nhất mà lưu trữ các đoạn Id , đã nhập ngày và địa chỉ ip. Mỗi chế độ xem được ghi lại và khi một chế độ xem mới xuất hiện, nó được kiểm tra để xem liệu cùng một địa chỉ IP đã truy cập đoạn mã này trong vòng 2 phút vừa qua chưa. nếu không có gì được ghi lại.
Nếu đó là chế độ xem mới, chế độ xem được ghi lại (một lần nữa SnippetId, IP, Đã nhập) và trường Chế độ xem thực tế được cập nhật trên bảng Đoạn trích.
Nếu đó không phải là chế độ xem mới, bảng sẽ được dọn sạch với bất kỳ chế độ xem nào đã đăng nhập cũ hơn 4 phút. Điều này sẽ dẫn đến số lượng mục nhập tối thiểu trong bảng Nhật ký xem bất kỳ lúc nào.
Đây là proc lưu trữ:
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
Điều này dường như làm việc khá tốt. Khi những người khác đề cập đến điều này không hoàn hảo nhưng có vẻ như nó đủ tốt trong thử nghiệm ban đầu.
Bạn đang đặt một câu hỏi rất khó. Chỉ cần suy nghĩ về cách Google xử lý vấn đề mfraud nhấp chuột và bạn sẽ nhận được ý tưởng về mức độ lớn có thể là vấn đề của câu hỏi của bạn. – backslash17
Tôi đồng ý .. không phải là một vấn đề dễ dàng .. mặc dù tôi đã luôn luôn tự hỏi tại sao máy chủ web không cung cấp các giải pháp phân tích tốt. Tôi nói tát Google Analytics vào nó và gọi nó là xong .. trừ khi bạn đang cố gắng để tái tạo lại các bánh xe bị thừa nhận bị hỏng. – madcolor
Đã hiểu, nhưng đó là lý do tại sao tôi hỏi ở đây: -}. Tôi không thực sự sau khi phân tích ở đây, nhưng một truy cập tương tự như ở đây trên SO để hiển thị số lượt xem ít nhất là bán đáng tin cậy. –