Er zijn geen regels voor User-Agent-strings, dus er is geen manier om een volledig correcte en toekomstbestendige parser te maken. Er is echter een algemeen patroon:
User-Agent: <engine-string> <engine-string> ...
Waar engine-string
heeft vorm:
<agent-name> (<comment>; <comment>; ...)
Elke engine-string (ik heb het zojuist zo genoemd, voor zover ik weet, is dat misschien niet correct) kan al dan niet opmerkingen bevatten.
Bijvoorbeeld:
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)
(Dit is een enkele string, ik heb het gewoon in regels verdeeld.) Het lijkt erop dat wanneer iemand een vork van een browser-engine doet, ze gewoon hun ding aan het einde toevoegen. We hebben dus een abstracte "Mozilla"-browser (een erfenis van de "First Browser War") die denkt dat hij op de iPhone staat. Dan zien we dat er een WebKit is (die zich herinnert dat hij lang geleden als KHTML werd geboren). Dan is er nog een versie/6.0-modificatie, die vervolgens werd gewijzigd in Mobile/10A5376e, wat Safari/8536.25 werd, wat uiteindelijk het geheim onthult dat het eigenlijk een mobiele Google-bot is.
Nog een voorbeeld:
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)
Dit is een enkele engine, maar er staat veel tussen haakjes.
Dus de algemene observatie is:
- laatste engine-strings zijn het belangrijkst,
- laatste opmerkingen in parenteses zijn minder belangrijk.
Met dat in gedachten, zou mijn idee zijn om de string in deze engine en commentaar-tokens te ontleden, en vervolgens van elke engine-sectie opmerkingen weg te gooien vanaf, laten we zeggen, de vijfde. Als het dan nog niet genoeg is, gooi dan de engine-secties weg vanaf de tweede (de eerste is vaak een abstracte "Mozilla", maar heeft vaak nuttige opmerkingen; soms is het ook echt iets concreets, vooral voor webcrawlers).
Bij het parseren moeten we er rekening mee houden dat er soms strings zijn die dit formaat niet volgen. Ze kunnen worden opgeslagen in een logbestand voor latere inspectie en vervolgens eenvoudig op de benodigde lengte worden gesneden om in de database te passen.