Camouflare: FlareSolverr’dan Camoufox’a geçiş
FlareSolverr API’sini koruyarak Camoufox’a geçmek için geliştirdiğim Camouflare’in çalışma şekli, kurulumu ve kullanımı.

İnternetten veri toplamak için çıktığım yolda, popüler seçeneklerden biri olan FlareSolverr ile ilerlemeye çalıştım. Ancak hız ve kararlılık tarafında yaşadığım problemleri çözebilmek için Camouflare’i geliştirdim.
Neden Camoufox?
Öncelikle FlareSolverr’ın nasıl çalıştığına bakalım. FlareSolverr, Selenium ve undetected-chromedriver kullanarak Chrome/Chromium çalıştırıyor. Kalıcı bir oturum kullanmıyorsanız her istek için yeni bir tarayıcı başlatılıyor. Birden fazla isteği aynı anda gönderdiğinizde bellek tüketimi de artıyor. Ayrıca her seferinde tarayıcının açılmasını beklemek gerekiyor. Projenin kendi dokümantasyonunda da RAM’i sınırlı makinelerde çok sayıda eşzamanlı istek gönderilmemesi öneriliyor. FlareSolverr dokümantasyonu
Kaynak tüketiminin dışında, doğrulama adımlarında takılıp zaman aşımına uğrayan istekler de olabiliyor. Projenin issue kayıtlarında bu konuda kullanıcı raporları bulunuyor. Bunlar belirli sürüm ve kullanım durumlarına ait olsa da alternatif arayanların karşılaştığı problemleri gösteriyor. Örnek bir issue
Camoufox ise Firefox tabanlı, web scraping için geliştirilmiş bir tarayıcı. Gereksiz bileşenlerin azaltılmasıyla bellek kullanımı ve başlatma süresi üzerine optimizasyonlar yapılıyor. Bunun yanında tarayıcı parmak izi ve otomasyonun algılanması konusunda tarayıcı seviyesinde değişiklikler sunuyor. Bu özellikler benim aradığım çözüme daha uygundu. Camoufox
Bu amaçla geliştirilmiş Byparr reposu da vardı. Ancak benim kullanımımda o da sağlıklı çalışmadı. Bunun üzerine FlareSolverr API’sini koruyan, arka tarafta Camoufox kullanan kendi çözümümü geliştirmeye başladım.
Camouflare nasıl çalışıyor?
Camouflare, FlareSolverr ile benzer şekilde /v1 üzerinden istek alıyor. GET, POST ve oturum oluşturma, listeleme ve silme komutlarını destekliyor. Sayfanın HTML içeriğini ve çerezlerini alıp kendi uygulamanızda kullanabilirsiniz. HTML içerisinden istediğiniz verileri çıkarma işlemini ise sizin yapmanız gerekiyor.
Tarayıcı tarafında hazır tutulan küçük bir havuz bulunuyor. Her istekte yeni bir tarayıcı başlatmak yerine bu havuzdaki tarayıcılar kullanılıyor. Varsayılan yapılandırmada havuz en fazla iki tarayıcıya çıkabiliyor ve her birinde aynı anda bir tarayıcı bağlamı çalışıyor.
Oturumsuz istekler birbirinden ayrı bağlamlarda işleniyor. Eğer aynı oturumu sonraki isteklerde de kullanmak istiyorsanız kalıcı bir session oluşturabilirsiniz. Bu durumda oturumun çerezleri ve tarayıcı durumu korunuyor.
Havuz dolduğunda yeni istekler belirlenen süre boyunca boş yer bekliyor. Tarayıcılar da kullanım veya yaş sınırına ulaştığında yenileniyor. Burada tarayıcı sayısını ve bekleme sürelerini kullanım durumunuza göre ayarlayabilirsiniz. Yapılandırma detayları
Camouflare’in tanıtım videosunu aşağıdan izleyebilirsiniz:
Kurulum ve kullanım
Camouflare’i Docker imajını kullanarak çalıştırabilirsiniz. Öncelikle bir API token oluşturup servisi başlatın:
export CAMOUFLARE_API_TOKEN="$(openssl rand -hex 32)"
docker run --detach --rm \
--name camouflare \
--publish 127.0.0.1:8191:8191 \
--env CAMOUFLARE_API_TOKEN \
--shm-size 2g \
--stop-timeout 45 \
mehmetcansahin/camouflare:2.0.2
Burada oluşturduğunuz token’ı isteklerde göndermeniz gerekiyor. Servisin hazır olup olmadığını /ready üzerinden kontrol edebilirsiniz:
curl --fail http://127.0.0.1:8191/ready \
--header "Authorization: Bearer ${CAMOUFLARE_API_TOKEN}"
Servis hazır olduktan sonra örnek bir GET isteği gönderelim:
curl --request POST http://127.0.0.1:8191/v1 \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${CAMOUFLARE_API_TOKEN}" \
--data '{
"cmd": "request.get",
"url": "https://example.com",
"maxTimeout": 60000
}'
Bu örnekte request.get ile belirtilen sayfaya gidiyoruz. maxTimeout ile isteğin toplam süre bütçesini 60 saniye olarak belirliyoruz. Başarılı bir yanıtta HTML içeriğini solution.response alanından alabilirsiniz.
CAPTCHA desteği
Camouflare’de playwright-captcha kütüphanesinin ClickSolver bileşenini kullanan entegre bir çözüm de bulunuyor. Bu çözüm, tarayıcı üzerinden açılan Cloudflare ara doğrulama sayfalarındaki tıklama adımlarını tamamlamayı deniyor. Başarı, karşılaşılan doğrulamaya ve hedef siteye göre değişiyor.
Varsayılan olarak bu özellik kapalı. Açmak için yukarıdaki docker run komutuna aşağıdaki parametreyi ekleyebilirsiniz:
--env CHALLENGE_SOLVER=clickFlareSolverr’dan geçiş
Mevcut uygulamanız FlareSolverr API’sini kullanıyorsa Camouflare’in desteklediği komutlarla devam edebilirsiniz. Ancak kullandığınız istemcinin API token’ını gönderebilmesi gerekiyor.
Uyumluluk konusunda bazı farklılıklar da var. Örneğin download, returnRawHtml ve tabs_till_verify alanları kabul ediliyor ancak işleme alınmıyor. Bu alanları kullanıyorsanız geçiş yapmadan önce uyumluluk bölümünü incelemenizi öneririm.
Camouflare’i tek bir güvenilir kullanıcı ve tek uygulama worker’ı ile çalışacak şekilde tasarladım. Bu bir tasarım tercihi. Oturumlar ve tarayıcı havuzu süreç içinde tutuluyor, farklı worker’lar arasında paylaşılmıyor. Birden fazla kullanıcı veya instance ile çalışmak istiyorsanız ayrı container’lar kullanıp isteklerin yönlendirilmesini sizin yönetmeniz gerekiyor. Aynı oturuma ait isteklerin aynı instance’a gitmesini de sağlamalısınız.
Servisin durumunu takip etmek
Servisin çalışıyor olması ile tarayıcıların istek işlemeye hazır olması farklı durumlar. Bu yüzden /health uygulamanın çalıştığını, /ready ise tarayıcı altyapısının hazır olduğunu kontrol ediyor.
Havuz ve oturum durumunu görmek için /diagnostics kullanabilirsiniz. Ekstra olarak Prometheus metrikleri de bulunuyor. Hata yanıtlarında ise kapasite yetersizliği, zaman aşımı ve tarayıcı bağlantısının kapanması gibi durumları ayırt edebilirsiniz.