UserAgentは何を食べますか?



msdn_ua



そもそも、この「ユーザーエージェント」が食べられる理由を説明する価値がありました。 まあ、または、一般的に、これはどのようなエージェントから始まるのですか。 (ちなみに、この用語のスラブ語-正統語の翻訳は誰も知りませんか?)しかし、ユーザーが既にuseragentを知って使用している、または彼がそれを必要としないと仮定して、 序文に留まりたくないでしょう。 そして、私のアドバイスは、正規表現でuseragentを使用することです!







もちろん、%username%という表現を定期的に使用する傾向がありますが、それらは魂にとっては異なります。私は正規表現について話しています。 私の仕事の主なタスクの1つは、デバイスとエンドユーザーのブラウザーの機能を正しく判断することです。 私たちはモバイルデバイス(携帯電話)に焦点を当てているので、それらを例として取り上げます。 通常のコンピューターユーザーとは異なり、モバイルデバイスユーザーは、画面解像度、ブラウザー機能などが厳しく制限されています。 UAProfWurflを使用して小さなデータベースをコンパイルし、自動的に更新します。 しかし、useragentヘッダーは絶えず変化しており、差異の数は絶えず増大しています。 エージェントを1対1でチェックして次のデバイスを検索する方法については問題ではありませんが、同じものを探す方法については説明しません。 そのため、ユーザーエージェントデバイスと、そこから何を絞り出すことができるかを理解し始めました。



成分



標準と形式-通常どおり、誰も従わない。 useragent の形式は、メーカーごと、シリーズごとに異なります。 さらに、ほとんどの携帯電話会社は見出しを書き直すことを好みます。

主なブロックは次のとおりです。

デバイス/バージョンブラウザ/バージョン(サポートされている標準と技術)。

msdn_ua

最初の例、 sonyericssonk530i / r6bc browser / netfront / 3.3 profile / midp-2.0 configuration / cldc-1.1は 、そのままではブラケットが期待できないことを示し、2番目の例はmozilla / 5.0(symbianos / 9.4; u; series60 / 5.0 nokia5800d- 1 / 21.0.025;プロファイル/ midp-2.1構成/ cldc-1.1)applewebkit / 413(khtml、geckoのような)safari / 413は 、だれも順序を維持しないことを穏やかに示唆しています。 それでも、同じデバイスに異なるエージェントが表示されることを知ることは重要です。たとえば、nokia n95:





レシピ



ただし、ご覧のとおり、いくつかのロジックがあります。 スラッシュ(/)の後にはバージョンがあります-動的な部分で、特別な役割は果たしません。 必ずブラウザを指定してください。 スペースおよび/またはセミコロンでトークンを分離します。 ログをひねると、エージェントのヘッダーに大量のゴミが見つかりました。そのため、標準化とセグメンテーションが最初のステップでした。 便利なものは次のとおりです。

  1. 実際にユーザーエージェントを選択します: ([[(]?[a-z0-9._+;]\s?[/\-;:\\,*\s]*[)\]]?\s?)*



  2. ブラウザトークンを決定します: ((iemobile|kbrowser)\s[0-9.]+)|((up(\.link)?|netfront|obigo|opera\s?(mini|mobile)?|deckit|safari|(apple)?webkit|mozilla|openwave)/[0-9\.az\-]+\+?)|(browser/[az\-0-9]+/?[0-9\.az\-]+)|([az\.-]+browser[az\.-]*(/[0-9\.az\-]+)?)



  3. プロファイルと構成を定義します: (((profile|configuration|java(platform)?)/[az]+-?)|((cldc|midp|wap)[\s\-]?))[0-9\.-az]+



  4. 言語: ((?<=[\s;\[\(])[az]{2}[\s-][az]{2}(?=[\s;\]\)]))|\[([az]{2,3}[\-_\s]?)+\]



  5. バージョン: [\s;/]+(v(er)?[\s.]*)?[0-9]+\.[0-9\.]+([az]{1,2}[0-9\.]*)?



  6. 画面サイズをピクセル単位で示す場合があります: [0-9]{3}x[0-9]{3}





当然、100パーセントの結果は機能しませんでしたが、30,000のユーザーエージェントを実行すると、正しいセグメントが97%で強調表示されたことがわかりました。 結果はかなりまともです。 しかし、これは私たちにとって十分ではありませんでした。 データベースに対してチェックする必要のあるものがあり、同じスキャッターとさまざまなモデルとエージェントがあります。 モデルによる検索-シンプルで直感的なアイデアがありました。 つまり、同じ第95ノキアには多数の異なるユーザーエージェントが存在するにもかかわらず、各バージョンにはnokian95が存在します。 同じモデルを決定/検索するだけでよい場合は、タスクは簡単になります(iPhoneを認識するかどうかを判断しましょう)。 ただし、if-elseで十分です。 人生のすべてはより複雑であり、モデルを定義するための普遍的な標準はありません。



デザート



私たちは反対から行きました-定義することを学んだトークンからユーザーエージェントをクリーンアップします。

同じ表現を(わずかな変更を加えて)使用して、 while useragent ismatch replace match with string.empty



からブロックを次々に消去します( while useragent ismatch replace match with string.empty



、擬似コード)。 事前に私には知られていない残りの部分が判明しました。一部はゴミであり、一部はモデルです。 最も簡単な解決策は、残りを個別のトークンに分割することでした- Split(' ', '/', ';')



およびメーカーでトークンを検索します。 次の行のいずれかが含まれている部分を探しています。



"nokia", "motorola", "mot-", "moto-", "motorazr", "sonyericsson", "samsung", "sec-", "sgh-", "lg-", "lge", "lg", "sie-", "siemens","ipod", "iphone" ,"ipaq", "spv", "i-mate", "mobilephone", "htc", "vodafone", "palm", "rover", "gigabyte", "asus", "alcatel", "mitsu", "verizon", "apple".









上記の異なる長いユーザーエージェントn95から、それぞれnokian95とnokian95_8gbのみがあります。 以下に、完全なユーザーエージェントとクリーンアップ結果の例をいくつか示します。





道路上



ブラウザに加えて、WAPトークン(簡単に言うとWAP 1.0 = WML、WAP 2.0 = XHTML)に興味があるかもしれません。 mmp(マルチメディアモバイルプロセッサ)のバージョンは、オーディオ/ビデオコーデックのサポートを示す必要があります-1.0のみオーディオmp3、2.0は3gpビデオをサポートします。 ほとんどのユーザーエージェントでは、指定されたオペレーティングシステムとバージョンがiPhoneに関連しています: ip(hone|od).*?os\s*(v(er(sion)?)?)?[\s.]*([0-9._]+|[az]+)







糖菓



データベースの検証と微調整により、結果の99%が得られました。 これはもちろん過剰適合ですが、それは目標の1つでした(特定の対象者と地域での最大精度)。 ところで、上記の正規表現はより抽象的であり、その汎用性のために大きなエラーを与えるはずです。




All Articles