Postman'da CAPTCHA Nasıl Çözülür ve Token İçin Nasıl Yoklama Yapılır

Postman'da tek satır uygulama kodu yazmadan captcha çözebilirsiniz. API 2captcha uyumludur ve kendi makinenizde çalışır; yani iki istek yeter: görevi /in.php adresine POST edip ID'yi saklayın, sonra /res.php adresini cevap gelene kadar yoklayın. Kısa bir post-response betiği bu ikinci isteği bir döngüye dönüştürür, bir koleksiyon değişkeni de ID'yi ikisi arasında taşır. Bu kılavuzda tam alan listesi, her iki betik ve döngünün sonsuza kadar dönmesini engelleyen tek ayar var.
Neye ihtiyacınız var
- Postman masaüstü uygulaması. 127.0.0.1 ile araya hiçbir agent girmeden doğrudan konuşur. Web uygulaması aşağıda ele alınıyor ve fazladan tek bir parçaya ihtiyaç duyuyor
- CapSkip'in çalışıyor ve erişilebilir olması. Local mod, aynı makinedeki bir istemci için 127.0.0.1 üzerinde 8080 portunu dinler; Server mod ise ağınızı veya genel IP'nizi dinler, böylece bir dizüstü, bir takım arkadaşınız ya da barındırılan bir runner ona erişebilir. Her ikisi de şurada anlatılıyor: bağlantı ayarları
- Karşısında çözüm yapılacak bir sitekey ve bir sayfa URL'si
Başka hiçbir şey. SDK yok, bağımlılık yok, hesap yok. Anahtar doğrulaması varsayılan olarak kapalıdır, bu yüzden boş olmayan herhangi bir dize anahtar değeri olarak iş görür; hiçbir şey göndermemek ise bir çözüm yerine ERROR_WRONG_USER_KEY döndürür.
Önce üç koleksiyon değişkeni tanımlayın
Bunları bir ortam yerine koleksiyonun üzerine koyun. Bir koleksiyon değişkeni dışa aktarımla birlikte taşınır; böylece başka biri içe aktardığında her şey yine çalışır.
| Değişken | Başlangıç değeri | Neden |
|---|---|---|
| baseUrl | http://127.0.0.1:8080 | Çözücü bir sunucuya taşındığında değiştirilecek tek yer |
| apiKey | capskip | Boş olmayan herhangi bir dize. Doğrulama varsayılan olarak kapalı |
| captchaId | boş | Gönderim betiği yazar, yoklama isteği okur |
İstek 1: görevi gönderin
{{baseUrl}}/in.php adresine, form gövdesiyle bir POST. Ham JSON değil, x-www-form-urlencoded seçin: API form alanlarını okur.
| Anahtar | Değer |
|---|---|
| key | {{apiKey}} |
| method | userrecaptcha |
| googlekey | YOUR_SITEKEY |
| pageurl | https://example.com/page-with-recaptcha |
| json | 1 |
json=1 alanı Postman'da bir terminaldekinden daha çok işe yarar. Onsuz yanıt, düz OK dizesinin ardından bir dikey çizgi ve ID olur; bunu elle ayırmanız gerekir. Onunla bir nesne alırsınız ve biçimli görüntüleme çalışır.
Bunu Scripts sekmesine, Post-response altına ekleyin. Eski Postman sürümleri aynı sekmeye Tests diyor.
// Post-response script on the submit request.
const body = pm.response.json();
pm.test('task accepted', function () {
pm.expect(body.status).to.eql(1);
});
// Hand the ID to the polling request.
pm.collectionVariables.set('captchaId', body.request);Yanıt şekli her CAPTCHA türü için aynıdır. Görev kabul edildiğinde status 1 olur ve ilgilendiğiniz değer her zaman request alanındadır.
{"status": 1, "request": "2122988149"}Parametre adına dikkat edin. reCAPTCHA googlekey alır, Turnstile ise sitekey alır; yanlış olanı göndermek ERROR_GOOGLEKEY yanıtının olağan nedenidir. Turnstile çözücü sayfasında, doğrulama sayfaları için tam alan listesi var; bu sayfalar ayrıca sayfadan kazınan cData ve chlPageData değerlerine de ihtiyaç duyar.
Diğer sekiz tür için aynı istek
Yalnızca gönderim isteği değişir. Beş method değeri CapSkip’in desteklediği her türü kapsar; çeşitler ayrı uç noktalar değil, aynı form gövdesindeki fazladan alanlardır. İstek 1’i çoğaltın, son sütunu uygulayın ve isteğin geri kalanına dokunmayın.
| Tür | method şu değere ayarlanır | Sonra gövdede şunu değiştirin |
|---|---|---|
| Görsel, yüklenen dosya | method = post | Gövdeyi form-data’ya çevirin ve görseli file olarak ekleyin |
| Görsel, base64 | method = base64 | googlekey ve pageurl alanlarını çıkarın, kodlanmış görseli body ile gönderin |
| reCAPTCHA v2 checkbox | method = userrecaptcha | Hiçbir şey. Yukarıda gösterilen istek zaten bu |
| reCAPTCHA v2 Invisible | method = userrecaptcha | invisible alanını 1 değeriyle ekleyin |
| reCAPTCHA Enterprise | method = userrecaptcha | enterprise alanını 1 değeriyle ekleyin |
| reCAPTCHA v3 | method = userrecaptcha | version alanını v3 olarak ve bir action ekleyin |
| Turnstile widget'ı | method = turnstile | googlekey alanını sitekey olarak yeniden adlandırın |
| Turnstile challenge sayfası | method = turnstile | googlekey alanını sitekey olarak yeniden adlandırın, sonra data ve pagedata ekleyin |
| GeeTest v3 | method = geetest | googlekey yerine gt ve challenge gönderin |
Bunlardan ikisi özellikle Postman tarafında dikkat ister. Yüklenen görsel, x-www-form-urlencoded kullanamayan tek türdür, çünkü dosya için multipart gövde gerekir; bu yüzden sadece o isteği form-data’ya çevirin. GeeTest ise süreyle yarışır: challenge değeri yaklaşık bir dakikada geçerliliğini yitirir, o yüzden daha önce kaydettiğiniz bir değeri yeniden kullanmak yerine göndermeden hemen önce alın.
Yoklama isteği hiç değişmez. Bunu bir koleksiyon olarak kurmanın asıl gerekçesi de budur: tek bir İstek 2 listedeki her türe hizmet eder, çünkü cevap her zaman aynı biçimde döner.
İstek 2: cevap gelene kadar yoklayın
{{baseUrl}}/res.php adresine, aynı form gövdesi biçimiyle bir POST.
| Anahtar | Değer |
|---|---|
| key | {{apiKey}} |
| action | get |
| id | {{captchaId}} |
| json | 1 |
İş çalışırken bu, tam olarak böyle yazılan, eksik harf dahil CAPCHA_NOT_READY döndürür. Bu bir hata değil bir durumdur ve ona verilecek tek doğru karşılık yeniden sormaktır.
// Post-response script on the polling request.
const body = pm.response.json();
const tries = Number(pm.collectionVariables.get('tries') || 0);
if (body.request === 'CAPCHA_NOT_READY' && tries < 20) {
// Run this same request again.
pm.collectionVariables.set('tries', tries + 1);
pm.execution.setNextRequest(pm.info.requestId);
} else {
pm.collectionVariables.set('captchaToken', body.request);
pm.collectionVariables.set('tries', 0);
pm.execution.setNextRequest(null);
}O betikte ayrıca belirtmeye değer üç şey var, çünkü her biri bir öğleden sonrayı kaybetmenin bir yolu.
Döngü yalnızca Collection Runner'da çalışır. Postman’in kendi dokümantasyonu, tek bir isteği tek başına gönderdiğinizde setNextRequest'in hiçbir etkisi olmadığını açıkça belirtiyor; bu yüzden yoklama isteğinde Send'e tıklamak onu yalnızca bir kez gönderir ve betik ölü görünür. Koleksiyonu, Postman CLI'yi veya Newman'ı çalıştırın.
Sayaç isteğe bağlı değil. Bir üst sınır olmadan, hiçbir zaman çözülmeyen bir görev, çalıştırmayı elle durdurana kadar döner. Beş saniye arayla yirmi deneme yüz saniyeden fazla bekleme demektir; bu da bir reCAPTCHA v2 görevinin ihtiyaç duyduğu 15-20 saniyeyi rahatlıkla karşılar.
İsteğe ID ile referans verin. pm.info.requestId geçirmek, döngüyü o an çalışan isteğe yöneltir; böylece sonradan yeniden adlandırmak zinciri sessizce bozmaz.
Runner'a bir gecikme verin, yoksa uç noktayı yorarsınız
Yukarıdaki betik, runner'ın gidebildiği kadar hızlı döner ve iki saniyedir çalışan bir işi yoklamak boşa emektir. Collection Runner'ın çalıştırma yapılandırmasında, her istekten önce uygulanan ve milisaniye cinsinden olan bir Delay alanı vardır. Bunu 5000 yapın.
İlk yoklamadan önce ne kadar bekleyeceğiniz, ne gönderdiğinize bağlıdır:
| Tür | Şundan önce hazır olmaz |
|---|---|
| Görsel | 1 saniye |
| reCAPTCHA v2 | 15 ila 20 saniye |
| reCAPTCHA v3 | 10 ila 15 saniye |
| GeeTest v3 | yaklaşık 5 saniye |
Newman'da aynı ayar bir komut satırı bayrağıdır; bu yüzden uygulamada çalışan bir koleksiyon CI'da değişmeden çalışır.
# npm install -g newman newman run captcha.postman_collection.json --delay-request 5000
Bunun yerine düz metin yanıtını okumak
json=1 alanını çıkarın, gövde metin olarak döner; bu da bazen tam istediğiniz şeydir. İki yardımcı bunu karşılar.
// Plain text mode: OK|2122988149
const id = pm.response.text().split('|')[1];
// Turnstile also returns the user agent, as a header.
const ua = pm.response.headers.get('X-Turnstile-User-Agent');O başlık bir merak konusu değil. Cloudflare bir Turnstile token'ını, onu üreten tarayıcı parmak izine bağlar; bu yüzden token aynı user agent ile gönderilmelidir, aksi halde token kusursuz biçimde geçerliyken bile site onu reddeder.
Özellikle Postman kullanıcılarını yakalayan bir kural daha var, çünkü uygulama Send'e iki kez tıklamayı çok kolaylaştırıyor: bir sonuç yalnızca bir kez okunabilir. Aynı ID'nin ikinci okumasında yanıt boş döner; bu da tıpkı başarısız bir çözüm gibi görünür. Token'ı ilk okumada bir değişkende saklayın.
Agent meselesi ve Postman'ı bir sunucuya yöneltmek
Masaüstü uygulaması yerine Postman web uygulamasını kullanıyorsanız istekler bir agent üzerinden gider ve agent seçimi, 127.0.0.1'e erişilip erişilemeyeceğini belirler. Cloud Agent, Postman’in altyapısında çalışır ve özel bir ağdaki hiçbir şeye erişemez. Desktop Agent ise sizin makinenizde çalışır ve erişebilir.
| Postman'ı nasıl çalıştırdığınız | Yerel bir çözücüye erişebilir mi? |
|---|---|
| Masaüstü uygulaması | Evet, agent gerekmez |
| Desktop Agent ile web uygulaması | Evet, agent sizin makineniz üzerinden yönlendirir |
| Cloud Agent ile web uygulaması | Hayır, özel bir ağı göremez |
Server mod bu hesabı değiştirir. CapSkip'i, ağınızı veya bir genel IP'yi dinleyen bir makinede çalıştırın, baseUrl değişkenini ona işaret edecek şekilde düzenleyin; koleksiyondaki her istek onu takip eder. Başka hiçbir şey değişmez, çünkü yer değiştiren tek şey adrestir.
# The collection variable is the only edit. baseUrl = http://YOUR_SERVER_IP:8080
Statik bir genel IP önerilir ve adımlar şurada: bağlantı ayarları. Server mod hâlâ sizin kendi donanımınızdır ve kullanım hâlâ ölçülmez: çözücünün kime ait olduğunu değil, nerede dinlediğini değiştirir.
Sık görülen hatalar ve anlamları
| Gördüğünüz | Neden | Düzeltme |
|---|---|---|
ERROR_WRONG_USER_KEY | {{apiKey}} çözümlenmediği için key alanı boş geldi | apiKey’i, seçmeyi hatırlamanız gereken bir ortamda değil, koleksiyon üzerinde tanımlayın |
ERROR_WRONG_METHOD | method'da ya da action değerinde bir yazım hatası | İkisi de form alanıdır, HTTP metodu değil: gönderim bir method alanı alır, yoklama ise action alanının get olmasını ister |
ERROR_GOOGLEKEY | Bir Turnstile sitekey'i userrecaptcha'ya gönderildi | method değerini alan adıyla eşleştirin |
ERROR_PAGEURL | Sayfa URL'sinde şema yok ya da URL kesilmiş | https'yi dahil edin ve sorgu dizesi yerine form gövdesi kullanın |
| Boş yanıt gövdesi | O ID zaten bir kez okundu | Token'ı ilk okumada saklayın; yenisi için yeniden gönderin |
| İstek gönderilemedi, bağlantı reddedildi | O adreste dinleyen hiçbir şey yok | Çözücüyü başlatın ya da Desktop Agent'ın seçili olduğunu kontrol edin |
| Betik çalışıyor ama hiçbir şey döngüye girmiyor | Koleksiyonu çalıştırmak yerine Send'e tıkladınız | setNextRequest yalnızca bir koleksiyon çalıştırmasında işe yarar |
API'nin döndürebileceği her kodun tam ifadesi şurada: API dokümantasyonu.
Sık sorulan sorular
Her şeyi tek bir istekte yapabilir miyim?
Teknik olarak evet, bir pre-request betiğinde pm.sendRequest ile; ama buna nadiren değer. Sandbox kısa betikler için tasarlanmıştır, bu yüzden engelleyici bir yoklama, beklerken hiçbir geri bildirim vermeden isteğin askıda kalmış gibi görünmesine yol açar. İki istek artı runner size her denemeyi gösterir; zaten kod yerine Postman'da olmanın nedeni de budur.
Bu, Newman üzerinden CI'da çalışır mı?
Evet. setNextRequest, Newman'da ve Postman CLI'de tıpkı uygulamadaki gibi çalışır; bu yüzden dışa aktarılan bir koleksiyon değişmeden çalışır. Halletmeniz gereken tek şey erişilebilirlik: barındırılan bir runner'ın kendi loopback adresi vardır, dolayısıyla çözücünün, runner'ın yönlendirebileceği bir adreste Server modda olması gerekir.
Kuyruğa kaç tane alabileceğime dair bir hız sınırı var mı?
Hayır. İstediğiniz kadar görev gönderin ve her ID'yi bağımsız olarak yoklayın. İş, başkasının paylaşımlı kuyruğunda değil kendi donanımınızda gerçekleşir; dolayısıyla üst sınır bir kota ya da bakiye değil, makinenizin bunları ne kadar hızlı bitirdiğidir.
Postman'dan ne zaman mezun olmalı
Postman; API'nin çalıştığını kanıtlamak, yeni bir CAPTCHA türünü keşfetmek ve bir meslektaşınıza içe aktarıp çalıştırabileceği bir şey vermek için doğru araçtır. Üretim için yanlış araçtır ve bunun başlıca nedeni yoklamadır: runner her seferinde sabit gecikmesini sonuna kadar bekler, oysa resmî SDK'lar 250 milisaniyede yoklamaya başlar ve kademeli olarak açılır; böylece hızlı bir çözüm hızlı döner. Ayrıca hata dizelerini tipli istisnalara dönüştürürler.
Aynı iki çağrıyı bir kabuk betiğinde görmek için bkz. cURL adım adım kılavuzu. Her iki durumda da çağrılar kendi makinenize gider ve bir koleksiyonu yöneltmeye değer kılan şey de budur: sınırsız captcha çözücü kullanıyor olmanız. Alanları doğru ayarlarken koleksiyonu yirmi kez çalıştırabilirsiniz ve bunun size kendi CPU'nuzdan başka bir maliyeti olmaz.
