Autor Beitrag
DaKirsche
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Mo 31.12.07 11:26 
Hallo Community,
ich wollt mir einen Counter basteln für meine Webseite, also nicht für ein Programm und bin dabei jetzt auch schon so weit, dass mein Script die Zugriffe auf meine Seite zählt und auswertet.
Jedoch habe ich das Problem, dass ich plötzlich relativ viele "Besucher" auf meiner Seite habe.

Als ich noch einen Counter verwendet hatte, der von einer anderen Webseite aus eingeblendet wurde (www.andyhoppe.com) hatte ich vll. 60 Besucher / Tag...manchmal auch mehr.

Jetzt duch mein Script gezählt habe ich jedoch schon morgens um 9 ca. 50 - 60 Besucher.

Zur Funktionsweise:

Ich frage, jedesmal, wenn das Script aufgerufen wird die IP des Besuchers und das aktuelle Datum des Servers ab und vergleiche diese mit den bereits gespeicherten Einträgen in der Datei "c_ips.txt". Sollte das Datum nicht dasselbe sein schreibe ich die Datei neu --> Besucher heute = 0!

Dann schreibe ich, wenn die IP nicht vorhanden ist, diese in die Datei hinein.
Ich schliesse jede IP mit dem Zusatz "[NIP]" ab, weil ich nach diesem String in der Datei suche, wenn ich die IPs vergleiche.

In der Datei "c_nums.txt" steht nur der Wert für "Gesamt".
Also wenn ich die IP noch nicht in der Datei habe, dann zähle ich Gesamt um 1 hoch und speicher die IP in die Datei ab.
Die Anzahl der Besucher "Heute" zähle ich aus den IP-Adressen in der Datei "c_ips.txt".

So, und nun mein Code:

Die Datei "c_nums.txt":
ausblenden Quelltext
1:
3362					


Die Datei "c_ips.txt":
ausblenden Quelltext
1:
Datum: 31.12.2007216.255.179.2[NIP]77.91.229.56[NIP]195.209.224.83[NIP]84.151.40.171[NIP]77.91.229.56[NIP]88.64.33.91[NIP]77.91.229.56[NIP]89.51.159.248[NIP]77.91.229.56[NIP]62.153.148.22[NIP]195.209.224.83[NIP]77.91.229.56[NIP]195.209.224.83[NIP]77.91.229.56[NIP]66.249.70.186[NIP]201.6.118.244[NIP]77.91.229.56[NIP]212.152.1.42[NIP]77.91.229.56[NIP]212.152.1.42[NIP]220.194.249.26[NIP]195.209.224.83[NIP]74.6.20.138[NIP]77.91.229.56[NIP]85.93.150.66[NIP]77.91.229.56[NIP]195.209.224.83[NIP]84.109.109.39[NIP]84.109.121.116[NIP]84.109.109.60[NIP]84.109.121.121[NIP]66.249.70.186[NIP]77.91.229.56[NIP]66.249.70.186[NIP]77.91.229.56[NIP]189.60.36.202[NIP]77.91.229.56[NIP]84.109.121.118[NIP]66.249.70.186[NIP]195.209.224.83[NIP]77.91.229.56[NIP]84.109.121.117[NIP]84.109.121.122[NIP]125.18.15.99[NIP]77.91.229.56[NIP]66.249.70.186[NIP]77.91.229.56[NIP]195.209.224.83[NIP]24.87.88.154[NIP]87.69.76.164[NIP]77.91.229.56[NIP]74.6.21.137[NIP]74.6.26.154[NIP]90.186.180.203[NIP]					


Und das Script "counter.php":
ausblenden volle Höhe Quelltext
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
<?PHP
//Counterdateien definieren
$counter_file = './Scripts/Counter/c_nums.txt';
$ips = './Scripts/Counter/c_ips.txt';

//prüfen, ob die Dateien existieren...wenn nicht: Dateien anlegen
if (!(file_exists($counter_file))){
$fp = fopen($counter_file,'w+');
fputs($fp,0);
fclose($fp);
};

//heutiges Datum ermitteln
$time = time();
$date = getdate ($time);
$day = $date[mday];
if ($day < 10) $day = '0'.$day;

$mon = $date[mon];
if ($mon < 10) $mon = '0'.$mon;

$year = $date[year];

$a_date = $day.'.'.$mon.'.'.$year;

//IP-Liste: prüfen, ob Datei existiert, wenn nein: anlegen!
if (!(file_exists($ips))){
$fp2 = fopen($ips,'w+');
fputs($fp2,'Datum: '.$a_date);
fclose($fp2);
};

//Inhalt des Counters und der IP-Liste in Variablen laden
$counter = file_get_contents($counter_file);
$iplist = file_get_contents($ips);

//Datum in IP-Liste ermitteln
$date_pos = strpos($iplist,'Datum: ');
$date_pos += 7;
$s_date  = substr($iplist,$date_pos,10);

//Prüfvariable und IP-Adresse initialisieren
$is = false;
$my_ip = getenv("REMOTE_ADDR");

//Wenn nicht heute: IP-Liste neu schreiben --> Counter erhöhen!
if ($s_date <> $a_date){
$fp2 = fopen($ips,'w+');
fputs($fp2,'Datum: '.$a_date);
fputs($fp2,$my_ip.'[NIP]');
fclose($fp2);
$today=1;
$counter+= 1;
}
else
{
// Wenn Datum von heute
$fp2 = fopen($ips,'w+');
$a_pos=$date_pos+10;
$today=0;

//IP-Liste von heute nach IP-Adresse des Clients durchsuchen --> Anzahl Besucher heute dabei zählen (1 Besucher = 1 IP)
while (($a_pos + 5) < strlen($iplist)){
$ip_e = strpos($iplist,'[NIP]',$a_pos);
$ip  = substr($iplist,$a_pos,$ip_e);
$today+= 1;
$a_pos = $ip_e + 5;
if (($ip == $my_ip.'[NIP]')||($ip == $my_ip)||(nl2br($ip) == '<br>'.$my_ip)||(nl2br($ip) == '<br>'.$my_ip.'[NIP]')){$is = true;};
};
//IP-Liste wieder schreiben
fputs($fp2,$iplist);
//Wenn neuer Besucher: IP in Liste aufnehmen --> Counter erhöhen, Hits "Heute" erhöhen
if (!($is)){
fputs($fp2,$my_ip.'[NIP]');
$counter+= 1;
$today+= 1;
};
fclose($fp2);
};
//Counter speichern
$fp = fopen($counter_file,'w+');
fputs($fp,$counter);
fclose($fp);

//Variablen für Ausgabe anpassen:
$Besucher_heute = $today;
$Besucher_gesamt = $counter;
$Besucher_IP = $my_ip;
  
?>


Was mache ich dabei falsch? Das Script speichert ja die IPS ab, aber manchmal jecoh doppelt und das sollte es ja nicht machen.

Kann mir jemand helfen oder nen Tipp geben?

MFG und schonmal nen guten Rutsch!
DaKirsche

_________________
Die simpelsten Fehler sind meist die Schwersten...
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 31.12.07 12:35 
Ohne das Script jetzt angeguckt zu haben: Ich habe auch so hohe Zugriffszahlen. Die Suchmaschinenbots haben meist mehrere IP-Adressen, dazu kommen Spam-Bots. Das macht täglich mehr als 100 "Besucher".

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
DaKirsche Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Mo 31.12.07 12:43 
Ja, aber der vorher verwendete Counter der besagten Webseite hätte die dann doch auch mitzählen müssen, oder nicht? Oder gibt es irgendwo eine ständig sich aktualisierende Liste der Bot-IPs? Die muss man dann doch irgendwie filtern können, oder nicht?

Sowas, wie:
ausblenden Quelltext
1:
2:
3:
4:
5:
$Bot_IPs = array('111.222.111.222','123.123.123.123'.'21.231.212.1');

If (!(eregi($my_ip,$Bot_IPs))){
echo 'Kein Bot';
};


Oder geht das nicht?

_________________
Die simpelsten Fehler sind meist die Schwersten...
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 31.12.07 13:00 
Ja, gibt es: www.bot-trap.de/ Aber selbst damit hab ich noch über 100 Besucher. Das sind mittlerweile so viele Bots, die kann man nicht mehr alle aufhalten ^_^

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
DaKirsche Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Mo 31.12.07 13:07 
hmmm..also müsste man quasi den bots den zugriff "verweigern", soweit wie es geht, was jedoch auch wiederum schlechter für die Suchmaschinen ist und die Spam-Bots lassen sich davon ja nicht beirren...

Man müsste also die Tätigkeiten des "Users" irgendwie überwachen und auswerten und wenn das dann als "normale" tätigkeit gesehen werden kann erst dann zählen...

das ist Sch...

Naja...trotzdem danke! Ich schaue mal, ob ich das irgendwie rauskriege.

Aber da bleibt im Code immer noch das Problem, dass ich manche IPs trotzdem doppelt drin habe...

_________________
Die simpelsten Fehler sind meist die Schwersten...
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mo 31.12.07 13:22 
Die meisten Suchmaschinenbots lassen sich am user-agent erkennnen.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
DaKirsche Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Do 03.01.08 12:46 
Hi,
habe jetzt versuchz die Bot auszuschliessen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Prüfen, ob ein Bot erkannt wird --> wenn ja: nicht zählen!
$bot_typical_agents=array('http://www.google.com/bot.html','Googlebot','Beta 3','Yahoo! Slurp','msnbot.htm','LWP::Simple','ysearch/slurp','bot','robot','search');
for ($y=0;$y<sizeof($bot_typical_agents);$y++)
{
if (eregi($bot_typical_agents[$y],$_SERVER['HTTP_USER_AGENT']))
{
$is = True;
};
};

mal sehen, ob ich morgen weniger Besucher habe;)

aber da bleibt im Code immer noch das Problem, dass der irgendwie trotz der Abfrage manchmal IPs doppelt zählt...
Kann mir dabei jemand helfen?

_________________
Die simpelsten Fehler sind meist die Schwersten...