今天看優酷正巧看到優酷牛人--我是傳奇的網絡投票,由於自己公司也經常做投票,
所以很好奇這些牛逼的大公司是怎么做網絡投票的,特此分析一下優酷是怎么做網絡投票。
正文:
優酷牛人--我是傳奇的網絡投票頁面:http://c.youku.com/niuren
自己隨便選擇一個選手,會彈出一個播放的浮動層,上面的投票按鈕,點擊投票成功后,
再次投票,為提示你:你已經投過,請一個小時后在投票!-----看起來這個投票很正常,但是這些都是表面現象。
使用firebug我們可以發現,每次投票都會觸發一個http請求,
我們可以把這個http的鏈接:
我的第一感覺這個是使用getjson方式做的投票,我們把這個放在瀏覽器里,刷新幾次發現數據一直是增加的
帶着好奇我打開頁面發現這個選手的票數情況:
我擦,我第一感覺這個怎么跟我平時做的投票很類似啊,趕緊找列表頁的ajax請求文件;
果然發現是:
這是一個很典型的jquery里面的getjson方式返回的數據
(我使用的jquery框架,優酷不是使用jq框架,但是原來類似),我又找了一個這個請求的源碼:
function vTpListGet(pg, pz, t){
pg = (pg || 1);
pz = (pz || 8);
t = (t || false);
cc = function(oList, total){
if(oList.length > 0){
var html = "";
for(var i=0;i < oList.length;i++){
html += "<ul class=\"x\">\n";
html += " <li class=\"x_thumb\"><a href=\"javascript:;\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\" title=\""+oList[i].title+"\"><img src=\""+oList[i].thumburl+"\" alt=\""+oList[i].title+"\" /></a></li>\n";
html += " <li class=\"x_title\"><a href=\"javascript:;\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\" title=\""+oList[i].title+"\">"+oList[i].title+"</a></li>\n";
html += " <li class=\"x_data\">票數:<span class=\"num\">"+oList[i].total+"</span></li>\n";
html += " <li class=\"x_btn\"><span class=\"btn\" onclick=\"vTpSet('"+oList[i].videoid+"','"+oList[i].title+"');\"></span></li>\n";
html += "</ul>\n";
}
html += "<div class=\"clear\"></div>";
//alert(html);
document.getElementById('videosTpList').innerHTML = html;
if(t){
//顯示分頁
max_cnt = pz;
var js_pager = new jsPager();
js_pager.init(total, pz, pg, "vTpPager");
document.getElementById('videosTpPager').style.display = "";
document.getElementById('videosTpPager').innerHTML = js_pager.getHtml();
}
}
};
js_request("http://minisite.youku.com/pub2/i_am_legend/getvote.php?page="+pg+"&callback=cc&count="+pz+"&i=" + Math.random());
}
再來看優酷關於限制頻繁投票的方法:
function vTp(vid){
c = function(num,vid){
alert("投票成功,目前票數為:"+num+"票!");
var exp = new Date ();
exp.setTime(exp.getTime() + 3600000);
setCookie("nrtp", "true", exp);
}
if(getCookie("nrtp") != "true"){
js_request("http://minisite.youku.com/pub2/i_am_legend/vote.php?id="+vid+"&callback=c&i=" + Math.random());
}else{
alert("一小時內只能投票一次!");
return false;
}
}
竟然是在客戶端寫cookies來判斷,不禁有點坑爹了,之前我們做網絡投票經常被刷票
,但是畢竟我們在使用服務端驗證,記錄一下ip來限制,但是優酷這個投票完全是靠客戶端驗證來實現。
總結一下優酷的投票:
- 列表頁的數據是實時顯示的,也就是說投票后立刻顯示----我們當年投票也是實時顯示,但是服務器壓力太大,越到刷票的,數據庫被頻繁的插入讀取,對數據壓力也是蠻大的,經常把數據庫服務器宕機了,后來采用緩存機制也解決這個問題,一分鍾后顯示數據。
- 這個投票的api文件寫的有問題,我把http://minisite.youku.com/pub2/i_am_legend/vote.php?id=XMjc1NzExMzE2&callback=c&i=0.19621988418141467放在瀏覽器,不停的刷新居然可以不停的增加票數,很顯然優酷的程序員偷懶了,起碼也要判斷一些提交頁面的路徑啊,提交方式啊 的什么,判斷我是否來自正常的投票請求,如果這樣的話這個投票也太容易刷票了,直接把這個url放在瀏覽器不同的F5就可以了,實在不行直接寫個js定時刷新頁面也可以。
- 防止刷票機制,決然是使用客戶端cookie做驗證,這個就有點菜鳥了,最普通的方式也是根據ip做驗證(雖然這個方式在專業刷票公司哪里也是小兒科,但是應付非專業人士還是足夠了),防止頻繁刷票。
總結;
有點失望了,本以為大公司的技術都比我們成熟,看來有點高估了吧,看來不要盲目的迷戀和崇拜大公司,做好自己,相信自己的才是關鍵!
- 本文鏈接: 看看優酷是怎么做網絡投票的?
聯系作者: PHP淮北,交流QQ群:群1:153856687,群2:198110186
版權所有: 非特殊聲明均為本站原創文章,轉載請注明出處:PHP10086博客網
訂閱更新: 歡迎通過RSS訂閱我們的內容更新



