好的,
所以我构建了一个与服务器(php)通信的JS。
一个用户进入网站,它添加了一个24小时cookie和一个会话cookie(两者都有一个随机数生成的“密钥”。如果他们已经在网站上,比如一个会话cookie或24小时,同样将使用密钥。
他们在页面上每 15 秒,它会 Ping 一个“new Image()”网址,将“密钥”发送到服务器。然后服务器使用他们的 IP 地址记录该密钥,这样组合就可以无穷无尽,并且可以输入同一 IP 上的多个用户。
我监视他们的鼠标移动。(如果他们在页面上没有移动鼠标超过 60 秒,他们现在处于空闲状态,我不再发送 Ping),数据库删除已空闲/不活动 3 分钟或未发送 ping 的用户. (提供一些缓冲和宽恕时间)。无论如何,这一切似乎都很好。
但是我开始记录他们输入的时间以及他们最后一次向服务器发送 ping 的时间。数字很突出。该网站上的大量用户太长而无法真实存在。如果他们不移动鼠标,他们就处于空闲状态,但是,有 2,000 多个用户在线,其中 150 人在网站上停留时间超过 20 分钟并移动鼠标(或至少在他们移动鼠标的情况下使用 javascript),并且它的混乱增加平均持续时间。
我说不出话来。我正在尝试建立一个具有平均持续时间的非常准确的在线计数器,但是怎么会有人在网站上呆那么久,是什么导致他们继续向服务器发送 ping。没有意义。我查看了用户代理,所有不同的浏览器,它们似乎不是已知的 Bot,例如 googlebot。他们是流氓。
这些用户将保持每 15 秒主动向服务器发送 ping 数天,如果他们不点击页面(即 30 分钟),我将最大限制为 120 ping,但 ping 仍在继续,这太疯狂了。
var onses = decodeURIComponent(_srread('__SE3'));
var oncook = decodeURIComponent(_srread('__ON3'));
if (onses == '') {
var key = Math.floor((Math.random() * 99999999) + 1).toString();
var bk = key;
}
else {
var bk = onses;
}
sr_pinge(1);
var idleTime = 0;
var pingcap = 0;
var idleInterval = setInterval(sr_idletime, 1000);
function addEvent (evnt, elem, func) {
if (elem.addEventListener) {
elem.addEventListener(evnt, func, false);
}
else if (elem.attachEvent) {
elem.attachEvent("on" + evnt, func);
}
else {
elem[evnt] = func;
}
}
addEvent('mousemove', document, sr_movements);
function sr_movements () {
idleTime = 0;
}
function sr_idletime () {
idleTime = idleTime + 1;
if (idleTime > 60) {
if (this.ping) {
clearInterval(this.ping);
this.ping = false;
}
}
else {
if (this.ping) {} else {
sr_ping();
}
}
}
function sr_ping () {
this.ping = setInterval(function () {
sr_pinge(0);
}, 15000);
}
function sr_pinge (pv) {
pingcap = pingcap + 1;
if (pingcap > 120) return false;
returned = 0;
if (pv == 1) {
if (oncook == '') {
var ontime = new Date(), onexpire = ontime.setTime(ontime.getTime() + 86400000);
_srset('__ON3', encodeURIComponent(bk), ontime);
_srset('__SE3', encodeURIComponent(bk));
}
else {
if (onses == '') {
returned = 1;
_srset('__SE3', encodeURIComponent(bk));
}
}
}
var im = new Image();
var img = 'http://'+Domain+'/o/?type=on&v='+Version+'&pv='+pv+'&r='+returned+'&k='+encodeURIComponent(bk); img += ' & a = '+account_id+' & dn = '+en(docdomain)+' & dt = ' + new Date().getTime();
im.src = img;
}
我不确定在哪里发布这个,但我想确保我构建的代码在许多浏览器中都能正常工作,我的猜测可能是某些地方没有运行,并且人们在不应该的时候是活跃的。但这意味着他们离开网站并忘记它或其他什么。但它占流量的 20%。通常在给定时间大约有 1-2 千名用户在线。