Geonode logo
Geonode Team

Geonode Team

Diperbarui: 7 Oktober 2026

Diterbitkan: 2 September 2026

Cara Mengatur User-Agent Kustom dengan curl (+Contoh)

`curl -A "MyBot/1.0" https://example.com` menetapkan header User-Agent. Itulah sintaksnya, dan pertanyaan yang menarik adalah apa yang harus dimasukkan ke dalamnya. Jawaban yang muncul secara naluriah — menyalin string dari Chrome — seringkali salah, karena hal itu menimbulkan kontradiksi antara identitas yang Anda klaim dan identitas koneksi Anda yang sebenarnya. Panduan ini membahas sintaksnya, kasus penghapusan, dan strategi yang lebih berguna untuk mengidentifikasi diri Anda secara jujur.

Inti permasalahan kami, secara sederhana: kami adalah Geonode dan kami menjual proxy, dan pertanyaan seputar user-agent biasanya muncul bersamaan dengan pertanyaan "mengapa saya diblokir". Jawaban jujurnya adalah bahwa user agent merupakan salah satu sinyal terlemah yang tersedia, dan string browser pada permintaan yang sidik jari TLS-nya menunjukkan hal lain justru lebih buruk daripada tidak menyamar sama sekali — Anda telah menciptakan ketidakkonsistenan yang tidak pernah dihasilkan oleh browser asli. Ada bagian mengenai hal itu di bawah ini. Strategi yang lebih sering berhasil daripada yang diperkirakan orang justru sebaliknya: sebutkan identitas Anda, berikan URL kontak, dan bertindaklah secara wajar. Otomatisasi anonim jauh lebih mudah diblokir daripada otomatisasi yang teridentifikasi, dan mengidentifikasi diri Anda tidak memerlukan biaya apa pun.

Sintaks

curl -A "MyBot/1.0" https://example.com

Panduan curl menjelaskan -A, --user-agent <name>

: "Tentukan string User-Agent yang akan dikirim ke server HTTP. Untuk mengenkode spasi dalam string, kelilingi string tersebut dengan tanda kutip tunggal atau ganda."

Pengaturan default juga disebutkan: "Secara default, curl menggunakan curl/VERSION

, seperti User-Agent: curl/8.22.0

."

Jadi, tanpa opsi apa pun, setiap permintaan yang Anda buat akan mengidentifikasi dirinya sebagai curl beserta versinya. Beberapa server merespons secara berbeda berdasarkan hal tersebut, yang perlu diketahui sebelum Anda menyimpulkan bahwa suatu situs bermasalah.

Ekuivalennya dengan menggunakan header generik:

curl -H "User-Agent: MyBot/1.0" https://example.com

Keduanya menghasilkan hasil yang sama — panduan manual menyebutkan bahwa header tersebut "juga dapat diatur dengan opsi --header

atau --proxy-header

". -A

lebih singkat; -H

konsisten dengan cara Anda mengatur header lainnya, yang penting jika Anda membuat perintah secara terprogram.

Jika Anda menentukannya beberapa kali, "nilai yang terakhir ditetapkanlah yang digunakan".

Menghapus Header Sepenuhnya

Sebuah kasus yang tidak banyak diketahui orang, dan buku panduan secara spesifik menjelaskan perbedaannya:

Jika Anda memberikan argumen kosong ke --user-agent (""), hal ini akan menghapus header sepenuhnya dari permintaan. Jika Anda lebih memilih header kosong, Anda dapat mengaturnya menjadi satu spasi (" ").

curl -A "" https://example.com          # no User-Agent header at all
curl -A " " https://example.com         # User-Agent: (empty value)

Ini adalah permintaan yang benar-benar berbeda. Tidak mengirimkan header sama sekali tidak sama dengan mengirimkan header kosong, dan server dapat membedakannya.

Keduanya tidak lazim, dan ketidaklaziman itu sendiri merupakan sinyal. Permintaan tanpa user agent sama sekali lebih jarang daripada yang mengidentifikasi diri sebagai curl, sehingga menghapus header agar tampak kurang mencolok umumnya justru menghasilkan efek sebaliknya.

Mekanisme yang sama berlaku melalui -H, dan manual menjelaskan sintaksis untuk kedua kasus tersebut: "Hapus header internal dengan memberikan pengganti tanpa isi di sebelah kanan tanda titik dua, seperti: -H "Host:"", sedangkan header dengan nilai kosong memerlukan tanda titik koma — -H "X-Custom-Header;" mengirimkan X-Custom-Header:.

Mengapa Pengaturan Default Penting

curl/8.22.0 adalah string yang sepenuhnya jujur, dan hal ini memiliki konsekuensi.

Beberapa server langsung memblokirnya. Aturan umum yang melarang alat otomatisasi yang sudah dikenal mudah dibuat dan cukup umum sehingga Anda pasti akan menemukannya.

Beberapa server menampilkan konten yang berbeda. Markup yang disederhanakan, tanpa bagian yang bergantung pada JavaScript, dan terkadang halaman yang sama sekali berbeda.

Beberapa server mencatatnya dan tidak melakukan apa-apa. Ini adalah kasus yang paling umum.

Beberapa CDN menganggapnya sebagai salah satu dari banyak sinyal, bukan sebagai keputusan tersendiri.

Konsekuensi praktisnya adalah bahwa "ini berfungsi di browser saya tetapi tidak di curl" memiliki beberapa kemungkinan penyebab, dan user agent hanyalah salah satunya. Sebelum mengubahnya, periksa apakah perbedaannya memang disebabkan oleh JavaScript — curl tidak menjalankannya, sehingga halaman yang dirakit di sisi klien akan terlihat hampir kosong bagi curl terlepas dari header apa pun yang Anda kirim. Itu bukanlah masalah yang menghalangi dan tidak ada agen pengguna yang dapat memperbaikinya.

Mengapa Meniru Browser Seringkali Berbalik Merugikan

Bagian yang patut dibaca sebelum Anda menyalin string Chrome.

User agent adalah sebuah klaim. Sistem anti-bot modern memverifikasi klaim tersebut berdasarkan bukti, dan bukti tersebut sangat banyak:

Sidik jari TLS. Cara klien menegosiasikan TLS — urutan rangkaian cipher, ekstensi, grup yang didukung — menghasilkan tanda tangan yang umumnya diringkas sebagai JA3 atau JA4. Sidik jari curl berbeda dengan Chrome, dan tidak ada header yang dapat mengubahnya. Permintaan yang mengaku sebagai Chrome dengan jabat tangan TLS milik curl lebih mudah dikenali daripada permintaan yang secara jujur mengaku sebagai curl, karena Chrome asli tidak pernah menghasilkan kombinasi tersebut.

Kumpulan header dan urutannya. Browser mengirimkan kumpulan header yang khas dalam urutan yang khas — Accept, Accept-Language, Accept-Encoding, Sec-Fetch-*, dan lainnya. curl hanya mengirimkan tiga atau empat. Mengklaim sebagai Chrome sambil mengirimkan kumpulan header curl merupakan kontradiksi yang jelas.

Versi dan perilaku HTTP. Rincian penggunaan ulang koneksi, multiplexing, dan kompresi header.

Perilaku. Browser sungguhan mengambil CSS, gambar, dan skrip. Klien yang hanya mengambil satu dokumen HTML dan tidak ada yang lain tidak terlihat seperti browser, terlepas dari apa yang dikatakannya.

Jadi, hierarki yang jujur adalah: user agent yang akurat bersifat konsisten dan tidak mencolok; yang dipalsukan bersifat tidak konsisten dan mencolok. Jika Anda benar-benar membutuhkan permintaan yang menyerupai browser, Anda membutuhkan browser — Playwright atau alat serupa — bukan sekadar header. Kami telah membahas pertimbangan terkait dalam mengambil tangkapan layar dengan Playwright.

Ada jalan tengah yang sah dan terbatas: menguji penanganan user-agent situs Anda sendiri, atau mengambil konten yang disajikan situs secara berbeda kepada klien seluler. Hal-hal tersebut merupakan pemeriksaan terhadap sistem Anda sendiri atau negosiasi konten yang tidak berbahaya, dan hal tersebut diperbolehkan.

Apa yang Harus Dikirim Sebagai Gantinya

Untuk klien otomatis, string yang paling jarang diblokir adalah yang menjelaskan identitas Anda.

curl -A "AcmePriceBot/1.2 (+https://acme.example.com/bot)" https://example.com

Konvensi ini terdiri dari tiga bagian: nama, versi, dan URL tempat seseorang dapat mengetahui identitas Anda serta cara menghubungi Anda. Cara ini efektif karena memberikan pilihan lain kepada pengelola situs selain memblokir. Pola permintaan yang tidak dapat dijelaskan merupakan masalah yang harus dihentikan; sedangkan crawler yang teridentifikasi dan memiliki halaman kontak merupakan keputusan yang harus diambil, dan seringkali keputusannya adalah mengizinkannya.

Tiga manfaat praktis, semuanya nyata:

**robots.txt

dapat menghubungi Anda secara spesifik.** Aturan dicocokkan berdasarkan token user-agent, sehingga sebuah situs dapat memberikan izin khusus kepada crawler Anda yang tidak diberikan kepada semua orang. Hal itu tidak mungkin terjadi jika Anda anonim.

Operator dapat menghubungi Anda sebelum memblokir. Hal ini terjadi lebih sering daripada yang diperkirakan orang, dan hasilnya jauh lebih baik daripada baru menyadari adanya pemblokiran tiga minggu kemudian.

Hal ini mendukung permintaan akses. “Kami adalah crawler yang diidentifikasi sebagai AcmePriceBot; inilah yang kami lakukan” adalah percakapan yang dapat menghasilkan sesuatu. "Kami adalah skrip yang tidak teridentifikasi" tidak demikian.

Sesuaikan dengan perilaku yang sesuai dengan klaim tersebut: patuhi robots.txt

, hormati Crawl-delay

dan Retry-After

, jaga frekuensi permintaan Anda tetap wajar, dan gunakan cache agar Anda tidak pernah mengambil sumber daya yang sama dan tidak berubah dua kali.

Menetapkannya Secara Konsisten dalam Skrip

Untuk apa pun yang melibatkan lebih dari satu perintah, letakkan string tersebut di satu tempat.

UA="AcmePriceBot/1.2 (+https://acme.example.com/bot)"

curl -sS --fail --location \
     --user-agent "$UA" \
     --connect-timeout 5 --max-time 30 \
     "$URL"

Atau tetapkan sekali saja dalam berkas konfigurasi curl, yang akan menjaga konsistensi setiap eksekusi tanpa perlu mengulang flag:

# bot.conf
--user-agent "AcmePriceBot/1.2 (+https://acme.example.com/bot)"
--location
--show-error
curl -K bot.conf "$URL"

Peringatan khusus mengenai ~/.curlrc

: pengaturan ini berlaku untuk setiap eksekusi curl oleh pengguna tersebut, termasuk perintah yang tidak Anda tulis. Menetapkan user agent bot di sana berarti setiap permintaan ad hoc yang pernah Anda buat akan diidentifikasi sebagai crawler Anda, yang akan menghasilkan hasil yang membingungkan berbulan-bulan kemudian. Gunakan berkas konfigurasi bernama dengan -K

untuk hal-hal yang spesifik terkait beban kerja.

Jika Anda memerlukan beberapa user agent dalam satu beban kerja, simpanlah dalam sebuah array dan pilihlah secara sengaja, bukan secara acak — rotasi acak dalam satu sesi akan menghasilkan klien yang tampak seperti berganti browser di tengah kunjungan, yang justru menimbulkan ketidakkonsistenan alih-alih penyamaran.

Memeriksa Apa yang Sebenarnya Anda Kirim

Kebiasaan yang patut ditanamkan, karena asumsi mengenai header seringkali ternyata salah.

curl -v -A "MyBot/1.0" https://example.com 2>&1 | grep -i '^> user-agent'

Output terperinci dikirim ke stderr, itulah sebabnya ada perintah 2>&1. Baris-baris > adalah apa yang dikirimkan oleh curl.

Atau minta layanan tersebut untuk mengembalikannya:

curl -sS -A "MyBot/1.0" https://httpbin.org/user-agent

Hal ini lebih penting daripada yang terdengar karena perilaku spesifik yang dijelaskan dalam manual: "jika Anda menambahkan header kustom yang memiliki nama sama dengan salah satu header internal yang digunakan curl, header yang Anda tetapkan secara eksternal akan digunakan alih-alih header internal tersebut". Jadi, menggabungkan -A dengan -H "User-Agent: ..." berarti salah satunya akan menang tanpa pemberitahuan, dan mengetahui mana yang menang memerlukan pemeriksaan. Saran dari manual itu sendiri patut diulang: "Anda tidak boleh mengganti header yang ditetapkan secara internal tanpa benar-benar memahami apa yang Anda lakukan."

Pemeriksaan yang sama berlaku saat menggunakan proxy, di mana --proxy-header menetapkan header pada koneksi proxy, bukan pada permintaan target — sebuah perbedaan yang sering membingungkan pengguna ketika header yang mereka tetapkan tampaknya tidak sampai.

Membaca String User-Agent

Hal ini layak dipahami, baik karena Anda mungkin perlu membuatnya sendiri maupun karena formatnya menjelaskan mengapa string browser terlihat begitu aneh.

String Chrome modern kira-kira terlihat seperti ini:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

Hampir tidak ada satupun dari hal tersebut yang benar. Itu bukan Mozilla, bukan Safari, dan AppleWebKit/537.36 sudah tidak diperbarui selama bertahun-tahun. String tersebut merupakan catatan fosil dari dua dekade negosiasi konten: setiap browser menambahkan token dari pendahulunya sehingga server yang mendeteksi pesaing akan menyajikan versi halaman yang tepat. Hasilnya adalah format yang hampir tidak mengandung informasi yang dapat diandalkan, namun tetap diparsing oleh banyak perangkat lunak.

Tata bahasa struktural di baliknya sederhana: urutan token Product/Version, masing-masing opsional diikuti oleh komentar dalam tanda kurung. Itulah spesifikasi lengkapnya, dan itulah mengapa string seperti AcmePriceBot/1.2 (+https://acme.example.com/bot) dianggap valid — token produk, versi, dan komentar yang berisi URL. Awalan + pada URL hanyalah konvensi, bukan persyaratan, dan hal ini diakui secara luas.

Masalah perangkat seluler. Banyak situs menyajikan markup yang berbeda kepada klien seluler, dan token pembedanya biasanya adalah Mobile di suatu tempat dalam string tersebut. Jika Anda benar-benar memeriksa bagaimana sebuah halaman ditampilkan bagi pengunjung seluler, mengirimkan agen pengguna seluler merupakan negosiasi konten biasa, bukan peniruan — meskipun peringatan yang sama tetap berlaku seperti biasa: string seluler pada koneksi berbentuk desktop dengan viewport desktop hanyalah klaim setengah-setengah, dan browser seluler yang sesungguhnya akan berbeda dalam beberapa hal lainnya.

Dan tren pembekuan versi. Browser secara bertahap mengurangi detail yang mereka tampilkan dalam header ini, dan mengalihkan informasi kemampuan ke petunjuk klien yang terstruktur. Implikasi praktisnya adalah bahwa penguraian user-agent menjadi sumber informasi yang semakin berkurang bagi semua orang — termasuk situs-situs yang memutuskan apa yang harus dilakukan terhadap permintaan Anda, yang merupakan alasan lain mengapa hal ini merupakan sinyal yang lemah untuk dijadikan dasar strategi.

Ketika User Agent Bukanlah Masalahnya

Beberapa kasus di mana mengubahnya tidak akan membantu, dicantumkan karena orang-orang biasanya mencobanya terlebih dahulu.

Ketika konten dirender oleh JavaScript. curl tidak menjalankan skrip. Respons yang hampir kosong berarti halaman tersebut disusun di sisi klien, dan solusinya adalah browser atau API yang mendasarinya, bukan header.

Ketika Anda terkena pembatasan laju (rate-limited). Pembatasan laju (429) berkaitan dengan volume, bukan identitas. Memperlambat kecepatan permintaan dapat membantu; namun, menggunakan user agent baru tidak akan membantu.

Ketika alamat IP menjadi masalah. Jika rentang alamat IP tertentu diblokir, setiap permintaan dari rentang tersebut akan gagal terlepas dari header apa pun.

Ketika otentikasi diperlukan. Sebuah 401 memerlukan kredensial.

Ketika sidik jari TLS mengungkap identitas Anda. Sudah dibahas di atas, dan inilah alasan mengapa peniruan browser hanya melalui header cenderung mengecewakan.

Ketika situs tersebut memang tidak menginginkan lalu lintas otomatis. Beberapa situs menyatakan hal ini dalam ketentuan mereka dan menegakkannya. Mengubah header tidak mengubah ketentuan tersebut, dan situs yang telah meminta Anda untuk tidak melakukan crawling telah memberikan informasi kepada Anda, bukan teka-teki.

Diagnosis yang dapat dengan cepat membedakan hal-hal ini: kirimkan permintaan ke URL yang sama dari browser biasa melalui koneksi yang sama. Jika browser berfungsi dan curl tidak, bandingkan kedua permintaan tersebut header demi header — dan jika satu-satunya perbedaan yang penting ternyata adalah sesuatu yang tidak dapat Anda ubah dari baris perintah, itulah jawabannya.

Pertanyaan Lainnya

Bagaimana cara mengatur User-Agent di curl?

curl -A "MyBot/1.0" URL, atau dengan cara lain curl -H "User-Agent: MyBot/1.0" URL. Berikan tanda kutip pada string jika berisi spasi. Jika diberikan lebih dari sekali, nilai terakhir yang akan digunakan.

Apa User-Agent default curl?

curl/VERSION — misalnya curl/8.22.0. Nilai ini dikirim pada setiap permintaan kecuali jika Anda mengganti atau menghapusnya, dan beberapa server merespons secara berbeda berdasarkan nilai tersebut.

Bagaimana cara menghapus header User-Agent di curl?

curl -A "" URL menghapus header tersebut sepenuhnya. curl -A " " URL mengirimkannya dengan nilai kosong, yang merupakan permintaan yang berbeda. Perlu dicatat bahwa tidak mengirimkan User-Agent sama sekali lebih tidak lazim daripada mengirimkan nilai default curl, sehingga hal ini justru menarik lebih banyak perhatian daripada mengurangi perhatian.

Apakah sebaiknya saya memalsukan User-Agent browser dengan curl?

Biasanya tidak. String browser pada permintaan yang sidik jari TLS, kumpulan header, dan urutannya semuanya berasal dari curl merupakan ketidakkonsistenan yang tidak pernah dihasilkan oleh browser sungguhan, sehingga justru membuat Anda lebih mudah dikenali daripada sebaliknya. Jika Anda membutuhkan permintaan yang menyerupai browser, gunakanlah browser.

Apakah mengubah User-Agent akan mencegah saya diblokir?

Jarang sekali jika dilakukan sendirian. Hal ini membantu melawan aturan umum yang menolak alat-alat yang dikenal, tetapi tidak berpengaruh terhadap batasan laju, pemblokiran berbasis alamat, sidik jari TLS, atau analisis perilaku. Mengidentifikasi diri Anda secara jujur dengan URL kontak seringkali lebih efektif daripada menyamar.

Seperti apa seharusnya User-Agent bot?

Nama, versi, dan URL kontak: AcmePriceBot/1.2 (+https://acme.example.com/bot). Hal ini memungkinkan robots.txt menghubungi Anda secara spesifik, memungkinkan operator menghubungi Anda alih-alih memblokir Anda, dan memberi Anda hak untuk meminta akses.

Bisakah saya mengatur User-Agent yang berbeda untuk setiap permintaan?

Ya — -A berlaku untuk pemanggilan, jadi berikan nilai yang berbeda setiap kali, atau gunakan --next untuk menjalankan beberapa operasi dengan opsi berbeda dalam satu perintah. Hindari rotasi acak dalam satu sesi, karena hal ini akan membuat klien tampak seolah-olah mengganti browser di tengah kunjungan.

Mengapa User-Agent kustom saya tidak muncul?

Kemungkinan besar Anda telah menetapkannya dua kali dengan cara yang berbeda, karena curl menggunakan header yang ditetapkan secara eksternal alih-alih header internalnya, dan definisi terakhir yang berlaku. Periksa dengan curl -v ... 2>&1 | grep -i '^> user-agent' untuk melihat apa yang sebenarnya dikirimkan.

Kesimpulan

Menetapkan user agent di curl hanya memerlukan satu opsi, dan pilihan nilainya lebih penting daripada sintaksnya.

Nilai default menunjukkan bahwa curl digunakan secara jujur, dan kejujuran adalah posisi yang dapat dipertahankan: konsisten, tidak mencolok, dan terkadang menjadi alasan mengapa sebuah situs memperlakukan Anda dengan wajar. Menghapus header tersebut dimungkinkan — argumen kosong akan menghapusnya sepenuhnya, sedangkan satu spasi akan membuatnya kosong — dan keduanya lebih jarang digunakan daripada nilai default, yang justru bertentangan dengan apa yang biasanya diinginkan orang.

Menyalin string browser adalah insting umum dan opsi terlemah, karena klaim tersebut dapat diverifikasi. Sidik jari TLS, komposisi dan urutan header, serta apakah Anda mengambil sub-sumber daya halaman, semuanya bertentangan dengan klaim tersebut, dan kontradiksi lebih mudah dikenali daripada pengakuan langsung. Jika permintaan yang menyerupai browser benar-benar diperlukan, gunakanlah browser sebagai alatnya.

Pendekatan yang lebih efektif daripada yang diperkirakan kebanyakan orang tidak memerlukan biaya apa pun: sebuah nama, versi, dan URL tempat seseorang dapat mengetahui siapa Anda. Hal ini memungkinkan robots.txt menghubungi Anda, memungkinkan operator mengirim email kepada Anda alih-alih memblokir Anda, dan mengubah "lalu lintas yang tidak dapat dijelaskan" menjadi "crawler yang memiliki pemilik" — yang merupakan posisi yang jauh lebih baik ketika seseorang memutuskan apa yang harus dilakukan terhadap Anda.