Durumumuzu açıkça belirtelim: Biz Geonode olarak proxy satışı yapıyoruz ve kullanıcı ajanı ile ilgili sorular genellikle “neden engelleniyorum” sorusuyla birlikte geliyor. Dürüst cevap şudur: kullanıcı ajanı mevcut en zayıf sinyallerden biridir ve TLS parmak izi aksini gösteren bir istek üzerindeki tarayıcı dizesi, hiç kılık değiştirmemekten daha kötüdür — gerçek bir tarayıcının asla üretmeyeceği bir tutarsızlık yaratmış olursunuz. Bununla ilgili aşağıda bir bölüm bulunmaktadır. İnsanların beklediğinden daha sık işe yarayan strateji ise tam tersidir: kim olduğunuzu belirtin, bir iletişim URL’si sağlayın ve makul davranın. Anonim otomasyon, kimliği belirlenen otomasyona kıyasla çok daha kolay engellenir ve kimliğinizi belirtmek ücretsizdir.
Sözdizimi
curl -A "MyBot/1.0" https://example.com
curl kılavuzu, -A, --user-agent <name>
öğesini şu şekilde açıklamaktadır: "HTTP sunucusuna gönderilecek User-Agent dizesini belirtin. Dizede bulunan boşlukları kodlamak için, dizeyi tek veya çift tırnak işaretleri içine alın."
Varsayılan ayar da belirtilmiştir: "Varsayılan olarak, curl curl/VERSION
kullanır; örneğin User-Agent: curl/8.22.0
."
Dolayısıyla, herhangi bir seçenek belirtilmediğinde, yaptığınız her istek kendini curl ve sürümü olarak tanıtır. Bazı sunucular buna göre farklı yanıtlar verir; bir sitenin bozuk olduğu sonucuna varmadan önce bunu bilmek önemlidir.
Genel bir başlık kullanıldığında eşdeğerı şöyledir:
curl -H "User-Agent: MyBot/1.0" https://example.com
Her ikisi de aynı sonucu verir — kılavuzda, başlığın "--header
veya --proxy-header
seçenekleriyle de ayarlanabileceği" belirtilmiştir. -A
daha kısadır; -H
ise diğer tüm başlıkları ayarlama yönteminizle tutarlıdır; bu, komutları programlı olarak oluşturuyorsanız önemlidir.
Bunu birkaç kez verirseniz, "en son ayarlanan değer kullanılır".
Başlığı Tamamen Kaldırma
Kullanıcıların varlığından haberdar olmadığı bir durumdur ve kullanım kılavuzunda bu ayrım açıkça belirtilmiştir:
--user-agentişlevine boş bir argüman ("") verirseniz, başlık istekten tamamen kaldırılır. Boş bir başlık tercih ediyorsanız, bunu tek bir boşluk karakteri (" ") olarak ayarlayabilirsiniz.
curl -A "" https://example.com # no User-Agent header at all
curl -A " " https://example.com # User-Agent: (empty value)
Bunlar gerçekten farklı isteklerdir. Başlık göndermemek, boş bir başlık göndermekle aynı şey değildir ve sunucular bunları birbirinden ayırt edebilir.
Her ikisi de olağandışıdır ve olağandışı olması başlı başına bir işarettir. Hiç kullanıcı ajanı içermeyen bir istek, kendini curl olarak tanımlayan bir istekten daha nadirdir; bu nedenle, daha az dikkat çekmek için başlığı kaldırmak genellikle ters etki yaratır.
Aynı mekanizma -H adresinde de geçerlidir ve kılavuzda her iki durum için de sözdizimi açıklanmaktadır: "İç başlığı kaldırmak için, iki nokta üst üste işaretinin sağ tarafına içerik içermeyen bir yedek değer verin, örneğin: -H "Host:"", buna karşılık değeri boş olan bir başlık için noktalı virgül gerekir — -H "X-Custom-Header;" komutu X-Custom-Header: komutunu gönderir.
Varsayılan Ayarın Önemi Nedeni
curl/8.22.0 tamamen meşru bir dizedir ve bunun bazı sonuçları vardır.
Bazı sunucular bunu doğrudan engeller. Bilinen otomasyon araçlarına karşı genel bir kural yazmak kolaydır ve bu kural o kadar yaygındır ki, karşınıza çıkması kaçınılmazdır.
Bazıları farklı içerik sunar. Basitleştirilmiş işaretleme, JavaScript'e bağlı bölümlerin olmaması, bazen de tamamen farklı bir sayfa.
Bazıları bunu günlüğe kaydeder ve hiçbir şey yapmaz. Açık ara en yaygın durum budur.
Bazı CDN'ler bunu tek başına bir karar olarak değil, birçok sinyalden biri olarak değerlendirir.
Bunun pratikteki sonucu şudur: "Tarayıcımda çalışıyor ama curl'da çalışmıyor" durumunun birkaç olası nedeni vardır ve kullanıcı ajanı bunlardan sadece biridir. Değiştirmeden önce, farkın gerçekten JavaScript'ten kaynaklanıp kaynaklanmadığını kontrol edin — curl JavaScript'i çalıştırmaz, bu nedenle istemci tarafında birleştirilen bir sayfa, hangi başlığı gönderirseniz gönderin curl'e neredeyse boş görünecektir. Bu, engelleyici bir sorun değildir ve hiçbir kullanıcı aracısı bunu düzeltemez.
Tarayıcı Kimliğini Taklit Etmenin Neden Sık Sık Ters Tepki Yarattığı
Bir Chrome dizesini yapıştırmadan önce okunması gereken bölüm.
Kullanıcı ajanı bir iddiadır. Modern bir bot önleme sistemi, bu iddiayı kanıtlarla karşılaştırarak doğrular ve bu konuda bolca kanıt vardır:
TLS parmak izi. Bir istemcinin TLS'yi nasıl müzakere ettiği — şifreleme paketi sırası, uzantılar, desteklenen gruplar — genellikle JA3 veya JA4 olarak özetlenen bir imza oluşturur. curl'ün parmak izi Chrome'unkinden farklıdır ve hiçbir başlık bunu değiştiremez. curl’un TLS el sıkışmasıyla Chrome olduğunu iddia eden bir istek, dürüstçe curl olduğunu iddia eden bir istekten daha kolay tespit edilebilir; çünkü gerçek Chrome asla bu kombinasyonu oluşturmaz.
Başlık kümesi ve sıralaması. Tarayıcılar, karakteristik bir sırayla karakteristik bir başlık kümesi gönderir — Accept, Accept-Language, Accept-Encoding, Sec-Fetch-* ve daha fazlası. curl ise üç veya dört tane gönderir. Chrome olduğunu iddia ederken curl'un başlık kümesini göndermek, bariz bir çelişkidir.
HTTP sürümü ve davranışı. Bağlantı yeniden kullanımı, çoklama, başlık sıkıştırma ayrıntıları.
Davranış. Gerçek tarayıcılar CSS'yi, resimleri ve komut dosyalarını alır. Tek bir HTML belgesini alıp başka hiçbir şey almayan bir istemci, ne derse desin tarayıcıya benzemez.
Dolayısıyla gerçek hiyerarşi şöyledir: doğru bir kullanıcı ajanı tutarlı ve göze çarpmaz; uydurma bir kullanıcı ajanı ise tutarsız ve dikkat çekicidir. Gerçekten tarayıcı benzeri istekler gerekiyorsa, bir başlığa değil, bir tarayıcıya — Playwright veya benzer bir araca — ihtiyacınız vardır. Bu konudaki ilgili ödünleşmeleri Playwright ile ekran görüntüsü alma başlıklı yazımızda ele aldık.
Dar bir meşru orta yol vardır: kendi sitenizin kullanıcı aracısı işleyişini test etmek veya bir sitenin mobil istemcilere farklı şekilde sunduğu içeriği almak. Bunlar, kendi sistemlerinize yönelik kontroller veya zararsız içerik müzakereleridir ve sorun teşkil etmez.
Bunun Yerine Ne Göndermeli
Otomatik istemciler için en az engellenen dize, ne olduğunuzu belirten dizedir.
curl -A "AcmePriceBot/1.2 (+https://acme.example.com/bot)" https://example.com
Bu kural üç bölümden oluşur: bir ad, bir sürüm ve ne olduğunuzu ve size nasıl ulaşılabileceğini öğrenebileceğiniz bir URL. Bu yöntem, site operatörüne engelleme dışında başka seçenekler sunduğu için işe yarar. Nedeni açıklanamayan istek kalıpları durdurulması gereken bir sorundur; iletişim sayfası olan ve kimliği belirlenen bir tarayıcı ise alınması gereken bir karardır ve çoğu zaman bu karar, tarayıcıya izin verilmesidir.
Üç pratik fayda, hepsi de gerçektir:
**robots.txt
size özel olarak hitap edebilir.** Kurallar, kullanıcı ajanı belirtecine göre eşleştirilir; böylece bir site, tarayıcınıza herkese vermediği bir izin verebilir. Anonim iseniz bu mümkün olmaz.
Operatörler engelleme yapmadan önce sizinle iletişime geçebilir. Bu, insanların beklediğinden daha sık gerçekleşir ve üç hafta sonra bir engellemeyle karşılaşmaktan çok daha iyi bir sonuçtur.
Erişim talebinde bulunmayı destekler. "Biz AcmePriceBot olarak tanımlanan tarayıcıyız; işte yaptığımız şey" gibi bir konuşma, bir sonuca varabilir. "Biz kimliği belirsiz bir komut dosyasıyız" ise değildir.
Bunu, iddianıza uygun davranışlarla destekleyin: robots.txt
kurallarına uyun, Crawl-delay
ve Retry-After
adreslerine saygı gösterin, istek sıklığınızı makul tutun ve aynı, değişmemiş kaynağı asla iki kez almamak için önbelleğe alın.
Komut Dosyalarında Tutarlı Bir Şekilde Ayarlama
Bir komuttan fazlasını kullanacaksanız, dizgiyi tek bir yere yazın.
UA="AcmePriceBot/1.2 (+https://acme.example.com/bot)"
curl -sS --fail --location \
--user-agent "$UA" \
--connect-timeout 5 --max-time 30 \
"$URL"
Ya da bunu bir curl yapılandırma dosyasında tek seferde ayarlayın; bu sayede bayrağı tekrarlamadan her çalıştırmada tutarlılık sağlanır:
# bot.conf
--user-agent "AcmePriceBot/1.2 (+https://acme.example.com/bot)"
--location
--show-error
curl -K bot.conf "$URL"
Özellikle ~/.curlrc
ile ilgili bir uyarı: Bu, sizin yazmadığınız komutlar da dahil olmak üzere, o kullanıcı tarafından yapılan her curl çağrısı için geçerlidir. Buraya bir bot kullanıcı ajanı ayarlamak, yaptığınız her geçici isteğin sizin tarayıcınız olarak tanımlanması anlamına gelir ve bu da aylar sonra kafa karıştırıcı sonuçlara yol açar. İş yüküne özgü her şey için -K
ile adlandırılmış bir yapılandırma dosyası kullanın.
Bir iş yükü genelinde birden fazla kullanıcı aracısına ihtiyacınız varsa, bunları bir dizide tutun ve rastgele değil, bilinçli bir şekilde seçin — bir oturum içinde rastgele dönüşüm, ziyaretin ortasında tarayıcıyı değiştiriyormuş gibi görünen bir istemciye yol açar; bu da kılık değiştirme değil, başka bir tutarsızlıktır.
Gerçekte Ne Gönderdiğinizi Kontrol Etme
Bu alışkanlığı edinmeye değer, çünkü başlıklarla ilgili varsayımlar şaşırtıcı derecede sık yanlış çıkmaktadır.
curl -v -A "MyBot/1.0" https://example.com 2>&1 | grep -i '^> user-agent'
Ayrıntılı çıktı stderr’e yönlendirilir; bu nedenle 2>&1 komutu kullanılır. > satırları, curl tarafından iletilen verileri gösterir.
Ya da bir hizmetten bunu geri yankılamasını isteyebilirsiniz:
curl -sS -A "MyBot/1.0" https://httpbin.org/user-agent
Bu, kılavuzda açıklanan belirli bir davranış nedeniyle göründüğünden daha önemlidir: "curl'un kullanacağı dahili başlıklardan biriyle aynı ada sahip özel bir başlık eklemeniz gerekirse, dahili başlık yerine dışarıdan ayarladığınız başlık kullanılır". Dolayısıyla, -A ile -H "User-Agent: ..."'i birleştirmek, birinin sessizce galip gelmesi anlamına gelir ve hangisinin galip geldiğini bilmek için kontrol etmek gerekir. Kılavuzun kendi tavsiyesini tekrarlamakta fayda var: "Ne yaptığınızı tam olarak bilmeden, dahili olarak ayarlanmış başlıkları değiştirmemelisiniz."
Aynı kontrol, bir proxy üzerinden de geçerlidir; burada --proxy-header, hedef istek yerine proxy bağlantısı üzerinde başlıklar ayarlar — bu ayrım, ayarladıkları bir başlığın ulaşmamış gibi görünmesi durumunda kullanıcıları yanıltabilir.
Kullanıcı Aracısı Dizesini Okuma
Hem kendiniz bir tane oluşturmanız gerekebileceği için hem de bu biçim, tarayıcı dizelerinin neden bu kadar tuhaf göründüğünü açıkladığı için anlamaya değer.
Modern bir Chrome dizesi kabaca şöyle görünür:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Bunların neredeyse hiçbiri doğru değildir. Bu ne Mozilla’dır ne de Safari’dir; ayrıca AppleWebKit/537.36 adresi yıllardır değiştirilmemiştir. Bu dize, yirmi yıllık içerik müzakeresinin bir fosil kaydıdır: Her tarayıcı, rakiplerini tespit etmeye çalışan sunucuların kendisine sayfanın doğru sürümünü sunması için öncüllerinin belirteçlerini eklemiştir. Sonuçta ortaya, neredeyse hiç güvenilir bilgi taşımayan, ancak yine de pek çok yazılım tarafından ayrıştırılan bir biçim çıkmıştır.
Altta yatan yapısal dilbilgisi basittir: Product/Version belirteçlerinden oluşan bir dizi; her birinin ardından isteğe bağlı olarak parantez içinde bir açıklama gelir. Spesifikasyonun tamamı budur ve işte bu yüzden AcmePriceBot/1.2 (+https://acme.example.com/bot) gibi bir dize geçerli bir yapıya sahiptir — bir ürün belirteci, bir sürüm ve bir URL içeren bir açıklama. URL’deki + öneki bir gereklilikten ziyade bir gelenektir ve yaygın olarak kabul görmektedir.
Mobil sorunu. Birçok site, mobil istemcilere farklı işaretleme sunar ve ayırt edici belirteç genellikle dizenin herhangi bir yerinde bulunan Mobile şeklindedir. Bir sayfanın mobil ziyaretçiler için nasıl görüntülendiğini meşru bir şekilde kontrol ediyorsanız, mobil kullanıcı ajanı göndermek kimlik taklidi değil, sıradan bir içerik müzakeresidir — ancak her zamanki gibi aynı uyarı geçerlidir: masaüstü görünüm alanına sahip masaüstü tipi bir bağlantıda bulunan mobil dize, iddianın yalnızca yarısıdır ve gerçek bir mobil tarayıcı birkaç başka açıdan farklılık gösterecektir.
Ve sürüm sabitleme eğilimi. Tarayıcılar, bu başlıkta ortaya koydukları ayrıntıları giderek azaltmakta ve yetenek bilgilerini bunun yerine yapılandırılmış istemci ipuçlarına aktarmaktadır. Bunun pratikteki anlamı, kullanıcı ajanı ayrıştırmasının herkes için giderek azalan bir bilgi kaynağı haline gelmesidir — isteklerinizle ne yapılacağına karar veren siteler de dahil olmak üzere; bu da, strateji oluşturmak için zayıf bir sinyal olmasının bir başka nedenidir.
Kullanıcı Aracısı Sorun Değilse
Bunu değiştirmenin bir fayda sağlamayacağı durumlar; kullanıcılar genellikle ilk olarak bunu denedikleri için listelenmiştir.
İçerik JavaScript tarafından oluşturuluyorsa. curl, komut dosyalarını çalıştırmaz. Neredeyse boş bir yanıt, sayfanın istemci tarafında oluşturulduğu anlamına gelir ve çözüm, başlık değil, tarayıcı veya altta yatan API'dır.
Hız sınırlamasına maruz kalıyorsanız. 429, kimlikle değil, hacimle ilgilidir. Hızı düşürmek yardımcı olur; yeni bir kullanıcı ajanı ise yardımcı olmaz.
Sorun adresten kaynaklanıyorsa. Bütün bir aralık engellenmişse, başlıklara bakılmaksızın o aralıktan gelen her istek başarısız olur.
Kimlik doğrulama gerekiyorsa. 401 adresi kimlik bilgilerini ister.
TLS parmak izi sizi ele veriyorsa. Yukarıda ele alındığı gibi, bu durum başlıklar yoluyla tarayıcı taklit etmenin genellikle hayal kırıklığı yaratmasının nedenidir.
Sitenin otomatik trafiği istemediği durumlarda. Bazı siteler bunu kullanım koşullarında belirtir ve bunu uygular. Bir başlığı değiştirmek kullanım koşullarını değiştirmez; taramanızı istemediğini belirten bir site size bir bilmece değil, bilgi vermiştir.
Bunları hızlıca ayırt etmenin yolu şudur: Aynı bağlantı üzerinden normal bir tarayıcıdan aynı URL’yi isteyin. Tarayıcı çalışıyorsa ve curl çalışmıyorsa, iki isteği başlık başlık karşılaştırın — ve önemli olan tek farkın komut satırından değiştiremeyeceğiniz bir şey olduğu ortaya çıkarsa, işte cevabınız budur.
Sık Sorulan Sorular
curl'da User-Agent'ı nasıl ayarlayabilirim?
curl -A "MyBot/1.0" URL veya eşdeğer olarak curl -H "User-Agent: MyBot/1.0" URL. Dize boşluk içeriyorsa tırnak içine alın. Birden fazla değer belirtilirse son değer geçerli olur.
curl'un varsayılan User-Agent'ı nedir?
curl/VERSION — örneğin curl/8.22.0. Siz bunu geçersiz kılmadığınız veya kaldırmadığınız sürece her istekte gönderilir ve bazı sunucular buna göre farklı yanıtlar verir.
curl'da User-Agent başlığını nasıl kaldırırım?
curl -A "" URL başlığı tamamen kaldırır. curl -A " " URL ise boş bir değerle gönderir; bu, farklı bir istek anlamına gelir. Hiçbir kullanıcı ajanı göndermemek, curl'un varsayılan değerini göndermekten daha sıra dışıdır; bu nedenle daha az değil, daha fazla dikkat çeker.
curl ile bir tarayıcı User-Agent'ı taklit etmeli miyim?
Genellikle hayır. TLS parmak izi, başlık kümesi ve sıralaması tamamen curl'e ait olan bir istekte tarayıcı dizesi bulunması, gerçek tarayıcıların asla üretmeyeceği bir tutarsızlıktır; bu da sizi daha az değil, daha fazla tanınabilir hale getirir. Tarayıcı benzeri istekler gerekiyorsa, bir tarayıcı kullanın.
User-Agent'ı değiştirmek engellenmemi önler mi?
Tek başına nadiren. Bilinen araçları reddeden genel kurallara karşı yardımcı olur, ancak hız sınırlamaları, adres tabanlı engellemeler, TLS parmak izi veya davranışsal analizlere karşı hiçbir etkisi yoktur. Kendinizi bir iletişim URL'si ile dürüstçe tanıtmak, genellikle kılık değiştirmekten daha iyi sonuç verir.
Bir botun User-Agent'ı nasıl olmalı?
Ad, sürüm ve bir iletişim URL'si: AcmePriceBot/1.2 (+https://acme.example.com/bot). Bu, robots.txt adresinin size özel olarak hitap etmesini sağlar, operatörlerin sizi engellemek yerine sizinle iletişime geçmesini mümkün kılar ve erişim talep etme hakkı verir.
Her istek için farklı bir User-Agent ayarlayabilir miyim?
Evet — -A çağrıya uygulanır, bu nedenle her seferinde farklı bir değer verin veya --next kullanarak tek bir komutla farklı seçeneklere sahip birkaç işlemi çalıştırın. Bir oturum içinde rastgele değiştirme yapmaktan kaçının; bu, ziyaret sırasında tarayıcısını değiştiriyormuş gibi görünen bir istemciye yol açar.
Neden özel User-Agent'ım görünmüyor?
Büyük olasılıkla farklı yöntemlerle iki kez ayarlamışsınızdır; çünkü curl, dahili başlığı yerine dışarıdan ayarlanan başlığı kullanır ve son tanım geçerli olur. curl -v ... 2>&1 | grep -i '^> user-agent' adresini kontrol ederek gerçekte neyin iletildiğini görebilirsiniz.
Sonuç
Curl’da kullanıcı ajanı ayarlamak tek bir bayraktır ve değer seçimi, sözdiziminden daha önemlidir.
Varsayılan ayar, curl'ü dürüstçe bildirir ve dürüstlük savunulabilir bir tutumdur: tutarlı, dikkat çekmeyen ve bazen bir sitenin size makul davranmasının nedeni olabilir. Başlığı kaldırmak mümkündür — boş bir argüman onu tamamen kaldırır, tek bir boşluk ise boş olarak gönderir — ve her ikisi de varsayılan ayardan daha sıra dışıdır; bu da insanların genellikle amaçladığının tam tersidir.
Bir tarayıcı dizesini kopyalamak yaygın bir içgüdüdür ve en zayıf seçenektir, çünkü bu iddia doğrulanabilir. TLS parmak izleri, başlık bileşimi ve sıralaması ile sayfanın alt kaynaklarını alıp almadığınız, hepsi bununla çelişir ve bir çelişki, açık bir itirafdan daha kolay tespit edilebilir. Tarayıcı biçiminde istekler gerçekten gerekliyse, tarayıcı en uygun araçtır.
Çoğu insanın beklediğinden daha iyi sonuç veren yaklaşım hiçbir maliyeti yoktur: bir ad, bir sürüm ve bir URL; bu sayede birisi sizin kim olduğunuzu öğrenebilir. Bu, robots.txt adresinin size ulaşmasını sağlar, operatörün sizi engellemek yerine e-posta göndermesini mümkün kılar ve “nedeni bilinmeyen trafiği” “sahibi olan bir tarayıcıya” dönüştürür — ki bu, birisi sizinle ilgili ne yapacağına karar verirken bulunabileceğiniz çok daha iyi bir konumdur.
