• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Prüfen ob User ist Aktiv

Hubsi7

New member
Hallo, ich wollte eine Seite Basteln auf der man wenn man 10 Minuten aktiv ist einen Punkt bekommt (MYSQL Datenbank) wenn man aber für so 8 Minuten nicht aktiv ist werden die 10 Minuten erst wieder gestartet, wenn man wieder aktiv auf der Seite wird.

Ich habe mich im Internet schlau gemacht und habe herausgefunden, das man sowas am besten mit JS realisieren kann (Korrigiert mich wenn das nicht stimmt). Jedoch habe ich leider keine Ahnung mit dem Thema Javascript. Deshalb suche ich nun hier nach Hilfe. Ich hoffe das ich das verständlich erklärt habe.

~Andre
 
definiere bitte zuerst was "aktiv" bedeutet. dann kann man schauen ob man das mit eventhandlern auslesen kann.
 
Ja er soll sich halt auf der website bewegen. D.h. maus bewegen, srcollen, seite wechseln (wobei da der wert mit übergeben werden soll, wie lange er schon aktiv ist) usw.
 
schau dir mal die https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API an
es sei allerdings schon jetzt dazugesat dass die auch nicht ganz zuverlaessig ist zum bsp. wenn man das fenster offen hat aber nicht benutzt.
alternativ könnte man z.b. tasteneingaben/mausbewegungen catchen.

ps: ich denke ich muss nicht erwaehnen, dass man das natürlich trotzdem alles sehr leicht austricksen kann
 
Ok. Und gibt es irgend eien möglichkeit, wie man das nicht so leicht austricksen kann
im standard browser mit js gott sei dank nicht. das wäre fatal, wenn jeder jeden überwachen könnte!
du könntest ein browserplugin dafür bauen oder eine normale desktop anwendung.

wofür ist das denn?
 
Ich möchte eine Website bauen. (im nutzerbereich) bei der man alle 10 minuten aktivität einen punkt bekommt, denn man dann gegen etwas eintauschen kann.
 
Ich möchte eine Website bauen. (im nutzerbereich) bei der man alle 10 minuten aktivität einen punkt bekommt
das einzige, was du an "aktivitaet" zuverlaessig serverseitig messen kannst sind seitenaufrufe/serveranfragen. und für sowas kann man sich ganz eifnach bots schreiben, die z.b. ständig unterschiedliche seiten aufrufen
 
dann musst du die definition von aktivität den technischen möglichkeiten anpassen oder das projekt begraben
 
Hi. Ich hatte genau sowas mal durchgetestet für die Verwendung in einem Browsergame.

Ich poste dir mal mein Testfile von damals. Vielleicht kannst du was davon verwerten.

LG

Code:
"use strict";

//Script kapseln, damit der globale Namespace nicht verschmutzt wird
(function A () {

//variablen deklarieren 
var now = Date.now();
var lastActivity=now;



 //Tickrate 100 ms
 //Es muss ein Mittelweg zwischen Aktualisierungsrate und Last gefunden werden.
var timerInterval=100;
//Timeouts festlegen (in Millisekunden)
// zum Testen relativ kurze Zeite, später deutlich länger 
var idleTimeoutVisible=5000;
var idleTimeoutBlur=2000;
var idleTimeoutHidden=1000;
var idleTimeout=idleTimeoutVisible;

var pageVisible=true;
var pageFocus=true;
var userActive;

tick();  // Den ersten Tick abfeuern damit der Userstatus sofort kommt.
// SetInterval als Taktgeber für das Programm
var timerId=setInterval(tick,timerInterval);


//Eventhandler für Focus, Blur und Visibilitychange
window.addEventListener("focus", function() 
	{
	
	pageFocus=true;
	lastActivity=now;
	idleTimeout=idleTimeoutVisible;
	console.log("Focus, Timeout set to: "+idleTimeout);
	});


window.addEventListener("blur", function() 
	{
	
	pageFocus=false;
	lastActivity=now;
	if (pageVisible===false) idleTimeout=idleTimeoutHidden;
	else idleTimeout=idleTimeoutBlur;
	console.log("Blur, Timeout set to: "+idleTimeout);
	});

window.addEventListener("visibilitychange",function() 
	{
	if (document.hidden) {
		
		pageVisible=false;
		idleTimeout=idleTimeoutHidden;
		console.log("Hidden, Timeout set to: "+idleTimeout);
		}
	else {
		
		pageVisible=true;
		idleTimeout=idleTimeoutVisible;
		console.log("Visible, Timeout set to: "+idleTimeout);
		}
	lastActivity=now;
 	});


//Eventhandler registrieren um Aktivität im Fenster festzustellen
window.addEventListener("mousedown", function() 
	{
		lastActivity=now;
	});

window.addEventListener("keydown", function() 
	{
		lastActivity=now;
	});

window.addEventListener("keydown", function() 
	{
		lastActivity=now;
	});


//Diverse Eventhandler für einzelne Elemente wie z.B. die spätere Messagebox, Eingabefeld, Statusbar usw.
//Hier nur beispielhaft eine Reaktion auf einen Klick auf die Messagebox.
var elem = document.getElementById('msg');
elem.addEventListener("mousedown", function() 
	{
		console.log("Nachrchtenbereich angeklickt");
	});

//Prüft, ob der User aktiv oder inaktiv ist.
function checkIdle ()
{
var laststate=userActive;
	if 	(now-lastActivity>idleTimeout)
		{
			userActive=false;
		} 
	else
		{ 
			userActive=true;
		}


//Nur ausgeben, wenn sich etwas geändert hat
if (laststate!=userActive) 
	{
		console.log("userActive changed to: "+userActive);
		if (userActive==true) document.getElementById('info').innerHTML="User ist gerade aktiv";
		else document.getElementById('info').innerHTML="User ist gerade Inaktiv";
	}
}


// Die Funktion "Tick" ist der Taktgeber des späteren Programms
// Hier können diverse Funktionen eingebaut werden, die regelmäßig ausgeführt werden sollen.
// Beispielsweise regelmäßige XHR Requests, DIV Aktualisierungen usw.
function tick ()
{
	now=Date.now();
	checkIdle ();
}


})();
 
ich hab den code jetzt nicht genau durchgeschaut, von daher sorry falls das nicht konkret übereinstimmt, aber da wuerd ich einfach etwas a la

Code:
setInterval(
  function(){
    //hier Variablen einfach "korrekt" setzen, z.B. userActive auf true usw.
  }, 
  1000
);

machen, und schon ist die "Aktivitätsprüfung" nutzlos ausgetrickst.
 
Solange etwas Clientseitig ist, kann man es austricksen.

Bei meinem Beispiel ging es darum, bei den XHR Requests zu sparen. Das heißt, wenn der User gar nicht wirklich aktiv spielt, das Update Intervall runter zu fahren um Traffic zu sparen.
Warum soll man etwas übertragen, dem der User ohnehin keine Beachtung schenkt.

Wenn es nur drum geht, in einem Spiel, für die Anwesenheit zu belohnen, wird es schwer. Es gibt genug "Klickbots" oder Tools mit denen man komplexe Maus/Tastaturaktionen aufzeichnen und abspielen kann. Und wenn man serverseitig die Requests auswertet (Sprich ist es einfach ein zyklischer Poll oder wirklich eine Spielaktion) und darüber ein Aktivitätsflag setzt, nützt das auch nichts gegen die eben genannten Programme.
Anfangs hatte nämlich ich auch die Idee, aktive Spielzeit belohnen. Fabriken sollten schneller produzieren, solange man wirklich "Anwesend" ist. So nach dem Motto "Chef ist da, die Arbeiter hauen nen Schlag mehr rein". Davon bin ich abgekommen. Jetzt muss man das schneller produzieren bezahlen (Motivation der Arbeiter durch Lohnzulage). Ob man anwesend ist oder nicht, spielt dabei keine Rolle.

- - - Aktualisiert - - -

Was die XHR Requests betrifft, ich bin vom zyklischen Polling bzw dem immer wiederkehrenden Abruf einer Ressource allerdings auch weitgehend abgekommen.

Ich nutze nun Websockets als Benachrichtungskanal.
Wenn über Websocket eine neue Meldung kommt, erst dann wird per XHR das betreffende Element herunter geladen.
 
Bei meinem Beispiel ging es darum, bei den XHR Requests zu sparen. Das heißt, wenn der User gar nicht wirklich aktiv spielt, das Update Intervall runter zu fahren um Traffic zu sparen.
Warum soll man etwas übertragen, dem der User ohnehin keine Beachtung schenkt.
klar, dafür ist es sinnvoll

Wenn es nur drum geht, in einem Spiel, für die Anwesenheit zu belohnen, wird es schwer. Es gibt genug "Klickbots" oder Tools mit denen man komplexe Maus/Tastaturaktionen aufzeichnen und abspielen kann. Und wenn man serverseitig die Requests auswertet (Sprich ist es einfach ein zyklischer Poll oder wirklich eine Spielaktion) und darüber ein Aktivitätsflag setzt, nützt das auch nichts gegen die eben genannten Programme.
Genau darum geht's mir:
Ich möchte eine Website bauen. (im nutzerbereich) bei der man alle 10 minuten aktivität einen punkt bekommt, denn man dann gegen etwas eintauschen kann.

und da gilt wie gesagt:
Solange etwas Clientseitig ist, kann man es austricksen.
 
Ja, ich weiß was du meinst. Es ist technisch aber nicht möglich, zu prüfen, ob ein User auch wirklich aktiv ist.
Klar, man testen ob das Browserfenster im Sichtbar und im Vordergrund (Visible / Hidden / Blur) ist. Aber ist der User wirklich da, oder kocht er gerade das Mittagessen?
Man kann dann auch noch Keyboard- oder Mausevents dazu nehmen oder Requests auswerten.

Aber wenn die Belohnung zu gut ausfällt, wird eben irgend ein Klicketool eingesetzt.
Selbst wenn es nur drum geht, die Produktion bei verschiedenen Gebäuden einzusammeln, (und nicht um reines Anwesend-sein) hat man Ruckzuck einige Makrotool User mit dabei.

Das einzigste, was meiner Meinung nach hilft, ist die Belohnungen relativ moderat ausfallen zu lassen und die Zeitabstände groß zu wählen.
Wenn man alle 5 Minuten irgendwo die Produktion einsammeln muss, wird man ehr verleitet, ein Klickertool zu nehmen als wenn es nur alle paar Stunden ist.

Bei mir ist es so, dass ich für reines Online-sein keine Belohnung ausgebe. Von der Idee bin ich abgekommen. Aber der tägliche Login wird belohnt. Es ist wichtiger, dass die Leute täglich mal reinschauen, als stundenlang das Spiel einfach mitlaufen zu lassen.

Und bei der Produktion hab ich es so gemacht, dass es nicht in festen Intervallen abzuholen ist, sondern man "jederzeit" abholen kann (Sofern was fertig ist). Ansonsten gibts noch die Möglichkeit, direkt über das Spiel das Abholen zu automatisieren.
 
deshalb hab ich auch geschrieben, dass man "aktiv" erstmal definieren muss
das meiste was darunter fällt wird man im nativen Browser nicht abdecken können, weil eine maschine nun mal eben nicht so ohne weiteres einen mensch analysieren kann und ein browser schon garnicht
 
Zurück
Oben