— sekitar 6 menit membaca

Lume: Memblokir bot crawler AI

Saya membuat middleware untuk memblock akses bot crawler AI di blog ini.

Apa itu web crawler? #

Saya pikir sebagain besar orang sudah paham apa itu Web Crawler, secara garis besar Web Crawler adalah semacam bot/robot yang bertugas untuk melakukan penelusuran dan pengumpulan data. Bot yang paling populer tentu yang dimiliki oleh perusahaan penyedia layanan search engine seperti Google (begitulah cara google melakukan pengindexan).

Sedangkan bot crawler AI adalah Web Crawler yang dibuat oleh perusahaan atau entitas yang mengembangkan AI. Fungsi botnya sama dengan bot Google melakuan penelusuran (pencurian?) data untuk memperkaya atau memperbesar basis data untuk melatih model AInya.

lebih lengkap bisa baca artikel Open AI Luncurkan GPTBot Sebagai Web Crawler ini.

Banyak penentangan #

Alih - alih disambut dengan suka cita, banyak pihak yang justru keberatan dengan adanya bot crawler AI ini, bahkan pihak seperti Google pun juga keberatan1.

Sedangkan pihak - pihak lain adalah para content creator, blogger, peneliti, dan sebagainya yang khawatir artikel yang mereka tulis menjadi basis data untuk AI. Dari penentang ini kemudian muncullah layanan seperti DarkVisitor yang bertugas untuk melakukan tracking/stat atas aktifitas scrapping yang dilakukan oleh bot crawler AI di sebuah halaman situs.

Mengontrol bot crawler #

Dengan robots.txt #

Sejak pertama diluncurkan pada tahun 1994 dan kemudian menjadi standar pada 2022 file robots.txt sudah menjadi semacam state of the art untuk melakukan pengontrolan terhadap bot crawler.

Fungsinya adalah untuk menentukan bot yang mana yang boleh mengakses sebuah halaman tertentu atau spesifik. Contoh bentuk syntax dari robots.txt adalah sebagai berikut

User-agent: *
Allow: /

User-agent: Applebot-Extended
Disallow: /

Syntax User-agent berfungsi untuk menentukan jenis user agent dari bot atau browser. Tanda * berarti semua user agent dan syntax Allow berarti mengijinkan akses. Sedang / adalah direktori root. Artinya semua user agent diijinkan untuk mengakses root directory dari sebuah websites.

Sebaliknya, jika User-agent berisi nama dari bot (dalam hal ini Applebot-Extended) maka robots.txt melarang/Disallow akses.

Secara etika, seharusnya semua bot mematuhi aturan yang sudah ditetapkan dalam file robots.txt namun dalam kenyataanya tidak. Banyak bot nakal yang justru membaca file robots.txt untuk menemukan direktori mana yang dilarang untuk diakses dan kemudian malah mengaksesnya.

Kenapa file robots.txt tidak bisa memblokir akses secara paksa?

File robots.txt hanyalah sebuah himbauan bagi bot untuk crawler dan himbauan artinya tidak harus dipatuhikan? Sehingga membuat file robots.txt pun kadang tidak cukup untuk mengontrol atau menghentikan bot.

Dengan .htaccess #

Matthew Graybosch membuat sebuah artikel yang lengkap untuk menunjukkan cara memblok akses bot crawler AI melalui file .htaccess.

Cara ini hanya berlaku jika mempergunakan web server Apache saja. Skemanya adalah .htaccess memeriksa user agent yang masuk, jika sama dengan daftar user agent yang dibanned maka akses tersebut akan diarahkan ke http status 403: Forbidden.

Untuk daftar user agent yang dibanned diambil dari DarkVisitor.

Dengan nginx.conf #

Untuk pengguna web server nginx, Robb Knight membuat artikel yang menarik tentang cara untuk mengatur nginx.conf agar bisa mengenali dan memblokir user agent. Caranya diterapkan di Eleventy.

Deno Deploy dan Lume #

Bagi pengguna Lume yang reponya dideploy ke Deno Deploy, maka cara .htaccess dan nginx.conf tidak lagi bisa dipakai. Saya tidak tahu backend dari Deno tapi yang pasti tidak ada peluang untuk mengutak atik file .htaccess maupun nginx.conf, jadi harus mencari cara lain untuk melakukan pemblokiran.

Lume adalah static site generator yang saat dideploy ke Deno akan menyertakan sebuah web server sederhana untuk menampilkan static file (dalam HTML). Maka dengan melakukan by pass dan pengecekan di web server ini bisa dipergunakan untuk memblokir bot AI.

Untungnya Lume mendukung middlewares yang bisa dipakai untuk mengkustomisasi/menangani request dan response pada Deno HTTP Server.

Jadi saya membuat sebuah middleware sederhana untuk memeriksa user agent dari pengunjung dan jika sesuai dengan daftar yang dibanned maka tinggal dialihkan ke halaman tertentu dengan http status 403.

Kodenya sebagai berikut:

import type { Middleware } from "lume/core/server.ts";

export default function noRobotAI(): Middleware {
  return async (request, next) => {
    const response = await next(request);
    const { headers } = request;
    const banUA = [
      "AdsBot-Google",
      "Amazonbot",
      "anthropic-ai",
      "Applebot",
      "Applebot-Extended",
      "AwarioRssBot",
      "AwarioSmartBot",
      "Bytespider",
      "CCBot",
      "ChatGPT-User",
      "ClaudeBot",
      "Claude-Web",
      "cohere-ai",
      "DataForSeoBot",
      "Diffbot",
      "FacebookBot",
      "FriendlyCrawler",
      "Google-Extended",
      "GoogleOther",
      "GPTBot",
      "img2dataset",
      "ImagesiftBot",
      "magpie-crawler",
      "Meltwater",
      "omgili",
      "omgilibot",
      "peer39_crawler",
      "peer39_crawler/1.0",
      "PerplexityBot",
      "PiplBot",
      "scoop.it",
      "Seekr",
      "YouBot",
    ];
    const getUA = headers.get("user-agent") ?? "";
    const cekUA = banUA.includes(getUA);

    if (cekUA === true) {
      return new Response(
        `<!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>404 - Not found</title>
          <style> body { font-family: sans-serif; max-width: 40em; margin: auto; padding: 2em; line-height: 1.5; }</style>
        </head>
        <body>
          <h1>403 - Forbidden</h1>
        </body></html`,
        {
          status: 403,
          headers: { "Content-type": "text/html" },
        },
      );
    }
    return response;
  };
}

Kemudian simpan2 dan middleware ini bisa dipanggil di dalam file server.ts seperti ini

import Server from "lume/core/server.ts";

import noRobotAI from "./_middlewares/no_robotAI.ts";

const s = new Server({
  port: 8080,
  root: `${Deno.cwd()}/_site`,
});

s.use(noRobotAI());
s.start();

untuk mencoba bisa dengan cara menjalankan file server.ts

$ deno run -A server.ts
Lume is listening on port: 8080

Apa perbedaan antara pakai deno task dan deno run untuk serving Lume?

deno task lume atau lume -s berfungsi untuk membuild lume dan menampilkan secara live dengan web server bawaan lume. Sangat cocok dipakai di lokal.

Karena tujuannya untuk pemakaian di lokal, maka semua perubahan yang terjadi di file server.ts tidak akan berpengaruh.

Sedangkan deno run -A server.ts digunakan untuk mengemulasi jika nanti sudah dideploy ke Deno, karena file server.ts inilah yang akan dipakai sebagai web server

Kelemahannya, karena memang dipergunakan untuk serve static files, maka semua perubahan yang terjadi di dalam folder _src tidak akan berpengaruh atau ditampilkan. Mudahnya tidak ada fitur live reloading seperti di deno task lume -s.

dan buka browser di alamat http://localhost:8080, kemudian buka web inspector dan klik pada tanda titik 3 di sebelah kanan atas. Pilih More tools dan kemudian klik pada Network Conditions.

Pada pilihan checklist User agent, buang centang supaya tidak memakai user agent dari browser. Kemudian pilih user agent custom dan isi dengan misalnya “Bytespider” (tanpa tanda “”).

Set User agent di Firefox

Untuk firefox agak sedikit rumit caranya,

  1. Buka tab baru dan ketik about:config, biasanya ada warning tapi klik saja di Accept Risk,
  2. kemudian ketik di pencarian, general.useragent.override, kemudian pilih string dan klik tanda +,
  3. kemudian isi dengan nama bot misalnya CCBot dan simpan dengan klik tanda centang,
  4. sekarang firefox memakai user agent CCBot secara global dan bisa dipakai untuk test. Untuk mengembalikan tinggal hapus general.useragent.override tadi

Setelah itu reload halaman dan seharusnya akan muncul pesan 403 Forbidden.

Penutup #

Melakukan pemblokiran terhadap bot crawler AI kembali kepada pilihan masing - masing pemilik situs. Jika mementingkan SEO dan ingin berbagi untuk kemajuan teknologi AI maka mengijinkan bot crawler AI untuk scrapping data adalah pilihan yang bijaksana.

Saya sendiri sebenarnya tidak terlalu membutuhkan untuk blok bot crawler AI ini, karena menurut pengamatan dari DarkVisitor situs saya ini tidak terlalu menarik bagi bot crawler AI untuk diambil datanya. Mungkin karena situs ditulis dalam bahasa Indonesia, entahlah.

  1. https://starbreaker.org/blog/tech/robots-txt-nuclear-option/index.html
  2. https://rknight.me/blog/blocking-bots-with-nginx/
  3. https://manuelmoreale.com/
  4. https://ethanmarcotte.com/wrote/blockin-bots/
  5. https://www.cyberciti.biz/web-developer/block-openai-bard-bing-ai-crawler-bots-using-robots-txt-file/


Artikel terkait #lume

Lume: Memblokir bot crawler AI

Saya membuat middleware untuk memblock akses bot crawler AI di blog ini.


kembali ke atas