Det finns inga regler för User-Agent-strängar, så det finns inget sätt att skapa en helt korrekt och framtidssäker parser. Det finns dock ett allmänt mönster:
User-Agent: <engine-string> <engine-string> ...
Där engine-string
har formen:
<agent-name> (<comment>; <comment>; ...)
Varje motorsträng (jag kallade det precis så av min uppfattning, som kanske inte är korrekt) kan ha kommentarer eller inte.
Till exempel:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(Detta är en enda sträng, jag bröt bara upp den i rader.) Det verkar som om någon gör en gaffel av en webbläsarmotor, de bara lägger till sin sak till slutet. Så vi har en abstrakt "Mozilla"-webbläsare (ett arv från "Första webbläsarkriget") som tror att den finns på iPhone. Sedan ser vi att det finns ett WebKit (som kommer ihåg att det föddes som KHTML för länge sedan). Sedan finns det någon version/6.0-modifiering, som sedan modifierades till Mobile/10A5376e, som blev Safari/8536.25, som slutligen avslöjar hemligheten att det faktiskt är en mobil Google-bot.
Ett annat exempel:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
Det här är en enda motor, men den har mycket att säga inom parentes.
Så den allmänna observationen är:
- sista motorsträngar är viktigast,
- sista kommentarer i parenteser är mindre viktiga.
Med det i åtanke skulle min idé vara att tolka strängen i dessa motor- och kommentarssymboler, och sedan kasta bort kommentarer från varje motorsektion från t.ex. den femte. Sedan, om det fortfarande inte räcker, kasta motorsektioner med början från den andra (den första är ofta en abstrakt "Mozilla", men har ofta användbara kommentarer; ibland är det faktiskt något konkret, särskilt för webbsökare).
När vi analyserar måste vi ta hänsyn till att det ibland kan finnas strängar som inte följer detta format. De kan sparas i en loggfil för senare inspektion och sedan helt enkelt klippas till den längd som behövs för att passa till databasen.