2013-09-23 81 views
2

我正在爲我正在使用的網站實施一項類似功能。用戶不必登錄,他們可以喜歡或不喜歡特定頁面。最後,我希望能夠填充最喜歡的文章或故事列表。防止用戶多次點擊「like」的最佳方式

我有一個非常簡單的方法,目前使用onclick javascript函數來通過ajax和php函數更新數據庫。 這工作正常。我想要做的是防止用戶濫發按鈕。
起初我想也許會得到IP地址,將它存儲在數據庫中,然後運行檢查。有沒有更好的辦法?

+3

而無需用戶登錄有這樣做的沒有100%萬無一失的方式。在您的數據庫中記錄IP地址將會阻止子網上的多個人喜歡您的內容。 – MonkeyZeus

+0

沒有登錄?我會建議一個cookie,但所有的方法都會有問題。 – mccainz

+0

Cookie可能有助於完成此任務。當用戶點擊'like'一次時存儲cookie。在處理'like'點擊時檢查這個cookie。 – 2013-09-23 17:29:30

回答

1

使用cookies。比方說你有一個按鈕,用戶可以在喜歡的文章123456789

<button id="like" articleID="123456789">Like</button> 

腳本:

function setLike(articleID) { 
    document.cookie=articleID+'=y'; 
} 

function hasLiked(articleID) { 
    var cookies=document.cookie.split(';'); 
    for (var i=0;i<cookies.length;i++) { 
     var cookie=cookies[i].split('='); 
     if (cookie[0]==articleID) return true; 
    } 
    return false; 
} 

var button=document.getElementById('like'); 

button.onclick=function() { 
    var articleID=this.getAttribute('articleID'); 
    if (!hasLiked(articleID)) { 
     //register the like in your system 
     //... 
     // 
     setLike(articleID); 
    } else { 
     alert('You cant like or dislike an article twice'); 
    } 
} 

當然,用戶可以刪除他或她的所有Cookie - 但用戶也可以像在同一頁面/來自100臺不同電腦的文章。上述情況可以防止最常見的情況:人們在很短的時間內在同一臺計算機上反覆點擊喜歡或不喜歡很多次。

+0

謝謝,我真的很想知道更多的酷,更多,他們仍然令人畏懼:( – null

+0

一點也不,但是你看到的所有腳本使它變得如此困難和困難,矯枉過正,它只是一個可以拆分的字符串解析 – davidkonrad

+0

我試圖用ajax調用我已經存在的地方,你可以說我可能會出錯的地方嗎? – null

1

第一次點擊按鈕後,只隱藏按鈕。

它甚至更有意義,使用AJAX處理程序發送點擊時...

4

直截了當的答案,你將不能夠做到這一點。

如果我真的想垃圾郵件你的「喜歡」按鈕,我會找到一種方法來做到這一點,特別是如果你不強迫我登錄(我曾經寫過相當不錯的機器人,並且是非常有效的垃圾郵件大鏈接提交網站)。

JavaScript只會阻止平庸的垃圾郵件發送者或襪子傀儡帳戶持有者。作爲一名垃圾郵件發送者,我可以通過編程一個基於時間的機器人來喜歡你的帖子,或通過直接向你的服務器發送請求(我甚至不會加載你的站點)來繞過你的Javascript。

你需要做的,如果你真的想阻止垃圾郵件發送者發送垃圾郵件有效這項功能什麼(效率是關鍵字在這裏,因爲垃圾郵件發送者仍可以垃圾郵件的功能,但他們喜歡將不計)是記錄每個知識產權喜歡一個帖子及其地理信息(它並不總是100%準確,但這是一個好的開始),然後在後臺運行一個流程,檢查可疑來源並懲罰這些喜歡(通過分配較少的價值,或者只需從總數中減去它們)。

例如,如果你的主要受衆是居住在美國的人,但是一個帖子得到來自墨西哥,薩爾瓦多,印度,澳大利亞和俄羅斯的一羣喜歡,那麼它很可能是代理商後面的垃圾郵件發送者或一個類似於TOR的網絡,他/她可以根據自己的意願更改他/她的IP地址。

經過幾十萬條記錄之後,您將擁有一個很好的基礎來開始列入黑名單IP地址。我通常使用R編程語言來獲取有關我的數據庫的統計信息。

但是再一次,好的垃圾郵件發送者可以使用來自受衆國家或地理位置的受感染計算機的IP地址列表,並使用這些IP來濫用該功能。這些機器人很難發現,但你可以分析以前的帖子,並提出有用的指標作爲「喜歡/評論比率」。

如果一篇文章有​​大量的喜歡,但評論數量很少,那麼很可能有人發佈了它,但是我可以再次編程我的機器人喜歡並發表評論,因此數字看起來很自然。

我不確定你在做什麼樣的項目,但是如果它類似於鏈接提交,請不要​​根據喜歡的數量排名(無論用戶喜歡什麼)。

喜歡的數量應該只是一個因素,你可以看看HackerNews或Reddit如何排列帖子(這些項目是開源的),但它是多種因素的結合。

+0

這是一個相當全面的答案。如果該網站達到這種地位,我會對自己印象深刻:) – null

2

從技術上講,沒有防爆方法可以這麼做。通過允許每ip-useragent組合投一票你可以變得非常接近。你必須在服務器端實現這一點。

PHP實例

$concienceKey = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['USER_AGENT']); 

$query = "SELECT COUNT(*) FROM clickConcience WHERE key = `" . $concienceKey . "`"; 

//run your query 
//.....and get the $count; 
// 

//already voted! 
if($count > 0){ 
     echo 'already voted'; 
     return false; 
} 

//remember entry 
$insert = "INSERT INTO clickConcience (key, datetime) VALUES (`" . $concienceKey . "`, NOW())"; 

//run your query 
//.....and insert 
// 

return true;