看看优酷是怎么做网络投票的?
2012-04-30 21:15 PHP淮北 阅读(8582) 评论(30) 编辑 收藏 举报今天看优酷正巧看到优酷牛人--我是传奇的网络投票,由于自己公司也经常做投票,
所以很好奇这些牛逼的大公司是怎么做网络投票的,特此分析一下优酷是怎么做网络投票。
正文:
优酷牛人--我是传奇的网络投票页面:http://c.youku.com/niuren
自己随便选择一个选手,会弹出一个播放的浮动层,上面的投票按钮,点击投票成功后,
再次投票,为提示你:你已经投过,请一个小时后在投票!-----看起来这个投票很正常,但是这些都是表面现象。
使用firebug我们可以发现,每次投票都会触发一个http请求,
我们可以把这个http的链接:
我的第一感觉这个是使用getjson方式做的投票,我们把这个放在浏览器里,刷新几次发现数据一直是增加的
带着好奇我打开页面发现这个选手的票数情况:
我擦,我第一感觉这个怎么跟我平时做的投票很类似啊,赶紧找列表页的ajax请求文件;
果然发现是:
这是一个很典型的jquery里面的getjson方式返回的数据
(我使用的jquery框架,优酷不是使用jq框架,但是原来类似),我又找了一个这个请求的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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()); } |
再来看优酷关于限制频繁投票的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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订阅我们的内容更新
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名:PHP10086博客网(PHP淮北):http://www.php10086.com,也可以邮件与我联系。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验