[PHP] met HTTP_USER_AGENT "echte" bezoekers bepalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb aan een bepaalde website een bepaald telsysteem hangen. Dit houdt bij hoeveel bezoekers er per dag van een bepaalde andere site afkomen. Op zich werkt mijn systeem goed behalve dat zoekmachinebezoeken ook meegeteld worden en dat moet natuurlijk niet. Ik zou daarom graag alleen "normale bezoekers" tellen.

Hoe kan ik er voor zorgen dat ik alle zoekmachinebezoeken (google, msn, yahoo etc.) niet meetel?

Ik zat te denken aan een controle met $_SERVER['HTTP_USER_AGENT'] maar ik weet niet precies wat voor useg agents ik dan moet uitsluiten. Als ik bijvoorbeeld FF IE en Safari neem dan heb ik daarmee ruim 99% van mijn bezoekers afgedekt, voor mij meer dan voldoende. Is het haalbaar om dus alleen bezoekers die deze drie browsers gebruiken te tellen?

Zo ja, hoe dit ik dit? :)

Thanks!

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Gezien de enorme hoeveelheid bots is whitelisting inderdaad geen gek idee. Als je dan Webkit (Chrome, Safari) KHTML (Konquerer), Opera, IE en Gecko (FF) pakt heb je vrijwel alle mainstream browsers wel te pakken.

En hoe je dat doet? Je weet al waar het staat dus daar de relevante substring uithalen moet niet zo moeilijk meer zijn. ;)

[ Voor 24% gewijzigd door AtleX op 08-09-2008 18:54 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Of je instaleert even een standaard statsteller a la google analitics of een willekeurig andere en kijkt hoe zij dit probleem aanpakken. Vaak heb je dan al meer dan als je zelf gaat lopen bouwen, zeker als je net begint te onderzoeken wat de mogenlijkheden zijn :)

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Verwijderd schreef op maandag 08 september 2008 @ 18:51:
Ik heb aan een bepaalde website een bepaald telsysteem hangen. Dit houdt bij hoeveel bezoekers er per dag van een bepaalde andere site afkomen. Op zich werkt mijn systeem goed behalve dat zoekmachinebezoeken ook meegeteld worden en dat moet natuurlijk niet. Ik zou daarom graag alleen "normale bezoekers" tellen.

Hoe kan ik er voor zorgen dat ik alle zoekmachinebezoeken (google, msn, yahoo etc.) niet meetel?

Ik zat te denken aan een controle met $_SERVER['HTTP_USER_AGENT'] maar ik weet niet precies wat voor useg agents ik dan moet uitsluiten. Als ik bijvoorbeeld FF IE en Safari neem dan heb ik daarmee ruim 99% van mijn bezoekers afgedekt, voor mij meer dan voldoende. Is het haalbaar om dus alleen bezoekers die deze drie browsers gebruiken te tellen?

Zo ja, hoe dit ik dit? :)

Thanks!
Het geen hoe ik het heb gedaan een tijdje terug was elke user agent opslaan in de database, na een tijdje had ik een aardig lijstje, vervolgens gekeken welke ik wel en niet mee wilde laten tellen.
Als er dan toch nog een user agent was die niet voorkwam in mijn database, deze toevoegen en vervolgens een flag bij zetten om te controleren, na een tijdje heb je zo alles vrijwel afgedekt :)

want ik merkte dat er toch nog een hoop andere waren dan zoekmachines bv whois bots en dergelijke...

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Log eens een weekje ofzo, en begin dan te filteren.

Gecko eruit.
Webkit eruit.
(Engine van Opera) eruit.
IE engine eruit.

En dan kan je verder specifieren.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Naast de paar mainstream browsers die hier genoemd worden kun je er nog wel "tig" gaan meetellen, maar die worden procentueel gezien dusdanig weinig gebruikt dat ze ook (procentueel gezien) dus een nihil verschil in je hitcounter zullen veroorzaken. Je moet je afvragen of het dan wel de moeite is om je lijst met browsers om de zoveel tijd (weer...) bij te moeten werken; dat gaat na een tijdje vervelen en er blijven browsers bij komen en verdwijnen...en dan tel je de "lalala ik geef lekker niet door welke browser ik gebruik!!!111" nog niet eens mee.

edit: een kleine greep uit de 'grapjas' agentstrings:

code:
1
2
3
4
5
6
7
8
9
10
Not your business!
SH*D*Hs SPooFeD BRoWSeR
SH*D*H/1.0 (Windows NT 5.1)
WoeiBrowsah 2K (by S*****fly);
This is a Web (c) Browser (tm) - Greetings from the Netherlands! - http://www.<<weg>>.nl - Running Debian unstable!
None of your business
Mooie browser hé (eigen build)
Sorry forgot
no Access
DEBUG

[ Voor 23% gewijzigd door RobIII op 08-09-2008 19:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Ik denk dat er aanzienlijk minder bots zijn (en dat die aanzienlijk regelmatiger bezoeken) dan (exotische) browsers, dus ik zou juist bots blacklisten. Zoals Snake zegt, gewoon kijken wat je tegenkomt, en als er een bot bij je resultaten zit, gooi je 'm in de blacklist.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Soultaker schreef op maandag 08 september 2008 @ 19:05:
Ik denk dat er aanzienlijk minder bots zijn
In een wat grotere website kom ik in no-time al 70 tot 80 verschillende bots tegen...Whitelisten van de (zeg) top 25 meest gebruikte/bekende browsers is komende jaren genoeg om je lijst niet meer bij te hoeven werken. Ik moet wel toegeven dat je 80% van de bots al aan het keyword "bot" ofzo herkent; dat scheelt wel weer :P

[ Voor 33% gewijzigd door RobIII op 08-09-2008 19:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
wat met de bots die met een fake-user-agent-string langs komen ?
(bij de meeste moderne browser kan je dat al aanpassen, en elke goedgeschreven bot/spider heeft de mogelijkheid om alles wat in een header komt willekeurig in te vullen en door te geven bij het opvragen van je pagina - mijn eigen php-proxy-script vraagt zo ook de pagina's met een basis header via een "maak eigen header, open verbinding naar 'site' op poort x, stuur eigen headers door, vraag pagina, ontvang pagina, haal slechte scripts/links eruit en stuur door naar browser..."-script in totaal mss 8 regels om die eerste 5 stappen te doen.
maw: als ik mijn bot via die proxy stuur zie jij nog steeds een gewone browser, met een delay in het surfgedrag merk je het niet of amper in je stats... (het enige wat mss raar gaat lijken is dat op het ip-adres van pagina-vraag een webserver draait, met een basispagina, de referrer gaat spijtig voor jou niet verraden dat ie via mijn site komt.)

(is wel niet mijn bedoeling van die proxy, maar om een manier van 'veilig surfen' aan te bieden aan bekenden die anders veel te snel hun pc weer infecteren met troep - zij merken het amper en als ik weer een lijst nieuwe 'scam'-domeinen ken, hoef ik niet langs hen te rijden om die lokaal te blokkeren op hun firewall ofzo)

Maar of er nu een bot via dat script komt of een gebruiker dat weet jij niet.

en meestal kan je idd met die $_SERVER... en een regex de echte browser wel vinden.
(regex'en zijn daar al voor te vinden)

alle bots uitsluiten terwijl alle bezoekers blijven: onmogelijk, maar je krijgt de meeste al buiten.

(een robot.txt kan het mss ook al oplossen voor de beleefde bots 'deny counter.php' ofzo)
en hou je script veilig voordat je een exploit open zet: headers zijn aanpasbaar en dus niet altijd even betrouwbaar.

ik wil maar aangeven dat buiten de user-agent-string er ook nog referrer's zijn en ev. ip-adressen of -netten die je kunt blokkeren...

Acties:
  • 0 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
Op deze site staat een aardig complete lijst van bekende user-agents:
http://www.useragentstrin...ragentstring.php?name=All

Ik vermoed dat je hier zelf wel aardig mee kan testen of je script de juiste waarden gaat terug geven.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Soultaker schreef op maandag 08 september 2008 @ 19:05:
Ik denk dat er aanzienlijk minder bots zijn (en dat die aanzienlijk regelmatiger bezoeken) dan (exotische) browsers, dus ik zou juist bots blacklisten. Zoals Snake zegt, gewoon kijken wat je tegenkomt, en als er een bot bij je resultaten zit, gooi je 'm in de blacklist.
Ik geloof dat wij op zo'n 25k verschillende useragents zitten op een dag, waarvan een groot deel bots... Vooral de reeks verschillende useragents die je vanuit internet explorer kan krijgen is bizar lang. Dus zowel white- als blacklisten is een rotklus als je niet ook met keywords gaat werken.

Het is voor Google Analytics trouwens makkelijk, want bots voeren doorgaans de javascript niet uit. Als je een langere history van access logs kan bekijken is dat ook een aardige indicatie of een client een bot was of niet, kijken of ie de css en javascript heeft opgevraagd. Een andere indicatie is natuurlijk dat ze de robots.txt opvragen, maar dat doen ze lang niet allemaal.

Ik zou niet enkel naar 'MSIE' kijken, een groot deel van de bots voert dat ook in de useragent-string op. Het werkt al beter om op de regexp 'MSIE [4-8]' te zoeken en dan alles met 'crawler', 'spider', 'bot', een e-mailadres of webadres in de useragent er weer uit te gooien (heb je ook een paar echte bezoekers mee, maar niet erg veel). Voor firefox en vrienden zou ik zoeken op 'Gecko/200'-useragents en ook weer de voorgaande lijst er uit filteren.
Opera, Webkit, KHTML en de overigen komen in botnamen erg weinig voor, dus die kan je ongefiltered meenemen voor zover ik zag.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor alle goede suggesties. Ik heb inmiddels het volgende gemaakt, met name op basis van de reactie van ACM:

code:
1
2
3
if (( strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 4") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 5") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 6") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 7") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"'Gecko/200") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"Opera") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"WebKit") !== false | strpos($_SERVER['HTTP_USER_AGENT'],"KHTML") !== false ) && ( strpos(strtolower($_SERVER['HTTP_USER_AGENT']),"spider") === false && strpos(strtolower($_SERVER['HTTP_USER_AGENT']),"crawler") === false && strpos(strtolower($_SERVER['HTTP_USER_AGENT']),"bot") === false )) {//meeste bots uitsluiten
//hier de code die uitgevoerd wordt als het zeer waarschijnlijk niet om een bot gaat
}


Wat ik hier nog niet doe is de user agents met een email adres of webadres erin filteren. Zou ik dit gewoon kunnen doen door te zoeken naar "http" en "@" of filter ik dan teveel gewone gebruikers weg?

En zou dit stukje code het overgrote deel van de normale bezoekers nu wel tellen (en de meeste bots niet) of mis ik misschien nog iets?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
!== false

:? Lekker duidelijk :X
En waarom MSIE 4, MSIE 5, MSIE 6 en MSIE 7 stuk voor stuk vermelden? Zou een switch niet stukken leesbaardere code opleveren? En je weet dat strpos geen true/false geeft maar een positie?
Verwijderd schreef op dinsdag 11 november 2008 @ 09:25:
Wat ik hier nog niet doe is de user agents met een email adres of webadres erin filteren. Zou ik dit gewoon kunnen doen door te zoeken naar "http" en "@" of filter ik dan teveel gewone gebruikers weg?
Waarom probeer je het niet gewoon?
Verwijderd schreef op dinsdag 11 november 2008 @ 09:25:
En zou dit stukje code het overgrote deel van de normale bezoekers nu wel tellen (en de meeste bots niet) of mis ik misschien nog iets?
Zie hierboven: waarom probeer je het niet gewoon?

[ Voor 61% gewijzigd door RobIII op 11-11-2008 09:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
RobIII schreef op dinsdag 11 november 2008 @ 09:30:
code:
1
!== false

En je weet dat strpos geen true/false geeft maar een positie?
Als de needle niet gevonden wordt, dan returned strpos() een false, dus met deze constructie is niks mis hoor.

Wat betreft de leesbaarheid zou de TS de bovenstaande constructie kunnen vervangen door iets als:
PHP:
1
2
3
4
5
6
7
8
9
switch( true ){
  strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 4") !== false :
  strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 5") !== false :
  etc:
    uniekeBezoeker();
    break;
  default:
    geenUniekeBezoeker();
    break;

Je kunt de constructie ook maken met een switch( false ) en dan de !== weghalen en uniekeBezoeker() verwisselen met geenUniekeBezoeker() of de !== false helemaal weghalen, aangezien switch() gebruikmaakt van loose comparison.

[ Voor 45% gewijzigd door doeternietoe op 11-11-2008 10:07 . Reden: code toegevoegd ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
doeternietoe schreef op dinsdag 11 november 2008 @ 09:58:
[...]

Als de needle niet gevonden wordt, dan returned strpos() een false, dus met deze constructie is niks mis hoor.
:X Crap; hoe vaak ik daar niet in stink bij PHP... Returns int... Except when full moon or on 3rd tuesdays of the month ...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1