Lompat ke konten
dokumentasi.id
Commit bd74801
v2
Star10 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

9

Extensions: Bots, Crawlers, dan Lainnya

Modul ua-parser-js/extensions mengumpulkan sepuluh extension siap pakai: Bots, CLIs, Crawlers, ExtraDevices, Emails, Fetchers, InApps, Libraries, MediaPlayers, dan Vehicles. Setiap nama diekspor dengan tipe UAParserExt (src/extensions/ua-parser-extensions.d.ts:7-16), yaitu Partial<Record<UAParserProps, RegexMap>> atau array dari bentuk itu (src/main/ua-parser.d.ts:57-59). Sebuah extension hanyalah objek berisi daftar regex per properti browser, cpu, device, engine, atau os.

Extension diambil dari subpath ua-parser-js/extensions: require menunjuk ke ./src/extensions/ua-parser-extensions.js, import ke berkas .mjs, dan types ke .d.ts (package.json:226-230). Semua objek dibekukan dengan Object.freeze, misalnya MediaPlayers (src/extensions/ua-parser-extensions.js:400-446). Untuk menambah aturan, susun objek baru; jangan mengubah objek bawaan.

Sepuluh extension bawaan

ExtensionPropertiNilai type / kunci yang diisiRujukan
Botsbrowser, osgabungan CLIs, Fetchers, Crawlers, Librariessrc/extensions/ua-parser-extensions.js:493-503
CLIsbrowsercli untuk wget, curl, lynx, elinks, httpie, powershellsrc/extensions/ua-parser-extensions.js:42-47
Crawlersbrowsercrawler untuk Googlebot, Bingbot, ClaudeBot, Baiduspider, dan lainnyasrc/extensions/ua-parser-extensions.js:141-142
ExtraDevicesdevicetablet / mobile plus vendor dan model (Nook, Dell Streak, Le Pan, Gigaset, Vodafone)src/extensions/ua-parser-extensions.js:179-190
Emailsbrowseremail untuk Thunderbird, Outlook, Apple Mail, Zimbra, dan klien lainsrc/extensions/ua-parser-extensions.js:259-303
Fetchersbrowser, osfetcher untuk Twitterbot, Slackbot, WhatsApp, Google Docs, dan sejenisnyasrc/extensions/ua-parser-extensions.js:311-355
InAppsbrowserinapp untuk ChatGPT, Slack, Teams, Notion, Postman, VS Code, TikTok Litesrc/extensions/ua-parser-extensions.js:362-393
Librariesbrowserlibrary untuk axios, node-fetch, python-requests, Scrapy, GuzzleHttpsrc/extensions/ua-parser-extensions.js:452-463
MediaPlayersbrowsermediaplayer untuk VLC, Winamp, iTunes, QuickTime, GStreamersrc/extensions/ua-parser-extensions.js:400-446
Vehiclesdevicevendor (dan kadang model) untuk BMW, BYD, Jeep, Rivian, Volvosrc/extensions/ua-parser-extensions.js:470-486

Cara extend menggabungkan regex

extend(defaultRgx, extensions) membangun mergedRgx baru untuk setiap properti yang ada di defaultRgx (src/main/ua-parser.js:130-145). Aturannya ada pada satu baris: mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k] (src/main/ua-parser.js:142). Artinya daftar regex milik extension hanya dipakai bila panjangnya genap, dan selalu diletakkan di depan regex bawaan.

Karena berada di depan, regex extension diuji lebih dulu dan rgxMapper berhenti pada kecocokan pertama (src/main/ua-parser.js:218-236). Urutan ini yang membuat Crawlers bisa mengalahkan aturan browser bawaan untuk UA yang sama.

graph TD
    A["Sepuluh extension bawaan<br/>Bots · CLIs · Crawlers · ..."] --> B["UAParser(ua, exts)"]
    B --> C["useExtension(exts)"]
    C --> D["extend(defaultRgx, extensions)"]
    D --> E{"isExtensions: array?"}
    E -->|"array"| F["flatten: ext[i][j].concat(extraRgx[j])<br/>extension terakhir paling depan"]
    E -->|"objek"| G["dipakai langsung"]
    F --> H["mergedRgx[k] = ext[k].concat(defaultRgx[k])<br/>hanya jika panjang genap"]
    G --> H
    H --> I["regexMap: browser · cpu · device · engine · os"]
    I --> J["UAItem.parseUA → rgxMapper<br/>berhenti pada kecocokan pertama"]
    J --> K["browser.type: crawler · fetcher · inapp · ..."]
    style A fill:#f59e0b,color:#000
    style D fill:#f59e0b,color:#000
    style H fill:#f59e0b,color:#000
    style I fill:#8b5cf6,color:#fff
    style K fill:#2d7d46,color:#fff
%% fig: Jalur merge extension ke regexMap
%% desc: Extension digabung ke regexMap oleh extend, regex extension ditempatkan di depan regex bawaan, lalu dipakai rgxMapper saat parse.
Fig. 1: Jalur merge extension ke regexMapExtension digabung ke regexMap oleh extend, regex extension ditempatkan di depan regex bawaan, lalu dipakai rgxMapper saat parse.

Bentuk masukan menentukan cara merge. isExtensions menganggap sebuah objek sebagai satu extension bila properti pertamanya bernama browser, cpu, device, engine, atau os (src/main/ua-parser.js:162-166). Jika tidak — misalnya array extension — extend meratakan tiap properti dengan concat, sehingga extension yang berada paling akhir dalam array menempati posisi paling depan (src/main/ua-parser.js:133-140).

useExtension menjalankan merge ini lalu mengembalikan this, jadi pemanggilannya bisa dirantai (src/main/ua-parser.js:1505-1511). Constructor sudah memanggilnya dengan argumen extensions, dan overload menerima (uastring, extensions, headers) atau (extensions, headers) (src/main/ua-parser.d.ts:100-113).

⚠️ Daftar regex dengan panjang ganjil tidak memunculkan error: extend diam-diam memakai defaultRgx[k] (src/main/ua-parser.js:142). Selalu kirim pasangan [regexes, props] secara lengkap, kalau tidak extension untuk properti itu tidak berefek sama sekali. Karena posisinya di depan, regex kustom juga bisa mengalahkan deteksi bawaan untuk UA yang sama.

Bots: gabungan empat extension

Bots tidak menambahkan regex baru. Definisinya hanya menyebar (...) daftar browser milik CLIs, Fetchers, Crawlers, dan Libraries, lalu menyalin os dari Fetchers (src/extensions/ua-parser-extensions.js:493-503). Karena itu Bots mengisi browser.type dengan cli, fetcher, crawler, atau library (src/extensions/ua-parser-extensions.js:10-23).

graph TD
    Bots["Bots"] --> CLIs["CLIs<br/>type: cli"]
    Bots --> Crawlers["Crawlers<br/>type: crawler"]
    Bots --> Fetchers["Fetchers<br/>type: fetcher"]
    Bots --> Libraries["Libraries<br/>type: library"]
    Fetchers --> Os["Bots.os ← Fetchers.os"]
    style Bots fill:#f59e0b,color:#000
    style Os fill:#2d7d46,color:#fff
%% fig: Komposisi objek Bots
%% desc: Bots menyebar empat daftar browser milik CLIs, Crawlers, Fetchers, dan Libraries, serta mewarisi daftar os dari Fetchers.
Fig. 2: Komposisi objek BotsBots menyebar empat daftar browser milik CLIs, Crawlers, Fetchers, dan Libraries, serta mewarisi daftar os dari Fetchers.

Bots tidak memuat Emails, InApps, MediaPlayers, ExtraDevices, maupun Vehicles (src/extensions/ua-parser-extensions.js:493-503). Untuk cakupan seluas itu, gabungkan sendiri lewat array UAParserExt. Modul bot-detection memakai Bots, Crawlers, dan Fetchers dari berkas ini (src/bot-detection/bot-detection.js:11-30); pembahasannya ada di Submodule bot-detection, browser-detection, dan device-detection.

Menyusun UAParserExt kustom

Aturan yang berlaku untuk extension buatan sendiri:

const { UAParser } = require('ua-parser-js');

// satu properti, pasangan [regexes, props] dengan panjang genap
const MyDevices = {
    device : [
        [/(acme) (tab[\w]+)/i], ['vendor', 'model', ['type', 'tablet']]
    ]
};

const parser = new UAParser('Mozilla/5.0 (Linux) Acme TabX10', MyDevices);
parser.getDevice();                        // vendor/model/type dari properti yang dideklarasikan
parser.useExtension(MyDevices);            // bisa ditambahkan setelah konstruksi

Properti hasil diisi berurutan dari grup tangkapan regex: pasangan [nama, nilai] menulis nilai tetap, sedangkan [nama, fungsi] menulis hasil fungsi tersebut (src/main/ua-parser.js:238-250). Nilai type yang dipakai kesepuluh extension di atas sama dengan BrowserType pada modul enums (src/enums/ua-parser-enums.js:186-194), dan rinciannya ada di Enums dan Konstanta Deteksi. Mekanisme rgxMapper sendiri dibahas di Pipeline Deteksi Regex dan String Map.