n8n'de HTTP Request Node ile CAPTCHA Nasıl Çözülür

n8n'de bir CAPTCHA node'u yok ve zaten gerekmiyor. İki HTTP Request node'u ile bir Wait node'u, desteklenen her CAPTCHA türünü çözer: ilki işi gönderir, ikincisi token dönene kadar sorgular. İkisini de 127.0.0.1:8080 ve tüm döngü n8n ile aynı makinede çalışır; böylece ağınızdan hiçbir şey çıkmaz ve çözüm başına hiçbir ücret işlemez. CapSkip bir sunucuda da çalışır ve aynı API çağrılarını ağ üzerinden kabul eder; n8n Cloud'dan bu şekilde kullanırsınız. Bu rehber, iş akışını node'ları tek tek ekleyerek kurar; çoğu kişiyi ilk denemede yakalayan Docker ağ tuzağı da dahil.
Neye ihtiyacınız var
- n8n: kendi barındırdığınız sürüm, masaüstü ya da bulut. Üçü de çalışır, ancak bulut için CapSkip'in ağ üzerinden erişilebilir olması gerekir. Aşağıdaki sunucu bölümüne bakın.
- Servisi başlatılmış olarak çalışan CapSkip uygulaması. Port, anahtar ve Local ya da Server modu şurada bulunur: bağlantı ayarları.
- Otomatikleştirdiğiniz siteden bir sitekey ve bir sayfa URL'si.
Anahtar doğrulaması varsayılan olarak kapalıdır; bu yüzden key parametresi olarak boş olmayan herhangi bir dize işe yarar. Hiçbir şey göndermemektense bir şey gönderin: boş bir anahtar şunu döndürür: ERROR_WRONG_USER_KEY.
Neden topluluk node'u yerine HTTP Request?
Topluluk node'larının instance'a kurulması gerekir, API değişikliklerinin gerisinde kalırlar ve n8n Cloud'da kısıtlıdırlar. Buradaki API 2captcha uyumludur ve yalnızca iki uç noktası vardır; yani bir topluluk node'u, yaklaşık altı satırlık yapılandırmayı sarmalamaktan öteye gitmezdi. Dahili HTTP Request node'u aynı işi yapar, n8n ile birlikte güncellenir ve her instance türünde çalışır.
| Uç nokta | Ne yapar | Döndürdüğü |
|---|---|---|
/in.php | Bir görev gönderir | Sayısal bir CAPTCHA ID'si |
/res.php | O ID'nin bitip bitmediğini sorar | Token ya da CAPCHA_NOT_READY dizesi |
Adım 1: CAPTCHA'yı gönderin
Bir HTTP Request node'u ekleyip adını Submit CAPTCHA koyun. Method'u POST olarak ayarlayın, URL olarak da şunu girin: http://127.0.0.1:8080/in.php. Send Body seçeneğini açın, Form Urlencoded'ı seçin ve şu alanları ekleyin.
| Ad | Değer |
|---|---|
| key | Boş olmayan herhangi bir dize |
| method | userrecaptcha |
| googlekey | Sitekey'iniz |
| pageurl | Widget'ın bulunduğu sayfa |
| json | 1 |
json alanını her zaman gönderin. Bu alan olmadan yanıt olarak yalnızca şuna benzer düz bir dize gelir: OK|2122988149 ve bunu elle ayrıştırmanız gerekir. Alanı gönderdiğinizde ise n8n'in doğrudan adresleyebileceği bir nesne elde edersiniz.
// Response from in.php with json=1
{"status": 1, "request": "2122988149"}
// The captcha ID is now available downstream as:
// {{ $json.request }}Diğer CAPTCHA türleri yalnızca method alanını ve onun yanındaki parametreleri değiştirir. Turnstile, sitekey ve pageurl çiftiyle turnstile kullanır; GeeTest, gt ve challenge ile geetest kullanır; görsel CAPTCHA ise bir body alanındaki görüntü baytlarıyla base64 kullanır. API referansı her tür için tüm parametreleri listeler.
Adım 2: ilk sorgulamadan önce bekleyin
Submit CAPTCHA'dan sonra bir Wait node'u ekleyin. Resume'u After Time Interval, Wait Amount'u 15 ve Wait Unit'i seconds olarak ayarlayın.
On beş saniye rastgele seçilmiş bir süre değil. Bir reCAPTCHA v2 işi nadiren daha erken hazır olur; bu yüzden hemen sorgulamak bir iş akışı çalıştırmasını boşa harcar, çünkü sonuç garanti olarak şu olur: CAPCHA_NOT_READY. Turnstile ve GeeTest daha hızlı tamamlanır; orada 5 saniye yeterlidir. Bir görsel CAPTCHA ise genellikle yaklaşık bir saniyede biter.
Adım 3: token'ı sorgulayın
Poll Result adında ikinci bir HTTP Request node'u ekleyin. Method GET, URL http://127.0.0.1:8080/res.php, Send Query Parameters açık.
| Ad | Değer |
|---|---|
| key | 1. adımda kullandığınız dizenin aynısı |
| action | get |
| id | {{ $('Submit CAPTCHA').item.json.request }} |
| json | 1 |
Gönderim node'una adıyla referans verin; şu ifadeyi kullanmayın: $json.request. Wait node'u ikisinin arasına girdiğinde gelen öğe Wait node'una ait olur; döngünün ikinci turunda ise IF node'una ait olur. Kaynak node'u açıkça adıyla belirtmek, döngü kaç kez dönerse dönsün ID'yi sabit tutar.
Adım 4: hazır olana kadar döngüde tutun
Poll Result'tan sonra bir IF node'u ekleyin. Koşul bir dize karşılaştırmasıdır: sol değer {{ $json.request }}, işlem “is not equal to”, sağ değer CAPCHA_NOT_READY.
false çıkışını tekrar Wait node'una bağlayın. Bu, döngüyü kapatır ve n8n cevap gelene kadar dönmeyi sürdürür. true çıkışı ise token'ı bir sonraki adıma taşır.
// res.php while the job is still running
{"status": 0, "request": "CAPCHA_NOT_READY"}
// res.php once it is solved
{"status": 1, "request": "03AGdBq26..."}Yazımına dikkat edin. API, uyumlu olduğu 2captcha veri biçiminden miras kalan şekilde, ilk T olmadan CAPCHA_NOT_READY döndürür. Doğru göründüğü hâliyle yazarsanız IF node'u asla eşleşmez ve iş akışı zaman aşımına uğrayana kadar döngü döner durur.
Sonuçlar yalnızca bir kez okunabilir. Aynı ID'yi ikinci kez okumak, token'ı tekrar vermek yerine bir hata döndürür; bu yüzden bir kez kontrol edip bir kez daha almak için sorgulamak yerine token'ı doğrudan bir sonraki node'a gönderin.
Adım 5: token'ı kullanın
IF node'unun true dalı artık token'ı taşıyor. Üçüncü bir HTTP Request node'u kullanarak, yapmanız engellenen istekte token'ı g-recaptcha-response form alanı olarak gönderin.
// Code node, Mode: Run Once for All Items.
// Builds the form payload for the final request.
const token = $input.first().json.request;
return [
{
json: {
email: "[email protected]",
"g-recaptcha-response": token,
},
},
];Token'lar verildikten yaklaşık iki dakika sonra geçerliliğini yitirir; bu yüzden gönderimi hemen yapın. İş akışınızda çözme ile gönderme arasında bir onay adımı veya başka bir Wait node'u varsa, çözme işlemini onlardan sonraya taşıyın.
Docker tuzağı: localhost sizin makineniz değildir
Bu, açık ara en sık görülen hatadır ve hata mesajı işe yarar hiçbir yeri işaret etmez. Bir konteynerin içinde 127.0.0.1 konteynerin kendisi anlamına gelir, çözücüyü çalıştıran ana makine değil. n8n bağlantı reddedildi hatası bildirir ve iş akışı Submit CAPTCHA'da ölür.
Mac ve Windows için Docker Desktop'ta host'u şununla değiştirin: host.docker.internal ve bunu her iki URL'de de yapın. Linux'ta bu ad varsayılan olarak çözümlenmez; bu yüzden konteyneri başlatırken açıkça ekleyin.
# docker pull docker.n8n.io/n8nio/n8n # Linux: map host.docker.internal to the host gateway. docker run -it --rm \ --add-host=host.docker.internal:host-gateway \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ docker.n8n.io/n8nio/n8n # Both node URLs then become: # http://host.docker.internal:8080/in.php # http://host.docker.internal:8080/res.php
n8n ve çözücü aynı Docker ağında çalışıyorsa, bunun yerine servis adını kullanın. Kural her iki durumda da aynı: URL, terminalinizden değil, konteynerin içinden çözümlenebilmelidir.
CapSkip'i bunun yerine bir sunucuda çalıştırmak
CapSkip'in n8n ile aynı makinede bulunması gerekmez. Uygulamadaki bağlantı ayarları iki moda sahiptir ve ikincisi, bunun barındırılan bir n8n ile çalışmasını sağlayan moddur.
| Mod | Dinlediği adres | Ne zaman kullanılır |
|---|---|---|
| Yerel | 127.0.0.1, yalnızca o cihaz | n8n ve CapSkip aynı bilgisayarda çalışıyor |
| Sunucu | Ağınız veya genel IP adresiniz | n8n başka bir yerde çalışıyor: başka bir makine, bir VPS ya da n8n Cloud |
CapSkip'i Server modunda bir VPS'e kurun; ekibinizdeki her makine tek bir örneğe bağlansın. Node URL'leri http://YOUR_SERVER_IP:8080/in.php ve http://YOUR_SERVER_IP:8080/res.php olur ve iş akışında başka hiçbir şey değişmez. Statik bir genel IP edinmeye değer, çünkü URL'ler node'lara sabitlenmiştir ve değişen bir adres onları bozar.
Bu hâlâ sizin kendi donanımınızdır ve kullanım hâlâ ölçülmez. Server modu, çözücünün kime ait olduğunu değil, nerede çalıştığını değiştirir; yani her iki durumda da çözüm başına ödeme yapmazsınız.
Sık görülen hatalar ve anlamları
| Yanıt | Neden | Düzeltme |
|---|---|---|
ECONNREFUSED | Çözücü çalışmıyor ya da konteyner ana makineyi göremiyor | Yerel servisi başlatın, ardından yukarıdaki Docker düzeltmesini uygulayın |
ERROR_WRONG_USER_KEY | key alanı boş ya da eksik | Boş olmayan herhangi bir dize gönderin |
ERROR_GOOGLEKEY | sitekey yanlış, kırpılmış ya da başka bir sayfaya ait | Canlı sayfadaki data-sitekey özniteliğini yeniden okuyun |
ERROR_PAGEURL | pageurl alanında şema eksik ya da alan başka bir yeri gösteriyor | https dahil tam URL'yi gönderin |
| Döngü hiç bitmiyor | IF node'u yanlış yazılmış bir hazır dizesiyle karşılaştırma yapıyor | CAPCHA_NOT_READY yazımını birebir eşleştirin |
ERROR_CAPTCHA_UNSOLVABLE | İş zaman aşımına uğramadı, başarısız oldu | Yeni bir challenge değeriyle yeniden gönderin |
API'nin dönebileceği her kod şurada listelenmiştir: API dokümantasyonu, her birine hangi parametrenin yol açtığıyla birlikte.
FAQ
Bu, n8n Cloud'da çalışır mı?
Evet, CapSkip Server modundayken. Bulut çalışanları n8n’in altyapısında çalışır, bu yüzden masaüstünüzdeki 127.0.0.1 adresini göremez ve Local modun izin verdiği tek adres budur. Bağlantı ayarlarını Server moduna geçirin, CapSkip'i statik genel IP'li bir VPS'te çalıştırın ve node'ları o adrese yönlendirin. Her şeyi tek bir makinede tutmayı tercih ederseniz, n8n'i onunla birlikte kendiniz barındırın ve Local modda kalın.
Sorgulama döngüsü kaç çalıştırma harcar?
Bir tane. Bir iş akışının içindeki döngü, kaç kez dönerse dönsün tek bir çalıştırmadır; dolayısıyla Wait ve IF ikilisi çalıştırma sayınızı katlamaz. Ancak çalıştırmayı açık tutar; bu da küçük bir instance üzerinde aynı anda çok sayıda iş akışı çalıştırıyorsanız önem taşır.
Tek bir çalıştırmada birden fazla CAPTCHA çözebilir miyim?
Evet. HTTP Request node'u her giriş öğesi için bir kez çalışır; bu yüzden ona sitekey ve URL çiftlerinden oluşan bir liste verirseniz hepsini gönderir ve öğe başına bir captcha ID'si verir. Döngü boyunca ID'leri kaynak öğeleriyle eşleşmiş hâlde tutun; aynı anda kaç tanesinin işlemde olacağını sınırlamak isterseniz bir Split In Batches node'u kullanın.
Proxy'ye ihtiyacım var mı?
Genellikle hayır. proxy ve proxytype alanlarını gönderim node'una yalnızca, hedef site sayfayı yükleyen ağdan farklı bir ağda çözülen token'ları reddediyorsa ekleyin. Proxy'ler reCAPTCHA, Turnstile ve GeeTest için geçerlidir; görsel CAPTCHA'larda yok sayılır.
Gerçek bir iş akışına bağlamak
Yukarıdaki beş node, korumalı bir forma çarpan her iş akışına eklenebilir: bir müşteri adayı toplama kazıyıcısı, gecelik bir fiyat kontrolü, eski bir portala giriş yapan dahili bir araç. Çözücü, kendi donanımınızda çalışan bir captcha çözücü olduğu için, ona verdiğiniz sitekey'ler ve sayfa URL'leri makineden hiç çıkmaz ve döngünün çalıştırma başına bir maliyeti olmaz. HTTP Request node'ları yerine bir Code node'undan JavaScript veya Python ile çağırmayı tercih ederseniz, resmî SDK'lar aynı iki uç noktayı sarmalar; ayrıca reCAPTCHA v2'ye özgü ayrıntılar ayrı olarak ele alınmıştır.
