[PHP] clsStats.php - Webseitenstatistik vereinfachen

Als Webseitenbetreiber benötigt man nicht selten Informationen darüber, welchen Browser oder welches Betriebsystem ein Besucher verwendet. Die Ermittelung an sich stellt kaum ein Problem dar, denn man muss lediglich den "UserAgent" auslesen. Doch oftmals möchte man in einfach zu lesender Form, oder für statistische Zwecke eben nicht nur den zusammengesetzten String kennen. Doch je seltener der Browser ist und je mehr Browser auf dem Markt verfügbar sind, desto schwieriger wird es stets das richtige auszulesen.

Die "clsStats.php" hilft dabei! Sie erkennt anhand von Mustern, welche Browser, Betriebssysteme verwendet werden. Sie ermittelt die IP und sofern möglich auch den zugehörigen Provider. ABER es muss dabei gesagt werden, dass die Erkenntnisse immer auf Erfahrungswerten basieren! Fehler sind nicht ausgeschlossen. Der Browsermarkt ist sehr unübersichtlich. Neben den beiden großen "Internet Explorer" und "Mozilla Firefox" existieren noch unzählige andere. Hinzu kommen immer wieder neue oder geänderte Versionen, die neue oder andere UserAgents mit sich bringen. Darüber hinaus gibt es unzählige Bots und Crawler, die sich teilweise auch nur durch Erfahrungswerte erkennen lassen. Die clsStats.php kann vieles recht gut erkennen - bedarf aber ständiger Pflege der Erkennungsmuster!

Wenn Sie sich sehr gut in diesem Segment auskennen und einen Fehler finden oder eine andere Information zusteuern können, wäre eine Mitteilung via Kontaktformular sehr wünschenswert.

Da Datenschutz ein sehr wichtiges Thema ist wird hier speziell darauf hingeweisen. Es ist mit dieser php-Klasse technisch möglich, Profile über den Besucher zu erfassen. Dieses wird hier nicht betrieben! Bei dieser Webseite werden ausschließlich Daten erhoben, die zur Optimierung der Webseite dienen. Die Daten sind nicht verknüpfbar!

Inhalt:


Version

Aktuelle Version:   4.9    Changelog 

letzter Release vom 12. April 2010


Features / Funktionsumfang

  • IP ermitteln
  • Provider abfragen
  • Browsername und -version auslesen
  • Auf Bot, Spider oder Crawler abfragen
  • Betriebssystem ermitteln
  • Referer ermitteln
  • die im Browser eingestellte bevorzugte Sprache


Funktionsweise

Die Funktionsweise der Klasse ist zum Großteil selbsterklärend.

Die Klasse ist nur unter php 5 nutzbar. Für php 4 sind ein paar Änderungen notwendig, die auf Wunsch bzw. nach Anfrage problemlos machbar sind.

Bei der Instanziierung wird der Konstruktor aufgerufen, welcher versucht den UserAgent, die IP und den Referer zu setzen. Dazu ruft er jeweils die Setter-Funktionen der Klasse auf und übergibt den entsprechden String.

Die setBrowser(), setOS() und setProvider()-Funktionen ermitteln anhand des UserAgents/IP die enstprechenden Informationen. Diese sind stets hardcoded als reguläre Ausdrücke bzw. über strpos() abfragbar. Für weitere Informationen müssen diese Funktionen von Hand nachgearbeitet werden. Eine dynamische Ermittelung ist nicht möglich.

Die Getter-Funktionen (zB getOS(), getBrowser() etc) liefern den Wert der jeweils entsprechenden Klassenvariable zurück.

Kleines Testergebnis anhand Ihrer Daten:

Ihr UserAgent:

ccbot/1.0 (+http://www.commoncrawl.org/bot.html)

Ihr Browser:

Ihr Betriebssystem:

(?)

Ihre IP-Adresse:

38.107.191.119

Ihr Provider:

Ihre Sprache:

en

Sollten die obigen Daten nicht korrekt sein, dann wäre es hilfreich, wenn Sie sich mit dem obigen Ergebnis via Kontaktformular melden würden!


Beispielcodes

Beispiel 1 (OS ermitteln):

	$stats = new Stats;
	$os = $stats->getOS();
	

Beispiel 2 (Provider von spezieller IP ermitteln)

	$stats = new Stats;
	$stats->setIP('209.85.129.104');
	$provider = $stats->getProvider();
	

Für weitere Fragen und Hilfe kontaktieren Sie mich doch via Kontaktformular!


Download

Download aktuelle V4.9 
md5-Checksumme: 644ca01a746b2b9dded4715b2c09d796

Download V4.8.5 
md5-Checksumme: a3767cb034a4e22a5fdc3eb5b6babd97


Sourcecode

  1. <?php
  2. /** Die Stats-Klasse ermöglicht es, Informationen über den Besucher der Seite auszulesen.
  3.  *
  4.  * Provider-, OS- und Browser-Ermittlung müssen hardcoded vorgegeben werden, da die
  5.  * Informationen nicht abrufbar sind. Siehe dazu die Funktionen setBrowser(), setOS() und
  6.  * setProvider().
  7.  *
  8.  * @author Markus Buscher | webmaster <at> mbuscher <dot> de
  9.  * @since 24.07.2007
  10.  * @version 4.9
  11.  * Changelog (last 12):
  12.  * 4.9 - 12.04.2010 - neues Feature: Auswertung der eingestellten Browsersprache, 7 neue Bots aufgenommen, 5 neue Provider aufgenommen, Logikfehler innerhalb der isBot() und getBot() Funktionen behoben
  13.  * 4.8.5 - 17.08.2009 - Erkennung von Windows 7 implementiert
  14.  * 4.8.4 - 11.08.2009 - Provider Freenet/Mobilcom, QSC, Unitymedia nachgebessert, Browser IPhone-Safari, Opera-Mini, IE-Mobile & Phoenix aufgenommen, IPhone-OS, Google Android, Nintendo Wii aufgenommen, IP-Ermittelung verbessert um manipulierte IPs etwas genauer zu erkennen
  15.  * 4.8.3 - 05.09.2008 - Fehler in Providerermittlung behoben, Linux-OS in einige erkennbare Varianten unterteilt, Browser Google Chrome geadded, getarnten Yahoo-Bot geadded, k-meleon Browser und AOL-Browser nachgebessert , Browser- und OS-Prüfung bei leerem UserAgent nicht anwenden
  16.  * 4.8.2a - 16.08.2008 - Weitere Bots aufgenommen
  17.  * 4.8.1a - 15.08.2008 - Opera-Überprüfung nachgebessert
  18.  * 4.8a - 14.08.2008 - Safari-Browser Versionsprüfung korrigiert, reguläre Ausdrücke für Browserversionen stark verbessert, $browser in $browsername und $browserversion aufgeteilt. Zwei weitere Funktionen getBrowserName() und getBrowserVersion() - alte getBrowser() liefert beides zusammen
  19.  * 4.7.3 - 04.08.2008 - Weitere Bots, Browser, OS geadded
  20.  * 4.7.2 - 03.08.2008 - Bot-Überprüfung etwas angepasst / ausgebaut
  21.  * 4.7.1a - 31.07.2008 - IP-Ermittelung ausgebaut
  22.  * 4.7a - 21.07.2008 - Funktionsaufrufe umgelagert sowie Regex-overhead verringert durch jeweils voranstellen einer strpos() !== false Abfrage. ==> verbesserte Performance
  23.  * 4.6.2 - 23.06.2008 - isBot() Überprüfung vor setOS() und setProvider(), da diese Abfragen bei Bots überflüssig sind, MLBot, MSIECrawler, Gigabot aufgenommen, Win 3.11, RISC OS und Oregano Browser aufgenommen
  24.  * 4.6.1 - 20.06.2008 - Bot ia_archiver (Waybackmachine) aufgenommen, Avant Browser aufgenommen, alternative iCab-Abfrage aufgenommen
  25.  * 4.6 - 19.06.2008 - Setzen des Referers abgesichert, Funktion getBot() und isBot() zum Abrufen des Bot-Namens beigefügt. Browser bleibt bei Bot leer, stristr() durch performantere strpos() ersetzt
  26.  * 4.5 - 17.06.2008 - viele neue Provider geadded, neue Browser geadded, Windows 2000 geadded
  27.  *
  28.  * Beispiel 1 (OS ermitteln):
  29.  * $stats = new Stats;
  30.  * $os = $stats->getOS();
  31.  *
  32.  * Beispiel 2 (Provider von spezieller IP ermitteln)
  33.  * $stats = new Stats;
  34.  * $stats->setIP('209.85.129.104');
  35.  * $provider = $stats->getProvider();
  36.  *
  37.  * Copyright Hinweis / Lizenzbedingungen:
  38.  * Das Verwenden des nachfolgenden Codes ist für private nicht kommerzielle Zwecke
  39.  * uneingeschränkt gestattet. Das Verwenden des Codes für kommerzielle Zwecke ist ausschließlich
  40.  * nach Zustimmung in vorhergehender Absprache mit dem Autor "Markus Buscher" gestattet. Das
  41.  * Weitergeben des Codes ist erlaubt, sofern der Name des Autors genannt wird.
  42.  *
  43.  * Siehe auch: http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de
  44.  *
  45.  * Testergebnisse, Anregungen, Kritiken, weitere Browser, OS oder Provider an webmaster <at> mbuscher <dot> de
  46.  */
  47.  
  48. class Stats
  49. {
  50. // Klassenvariablen
  51. private $ua;
  52. private $ip;
  53. private $provider;
  54. private $browsername;
  55. private $browserversion;
  56. private $os;
  57. private $referer;
  58. private $bot;
  59. private $lang_raw = false;
  60. private $lang_parts = null;
  61.  
  62. // Konstruktor ###################################################
  63. /** Um Stats zu nutzen Klasse über Konstruktor intanziieren */
  64. function Stats()
  65. {
  66. // UserAgent setzen
  67. $this->setUserAgent($_SERVER["HTTP_USER_AGENT"]);
  68.  
  69. // IP setzen
  70. if(getenv('HTTP_CLIENT_IP'))
  71. $ip = getenv('HTTP_CLIENT_IP');
  72. else if(getenv('HTTP_X_FORWARDED_FOR'))
  73. $ip = getenv('HTTP_X_FORWARDED_FOR');
  74. else
  75. $ip = getenv('REMOTE_ADDR');
  76. if($ip != '' && eregi('(((([0-9]{1,2})|([1-2]{1}[0-9]{2}))\.){3}(([0-9]{1,2})|([1-2]{1}[0-9]{2})))', $ip, $regs))
  77. $ip = $regs[1];
  78. $this->setIP($ip);
  79.  
  80. // Referrer setzen
  81. if(isset($_SERVER['HTTP_REFERER']))
  82. $this->setReferer($_SERVER['HTTP_REFERER']);
  83. else
  84. $this->setReferer('');
  85. }
  86.  
  87. // Setters #######################################################
  88. /** Setzt den UserAgent anhand des Parameters $ua
  89. *
  90. * @access public
  91. * @param String ua UserAgent
  92. */
  93. public function setUserAgent($ua)
  94. {
  95. if($ua != '')
  96. {
  97. $this->ua = strtolower($ua);
  98. $this->browsername = '';
  99. $this->browserversion = '';
  100. $this->bot = '';
  101. $this->os = '';
  102. }
  103. }
  104.  
  105. /** Setzt die IP-Adresse anhand des Parameters $ip
  106. *
  107. * @access public
  108. * @param String ip IP-Adresse
  109. */
  110. public function setIP($ip)
  111. {
  112. if(strlen($ip) >= 4)
  113. {
  114. $this->ip = $ip;
  115. $this->provider = '';
  116. }
  117. }
  118.  
  119. /** Sucht den Provider aus einer Liste
  120. *
  121. * @access private
  122. */
  123. private function setProvider()
  124. {
  125. $host = strtolower(gethostbyaddr($this->ip)); // TODO gegen DNS-Schwierigkeiten absichern
  126.  
  127. // ################################################################
  128. // Liste von Providern (nur manuell)
  129. // ################################################################
  130. if($host != $this->ip)
  131. {
  132. if(strpos($host, 't-dialin') !== false || strpos($host, 't-ipconnect') !== false)
  133. $this->provider = 'T-Online';
  134. else if(strpos($host, 'telecomitalia') !== false)
  135. $this->provider = 'Telekom Italia';
  136. else if(strpos($host, 'highway.telekom.at') !== false)
  137. $this->provider = 'Telekom Austria';
  138. else if(strpos($host, 'einsundeins') !== false)
  139. $this->provider = '1 & 1';
  140. else if(strpos($host, 'versanet') !== false)
  141. $this->provider = 'Versatel';
  142. else if(strpos($host, 'arcor-ip') !== false)
  143. $this->provider = 'Arcor';
  144. else if(strpos($host, 'alicedsl') !== false)
  145. $this->provider = 'Alice';
  146. else if(strpos($host, 'aol.com') !== false)
  147. $this->provider = 'AOL';
  148. else if(strpos($host, 'eggenet') !== false)
  149. $this->provider = 'EggeNet';
  150. else if(strpos($host, 'pppool.de') !== false)
  151. $this->provider = 'Freenet Mobilcom';
  152. else if(strpos($host, 'augustakom.net') !== false || strpos($host, 'nefkom.net') !== false)
  153. $this->provider = 'M-net';
  154. else if(strpos($host, 'telemaxx.net') !== false)
  155. $this->provider = 'Telemaxx';
  156. else if(strpos($host, 'bluewin.ch') !== false)
  157. $this->provider = 'Swisscom';
  158. else if(stristr($host, 'telenet.be'))
  159. $this->provider = 'Telenet';
  160. else if(strpos($host, 'netcologne.de') !== false)
  161. $this->provider = 'Netcologne';
  162. else if(strpos($host, 'mediaWays.net') !== false)
  163. $this->provider = 'Telefonica';
  164. else if(strpos($host, 'ewetel.net') !== false)
  165. $this->provider = 'EWE Tel';
  166. else if(strpos($host, 'styrion.net') !== false)
  167. $this->provider = 'Styrion Internet';
  168. else if(strpos($host, 't-2.net') !== false)
  169. $this->provider = 'T-2';
  170. else if(strpos($host, 'blic.net') !== false)
  171. $this->provider = 'blicnet';
  172. else if(strpos($host, 'dbnet.dk') !== false)
  173. $this->provider = 'Dansc Breedband';
  174. else if(strpos($host, 'teleos-web.de') !== false)
  175. $this->provider = 'Teleos';
  176. else if(strpos($host, 't-mobile.at') !== false)
  177. $this->provider = 'T-Mobile';
  178. else if(strpos($host, 'a1.net') !== false)
  179. $this->provider = 'A1';
  180. else if(strpos($host, 'tele2.de') !== false || strpos($host, 'tele2.it') !== false)
  181. $this->provider = 'Tele 2';
  182. else if(strpos($host, 'gelsen.net') !== false)
  183. $this->provider = 'Gelsen-net';
  184. else if(strpos($host, 'casema.nl') !== false)
  185. $this->provider = 'Ziggo';
  186. else if(strpos($host, 'osnanet.de') !== false)
  187. $this->provider = 'Osnatel';
  188. else if(strpos($host, 'hispeed.ch') !== false)
  189. $this->provider = 'Cablecom';
  190. else if(strpos($host, 'stone-rich.at') !== false)
  191. $this->provider = 'Funk-Internet';
  192. else if(strpos($host, 'unitymedia') !== false || strpos($host, 'iesy.net') !== false || strpos($host, 'ish.de') !== false)
  193. $this->provider = 'Unitymedia';
  194. else if(strpos($host, 'qsc.de') !== false)
  195. $this->provider = 'QSC';
  196. else if(strpos($host, 'kabel-badenwuerttemberg.de') !== false)
  197. $this->provider = 'Kabel BW';
  198. else if(strpos($host, 'tpnet.pl') !== false)
  199. $this->provider = 'TP';
  200. else if(strpos($host, 'datazug.ch') !== false)
  201. $this->provider = 'Datazug';
  202. else if(strpos($host, 'skanova.com') !== false)
  203. $this->provider = 'Skanova';
  204. else if(strpos($host, '.msn.com') !== false)
  205. $this->provider = 'MSNBot';
  206. else if(strpos($host, 'net-htp.de') !== false)
  207. $this->provider = 'htp';
  208. else if(strpos($host, 'jazztel.es') !== false)
  209. $this->provider = 'JAZZTEL';
  210. else if(strpos($host, 'strato') !== false)
  211. $this->provider = 'Strato AG';
  212. else if(strpos($host, 'mediaways.net') !== false)
  213. $this->provider = 'Telefonica';
  214. else if(strpos($host, 'promserver.de') !== false)
  215. $this->provider = 'PromServer.de';
  216. else
  217. $this->provider = $host;
  218. }
  219. else
  220. $this->provider = '(?)';
  221. }
  222.  
  223. /** Ermittelt den Browser anhand einer Liste
  224. *
  225. * @access private
  226. */
  227. private function setBrowser()
  228. {
  229. // ################################################################
  230. // Verwendeten Browser oder Bot auslesen (manuell)
  231. // Siehe auch:
  232. // http://www.useragentstring.com/pages/useragentstring.php
  233. // http://de.wikipedia.org/wiki/Liste_von_Webbrowsern
  234. //
  235. // TODO nicht erkannte UA, (möglicherweise) falsch erkannte UA:
  236. // mozilla/4.61 [en] (x11; u; ) - browsex (2.0.0 windows)
  237. // mozilla/4.7 (compatible; offbyone; windows 2000) webster pro v3.4 --> Webster Pro Control Browser
  238. // Java/1.6.0_17 -> kann nicht sauber erkannt werden, da ein poaar Browser Java als angabe zur JRE mitnutzen, möglicherweise abfragen via IP-Range
  239. // ################################################################
  240.  
  241. // BOTS
  242. // Erkennung via UserAgent
  243. if(strpos($this->ua, 'bot') !== false)
  244. {
  245. if(strpos($this->ua, 'google') !== false)
  246. $this->bot = 'Google';
  247. else if(strpos($this->ua, 'msn') !== false)
  248. $this->bot = 'MSN';
  249. else if(strpos($this->ua, 'mlbot') !== false)
  250. $this->bot = 'MLBot';
  251. else if(strpos($this->ua, 'gigabot') !== false)
  252. $this->bot = 'Gigablast';
  253. else if(strpos($this->ua, 'seekbot') !== false)
  254. $this->bot = 'Seekport';
  255. else if(strpos($this->ua, '3gse') !== false)
  256. $this->bot = 'Internet Research Institute';
  257. else if(strpos($this->ua, 'cuil') !== false)
  258. $this->bot = 'Cuil.com';
  259. else if(strpos($this->ua, 'wikiwix') !== false)
  260. $this->bot = 'Wikiwix';
  261. else if(strpos($this->ua, 'exabot') !== false)
  262. $this->bot = 'Exalead';
  263. else if(strpos($this->ua, 'dotbot') !== false)
  264. $this->bot = 'DotBot';
  265. else if(strpos($this->ua, 'spbot') !== false)
  266. $this->bot = 'spbot';
  267. else if(strpos($this->ua, 'mj12bot') !== false)
  268. $this->bot = 'Majestic-12';
  269. else
  270. $this->bot = '(?) Bot';
  271. }
  272. else if(strpos($this->ua, 'crawl') !== false)
  273. {
  274. if(strpos($this->ua, 'msiecrawler') !== false)
  275. $this->bot = 'MS IE Crawler';
  276. else if(strpos($this->ua, 'webalta') !== false)
  277. $this->bot = 'WebAlta';
  278. else if(strpos($this->ua, 'dotnetdotcom.org') !== false)
  279. $this->bot = 'DotBot';
  280. else
  281. $this->bot = '(?) Bot';
  282. }
  283. else if(strpos($this->ua, 'yahoo') !== false
  284. || ($this->ua == 'mozilla/5.0 (x11; u; linux i686 (x86_64); en-us; rv:1.8.1.4) gecko/20080721 bonecho/2.0.0.4'
  285. && strpos($this->getProvider(), 'crawl.yahoo.net') !== false))
  286. $this->bot = 'Yahoo';
  287. else if(strpos($this->ua, 'ask jeeves') !== false)
  288. $this->bot = 'Ask Jeeves';
  289. else if(strpos($this->ua, 'ia_archiver') !== false)
  290. $this->bot = 'Waybackmachine';
  291. else if(strpos($this->ua, 'yandex') !== false)
  292. $this->bot = 'Yandex';
  293. else if(strpos($this->ua, 'scoutjet') !== false)
  294. $this->bot = 'ScoutJet';
  295. else if(strpos($this->ua, 'gonzo2') !== false)
  296. $this->bot = 'Suchen.de';
  297. else if(strpos($this->ua, 'robozilla') !== false)
  298. $this->bot = 'DMOZ Linkcheck';
  299. else if(strpos($this->ua, 'findlinks') !== false)
  300. $this->bot = 'NextLinks';
  301. else if(strpos($this->ua, 'browsershots') !== false)
  302. $this->bot = 'Browsershots';
  303. else if(strpos($this->ua, '008/') !== false)
  304. $this->bot = '80legs';
  305.  
  306. // Bot-Erkennung via Provider bzw IP-Ranges
  307. else if(($this->provider == '' && $this->setProvider() & false) | $this->provider == 'MSNBot')
  308. $this->bot = 'MSN'; // ^ Provider-Ermittlung ausführen ohne if-Logik zu stören
  309.  
  310. // Browsers
  311. else if(strpos($this->ua, 'opera') !== false)
  312. {
  313. if(strpos($this->ua, 'opera mini') !== false)
  314. {
  315. $this->browsername = 'Opera Mini';
  316. $this->browserversion = eregi('opera mini( |/)(([0-9]|\.)*)', $this->ua, $regs) ? $regs[2] : '(?)';
  317. }
  318. else
  319. {
  320. $this->browsername = 'Opera';
  321. $this->browserversion = eregi('opera( |/)(([0-9]|\.)*)', $this->ua, $regs) ? $regs[2] : '(?)';
  322. }
  323. }
  324. else if(strpos($this->ua, 'aol') !== false || strpos($this->ua, 'america online browser') !== false)
  325. {
  326. $this->browsername = 'AOL Webbrowser';
  327. if(eregi('aol (([0-9]|\.)*)', $this->ua, $regs) || eregi('america online browser (([0-9]|\.)*)', $this->ua, $regs))
  328. $this->browserversion = $regs[1];
  329. else
  330. $this->browserversion = '(?)';
  331. }
  332. else if(strpos($this->ua, 't-online') !== false)
  333. $this->browsername = 'T-Online Browser (IE-Engine)';
  334. else if(strpos($this->ua, 'crazy browser') !== false)
  335. $this->browsername = 'Crazy Browser (IE-Engine)';
  336. else if(strpos($this->ua, 'avant browser') !== false)
  337. $this->browsername = 'Avant Browser (IE-Engine)';
  338. else if(strpos($this->ua, 'netscape') !== false)
  339. {
  340. $this->browsername = 'Netscape Navigator';
  341. $this->browserversion = eregi('netscape/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  342. }
  343. else if(strpos($this->ua, 'msie') !== false)
  344. {
  345. if(strpos($this->ua, 'iemobile') !== false)
  346. {
  347. $this->browsername = 'Microsoft Mobile Internet Explorer';
  348. $this->browserversion = eregi('iemobile( |/)(([0-9]|\.)*)', $this->ua, $regs) ? $regs[2] : '(?)';
  349. }
  350. else
  351. {
  352. $this->browsername = 'Microsoft Internet Explorer';
  353. $this->browserversion = eregi('msie (([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  354. }
  355. }
  356. else if(strpos($this->ua, 'firefox') !== false)
  357. {
  358. $this->browsername = 'Mozilla Firefox';
  359. $this->browserversion = eregi('firefox/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  360. }
  361. else if(strpos($this->ua, 'seamonkey') !== false)
  362. {
  363. $this->browsername = 'Mozilla Seamonkey';
  364. $this->browserversion = eregi('seamonkey/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  365. }
  366. else if(strpos($this->ua, 'iceweasel') !== false)
  367. {
  368. $this->browsername = 'Debian Iceweasel';
  369. $this->browserversion = eregi('iceweasel/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  370. }
  371. else if(strpos($this->ua, 'epiphany') !== false)
  372. {
  373. $this->browsername = 'Epiphany';
  374. $this->browserversion = eregi('epiphany/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  375. }
  376. else if(strpos($this->ua, 'camino') !== false)
  377. {
  378. $this->browsername = 'Camino';
  379. $this->browserversion = eregi('camino/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  380. }
  381. else if(strpos($this->ua, 'galeon') !== false)
  382. {
  383. $this->browsername = 'Galeon';
  384. $this->browserversion = eregi('galeon/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1]: '(?)';
  385. }
  386. else if(strpos($this->ua, 'firebird') !== false)
  387. {
  388. $this->browsername = 'Firebird';
  389. $this->browserversion = eregi('firebird/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  390. }
  391. else if(strpos($this->ua, 'chrome') !== false)
  392. {
  393. $this->browsername = 'Google Chrome';
  394. $this->browserversion = eregi('chrome/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  395. }
  396. else if(strpos($this->ua, 'safari') !== false)
  397. {
  398. $this->browsername = 'Apple Safari';
  399. if(strpos($this->ua, 'iphone') !== false)
  400. $this->browsername = 'IPhone Mobile Safari';
  401.  
  402. if(eregi('version/(([0-9]|\.)*)', $this->ua, $regs))
  403. $this->browserversion = $regs[1];
  404. else if(eregi('safari/(([0-9]|\.)*)', $this->ua, $regs))
  405. $this->browserversion = '('.$regs[1].')';
  406. else
  407. $this->browserversion = '(?)';
  408. }
  409. else if(strpos($this->ua, 'konqueror') !== false)
  410. {
  411. $this->browsername = 'Konqueror';
  412. $this->browserversion = eregi('konqueror/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  413. }
  414. else if(strpos($this->ua, 'playstation portable') !== false)
  415. $this->browsername = 'Playstation Portable';
  416. else if(strpos($this->ua, 'k-meleon') !== false)
  417. {
  418. $this->browsername = 'K-Meleon';
  419. $this->browserversion = eregi('k-meleon( |/)(([0-9]|\.)*)', $this->ua, $regs) ? $regs[2] : '(?)';
  420. }
  421. else if(strpos($this->ua, 'phoenix') !== false)
  422. {
  423. $this->browsername = 'Phoenix (Firebird)';
  424. $this->browserversion = eregi('phoenix( |/)(([0-9]|\.)*)', $this->ua, $regs) ? $regs[2] : '(?)';
  425. }
  426. else if(strpos($this->ua, 'lynx') !== false)
  427. {
  428. $this->browsername = 'Lynx';
  429. $this->browserversion = eregi('lynx/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  430. }
  431. else if(strpos($this->ua, 'amaya') !== false)
  432. {
  433. $this->browsername = 'Amaya';
  434. $this->browserversion = eregi('amaya/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  435. }
  436. else if(strpos($this->ua, 'icab') !== false)
  437. {
  438. $this->browsername = 'iCab';
  439. $this->browserversion = eregi('icab (([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  440. }
  441. else if(strpos($this->ua, 'oregano') !== false)
  442. {
  443. $this->browsername = 'Oregano';
  444. $this->browserversion = eregi('oregano (([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  445. }
  446. else if(strpos($this->ua, 'elink/') !== false)
  447. $this->browsername = 'eLink';
  448. else if(strpos($this->ua, 'wget/') !== false)
  449. $this->browsername = 'wget';
  450. else if(strpos($this->ua, 'mozilla') !== false)
  451. {
  452. $this->browsername = 'Mozilla';
  453. $this->browserversion = eregi('mozilla/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  454. }
  455. else if(strpos($this->ua, 'dillo') !== false)
  456. {
  457. $this->browsername = 'Dillo';
  458. $this->browserversion = eregi('dillo/(([0-9]|\.)*)', $this->ua, $regs) ? $regs[1] : '(?)';
  459. }
  460. else
  461. $this->browsername = '(?)';
  462. }
  463.  
  464. /** Legt das Betriebssystem anhand einer Liste fest
  465. *
  466. * @access private
  467. */
  468. private function setOS()
  469. {
  470. // ################################################################
  471. // Verwendetes Betriebssystem auslesen (manuell)
  472. //
  473. // TODO
  474. // mozilla/2.0 (compatible; sis 1.2; iigs) --> Solaris???
  475. // ################################################################
  476. if(strpos($this->ua,'windows') !== false)
  477. {
  478. if(strpos($this->ua,'windows 3.11') !== false)
  479. $this->os = 'Microsoft Windows 3.11';
  480. else if(strpos($this->ua,'windows 95') !== false || strpos($this->ua, 'win95') !== false)
  481. $this->os = 'Microsoft Windows 95';
  482. else if(strpos($this->ua,'windows 98; win 9x') !== false || strpos($this->ua, 'windows me') !== false)
  483. $this->os = 'Microsoft Windows ME';
  484. else if(strpos($this->ua,'windows 98') !== false || strpos($this->ua, 'win98') !== false || strpos($this->ua, 'win 9x 4.90') !== false)
  485. $this->os = 'Microsoft Windows 98';
  486. else if(strpos($this->ua,'winnt4.0') !== false)
  487. $this->os = 'Microsoft Windows NT 4.0';
  488. else if(strpos($this->ua,'windows nt 5.0') !== false)
  489. $this->os = 'Microsoft Windows 2000';
  490. else if(strpos($this->ua,'windows nt 5.1') !== false || strpos($this->ua, 'windows xp') !== false)
  491. $this->os = 'Microsoft Windows XP';
  492. else if(strpos($this->ua,'windows nt 5.2') !== false)
  493. $this->os = 'Microsoft Windows Server 2003';
  494. else if(strpos($this->ua,'windows nt 6.0') !== false)
  495. $this->os = 'Microsoft Windows Vista';
  496. else if(strpos($this->ua, 'windows nt 6.1') !== false)
  497. $this->os = 'Microsoft Windows 7';
  498. else if(strpos($this->ua,'windows nt') !== false)
  499. $this->os = 'Microsoft Windows NT';
  500. else if(strpos($this->ua, 'windows ce') !== false)
  501. $this->os = 'Microsoft Windows CE';
  502. else
  503. $this->os = 'Microsoft Windows';
  504. }
  505. else if(strpos($this->ua,'linux') !== false)
  506. {
  507. if(strpos($this->ua,'ubuntu') !== false)
  508. $this->os = 'Ubuntu Linux';
  509. else if(strpos($this->ua,'debian') !== false)
  510. $this->os = 'Debian Linux';
  511. else if(strpos($this->ua,'redhat') !== false)
  512. $this->os = 'RedHat Linux';
  513. else if(strpos($this->ua,'suse') !== false)
  514. $this->os = 'SuSe Linux';
  515. else if(strpos($this->ua,'android') !== false)
  516. $this->os = 'Google Android';
  517. else
  518. $this->os = 'Linux';
  519. }
  520. else if(strpos($this->ua,'mac_powerpc') !== false)
  521. $this->os = 'Macintosh Power PC';
  522. else if(strpos($this->ua,'macintosh') !== false)
  523. $this->os = 'Macintosh';
  524. else if(strpos($this->ua,'beos') !== false)
  525. $os = 'BeOS';
  526. else if(strpos($this->ua,'sunos') !== false)
  527. $this->os = 'SUN OS';
  528. else if(strpos($this->ua,'freebsd') !== false)
  529. $this->os = 'FreeBSD';
  530. else if(strpos($this->ua,'irix') !== false)
  531. $this->os = 'IRIX';
  532. else if(strpos($this->ua,'os/2') !== false)
  533. $this->os = 'OS/2';
  534. else if(strpos($this->ua,'aix') !== false)
  535. $this->os = 'AIX';
  536. else if(strpos($this->ua,'risc os') !== false)
  537. $this->os = 'RISC OS';
  538. else if(strpos($this->ua,'iphone os') !== false)
  539. $this->os = 'IPhone OS';
  540. else if(strpos($this->ua,'nintendo wii') !== false)
  541. $this->os = 'Nintendo Wii';
  542. else
  543. $this->os = '(?)';
  544. }
  545.  
  546. /** Setzt den Referer anhand des übergebenen Parameters $ref
  547. *
  548. * @access public
  549. * @param String ref Referer
  550. */
  551. public function setReferer($ref)
  552. {
  553. $url = strtolower($ref);
  554. $urlarray = @parse_url($url);
  555.  
  556. if($urlarray !== false)
  557. $this->referer = $urlarray['host'];
  558. else
  559. $this->referer = '';
  560. }
  561.  
  562. /** Setzt die Sprache des Browsers auf einen String. Stringaufbau sollte der Regel nach z.B. so aussehen:
  563. *
  564. * de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
  565. *
  566. * @param String $lang String aus $_SERVER['HTTP_ACCEPT_LANGUAGE']
  567. * @access public
  568. * @since V4.9 - 22.01.2010
  569. *
  570. * @see http://aktuell.de.selfhtml.org/artikel/php/httpsprache/
  571. */
  572. public function setLanguage($language)
  573. {
  574. $this->lang_raw = $language;
  575. $this->lang_parts = array();
  576.  
  577. // Sprachen aufteilen
  578. $languages = preg_split('/,\s*/', $this->lang_raw);
  579.  
  580. // Nun alle mitgegebenen Sprachen abarbeiten
  581. foreach($languages as $language)
  582. {
  583. // Alle Infos über diese Sprache rausholen
  584. $res = preg_match ('/^(([a-z]{1,8})(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $language, $matches);
  585.  
  586. // war die Syntax gültig?
  587. if(!$res)
  588. continue; // Nein? Dann ignorieren
  589.  
  590. // Wurde eine Qualität mitgegeben?
  591. if(isset($matches[3]))
  592. $lang_quality = floatval($matches[3]); // die Qualität benutzen
  593. else
  594. $lang_quality = 1.0; // Qualität 1 annehmen
  595.  
  596. // Sprachen in Sprachenarray aufnehmen
  597. for($i = 0; $i <= count($this->lang_parts); $i++)
  598. {
  599. if(!isset($this->lang_parts[$i]))
  600. {
  601. $this->lang_parts[$i] = array('LANG' => $matches[2], 'QUALITY' => $lang_quality);
  602. break;
  603. }
  604. else if($lang_quality > $this->lang_parts[$i]['QUALITY'])
  605. {
  606. $temp = $this->lang_parts[$i];
  607. $this->lang_parts[$i] = array('LANG' => $matches[2], 'QUALITY' => $lang_quality);
  608. $this->lang_parts[$i+1] = $temp;
  609. unset($temp);
  610. break;
  611. }
  612. }
  613. }
  614. }
  615.  
  616.  
  617. // Getters ################################
  618. /** Liefert den UserAgent zurück
  619. *
  620. * @access public
  621. * @return String UserAgent
  622. */
  623. public function getUserAgent()
  624. {
  625. return $this->ua;
  626. }
  627.  
  628. /** Liefert die IP-Adresse zurück
  629. *
  630. * @access public
  631. * @return String IP-Adresse
  632. */
  633. public function getIP()
  634. {
  635. return $this->ip;
  636. }
  637.  
  638. /** Liefert den Provider zurück
  639. *
  640. * @access public
  641. * @return String Provider
  642. */
  643. public function getProvider()
  644. {
  645. if(!$this->provider && !$this->isBot())
  646. {
  647. $this->setProvider();
  648. }
  649. return $this->provider;
  650. }
  651.  
  652. /** Liefert nur den Browsernamen wieder, die Version wird nicht mitgeliefert
  653. *
  654. * @access public
  655. * @return String Browsername
  656. */
  657. public function getBrowserName()
  658. {
  659. if($this->browsername == '' && $this->bot == '' && $this->ua != '')
  660. {
  661. $this->setBrowser();
  662. }
  663. return $this->browsername;
  664. }
  665.  
  666. /** Liefert nur die Browserversion wieder, der Name des Browsers wird nicht mitgeliefert
  667. *
  668. * @access public
  669. * @return String Browserversion
  670. */
  671. public function getBrowserVersion()
  672. {
  673. if($this->browsername == '' && $this->bot == '' && $this->ua != '')
  674. {
  675. $this->setBrowser();
  676. }
  677. return $this->browserversion;
  678. }
  679.  
  680. /** Liefert den Browsernamen und die Version zusammengesetzt zurück
  681. *
  682. * @access public
  683. * @return String Browsername und -version
  684. */
  685. public function getBrowser()
  686. {
  687. $browsername = $this->getBrowsername();
  688. $browserversion = $this->getBrowserversion();
  689. return $browsername.($browserversion != '' ? ' '.$browserversion : '');
  690. }
  691.  
  692. /** Liefert den Namen des Bots zurück
  693. *
  694. * @access public
  695. * @return String Botname
  696. */
  697. public function getBot()
  698. {
  699. $this->isBot();
  700. return $this->bot;
  701. }
  702.  
  703. /** Liefert das Betriebssystem zurück
  704. *
  705. * @access public
  706. * @return String Betriebssystem
  707. */
  708. public function getOS()
  709. {
  710. if(!$this->os && $this->ua != '')
  711. {
  712. $this->setOS();
  713. }
  714. return $this->os;
  715. }
  716.  
  717. /** Liefert den Referer zurück
  718. *
  719. * @access public
  720. * @return String Referer
  721. */
  722. public function getReferer()
  723. {
  724. return $this->referer;
  725. }
  726.  
  727. /** Liefert die Sprache des Browsers wieder. Hierbei kann man über den Parameter $part festlegen, welche Sprache man haben möchte. Standardmäßig wird die bevorzugte
  728. * Sprache (1) wiedergegeben, möchte man die zweitwichtigste gibt man 2, drittwichtigste 3 etc mit. Ist der Parameter als die Gesamtzahl der angegebenen Sprache wird die letzte
  729. * zurück geliefert. Ist der Parameter <= 0 wird der unverarbeitete Language-String zurückgeliefert
  730. *
  731. * @access public
  732. * @since V4.9 - 22.01.2010
  733. */
  734. function getLanguage($part = 1)
  735. {
  736. if(strlen($this->lang_raw) == 0)
  737. $this->setLanguage($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  738.  
  739. if(intval($part) <= 0)
  740. return $this->lang_raw;
  741. else
  742. $part = intval($part) - 1;
  743.  
  744. if($part >= count($this->lang_parts))
  745. return $this->lang_parts[count($this->lang_parts) - 1]['LANG'];
  746. else
  747. return $this->lang_parts[$part]['LANG'];
  748. }
  749.  
  750. /** Liefert true oder false für die Bedingung, dass es sich bei dem UserAgent um einen Bot handelt.
  751. *
  752. * @access public
  753. * @return bool true wenn es sich um einen Bot handelt, false wenn der UserAgent nicht als Bot erkannt wurde.
  754. */
  755. public function isBot()
  756. {
  757. if($this->browsername == '' && $this->bot == '' && $this->ua != '')
  758. {
  759. $this->setBrowser();
  760. }
  761.  
  762. return strlen($this->bot) > 0;
  763. }
  764. }
  765. ?>

Bugs/ Feature-Wünsche

  • gethostbyaddr() absichern, da diese je nachdem wie schnell der Lookup ist das Script stark ausbremst. Hierzu evtl. auch eine Cachefunktion ermöglichen (benötigt schreibbares temp-Verzeichnis!!!)

  • setHost()-Funktion benötigt die IP anhand des Hosts zu ermitteln.

  • xml von User-Agents.org auswerten


Projekt Unterstützen

Sie möchten dieses quelloffene Projekt unterstützen? Sie möchten dabei helfen, schneller an weitere Erkenntnisse zu kommen? Dann setzten sie doch meine php-Klasse bei Ihnen ein und schicken mir einen SQL-Dump der Tabelle mit den UserAgents zu. Das ermöglicht es mir, neue mir bislang verborgen gebliebene UserAgents zu finden und damit die entwicklung voran zu treiben.

Bugs, Feature-Wünsche und sonstige Anregungen können Sie melden über das Kontaktformular. Darüber können Sie des Weiteren auch Fragen zum Sourcecode stellen.



Weiterführende Links / Referenzen




Lizenz

Creative Commons License
clsStats.php von Markus Buscher steht unter einer Creative Commons Namensnennung - Keine kommerzielle Nutzung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz