Next.js Route Handler içinden çözücüyü çağırın

solvethree tarafından4 dk okuma

Görevi bir kez oluşturmak için sunucu tarafında bir POST işleyicisi kullanın, ardından GET ile kimliğini kullanarak görevi alın. solvethree anahtarını sunucuda tutun; tarayıcı doğrudan çözücüyü çağırmamalı veya her bekleme süresi dolduğunda yeni bir görev oluşturmamalıdır.

Bu sayfada

Sunucuyu ve site profilini yapılandırın

  • Node.js 22+ ve resmi JavaScript SDK'sını kullanın. Belgelerdeki paket URL'si üzerinden kurulum adımlarını izleyin; npm kayıt defterinde bir paket bulunduğunu varsaymayın.
  • Sunucu ortamında SOLVETHREE_API_KEY, CAPTCHA_SITE, SOLVETHREE_PROXY ve INTEGRATION_KEY değerlerini ayarlayın. Gizli anahtarların hiçbirine NEXT_PUBLIC_ öneki vermeyin.
  • Rotayı çağırmadan önce çalışma alanınızda hedef ana makine adı için bir profili etkinleştirin. CAPTCHA_SITE değerini ayarlamak profil oluşturmaz; site profili kurulumuna bakın.
  • Örnekteki login eylemini entegrasyonunuzun gerektirdiği eylemle değiştirin. İstek tek bir proxy kullanır ve varsayılan olarak reCAPTCHA Enterprise v3'ü seçer; type veya url alanlarına ihtiyaç duymaz.

Oluşturma ve alma işleyicisini ekleyin

Örneği app/api/captcha/route.js dosyasına yerleştirin. App Router HTTP işleyicilerini dışa aktarır ve SDK için Node.js çalışma zamanını açıkça seçer. Bunu statik olarak oluşturulan bir kaynak değil, istek anında çalışan bir sunucu rotası olarak tutun.

app/api/captcha/route.js · Node.js Route Handler
import { Solvethree, SolvethreeError } from '@solvethree/sdk';
export const runtime = 'nodejs';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
function authorized(request) {
  const key = process.env.INTEGRATION_KEY;
  return Boolean(key) && request.headers.get('x-integration-key') === key;
}
function failure(error) {
  return error instanceof SolvethreeError
    ? Response.json({ requestId: error.requestId, taskId: error.taskId }, { status: 502 })
    : Response.json({ error: 'Invalid task input or ID' }, { status: 400 });
}
export async function POST(request) {
  if (!authorized(request)) return new Response('Unauthorized', { status: 401 });
  try {
    return Response.json(await client.createTask({
      site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
      requestId: request.headers.get('x-request-id') ?? undefined,
    }, { waitMs: 0, signal: AbortSignal.timeout(20000) }));
  } catch (error) { return failure(error); }
}
export async function GET(request) {
  if (!authorized(request)) return new Response('Unauthorized', { status: 401 });
  const id = new URL(request.url).searchParams.get('id');
  if (!id) return Response.json({ error: 'Provide id' }, { status: 400 });
  try {
    return Response.json(await client.getTask(id, { waitMs: 15000, signal: AbortSignal.timeout(25000) }));
  } catch (error) { return failure(error); }
}

POST, createTask metodunu waitMs: 0 ile çağırır; böylece çözümü beklemeden görev yanıtını döndürür. Döndürülen görev kimliğini kaydedin. GET bu mevcut kimliği gerektirir ve getTask metodunu çağırır; hiçbir zaman görev oluşturmaz.

GET, 15 saniyeye kadar bekleme ister ve istek için ayrı bir 25 saniyelik iptal süresi uygular. POST için istek iptal süresi 20 saniyedir. Bu sınırlar görevin yaşam süresini değil, her bir isteği sınırlar.

Her görevi döndürmeden önce yetki kontrolü yapın

Tarayıcı erişimi için INTEGRATION_KEY değerini dağıtmak yerine uygulamanızın gerçek sunucu tarafı kimlik doğrulamasını kullanın. Yalnızca kimlik doğrulama yeterli değildir: kimliği doğrulanmış bir kullanıcıdan herhangi bir görev kimliğini kabul etmek, başka birinin sonucunu istemesine yine de izin verir.

  1. 1.

    Oluşturma işlemini çağrıyı yapanla ilişkilendirin

    Kimliği doğrulanmış bir POST isteği görev oluşturduktan sonra, kimliği döndürmeden önce bu kimliği doğrulanmış kullanıcı veya kiracıyla ilişkilendirerek saklayın. Kurtarma sırasında sahiplik kaydının kaybolmaması için mantıksal requestId değerini de aynı sahiple ilişkilendirin.

  2. 2.

    Almadan önce sahipliği kontrol edin

    GET isteğinde, çağrıyı yapanın kimliğini doğrulayın ve getTask çağrısından önce verilen kimliği sahiplik kaydıyla karşılaştırın. Çağrıyı yapana ait olmayan kimlikleri reddedin ve sonuçları yalnızca bu kontrol başarılı olduktan sonra döndürün.

Uygulamanız çağrıyı yapanlara bunları seçme yetkisini açıkça vermiyorsa site, eylem ve proxy değerlerini sunucunun kontrolünde tutun. Bu örnekteki sabit ortam değerleri, istemcinin bu girdileri değiştirmesini engeller.

Aynı görevi sorgulayın ve sonucu belirsiz istekleri kurtarın

  1. 1.

    Son duruma ulaşmamış görevleri sorgulamaya devam edin

    pending veya solving durumunda, uygulamanızın genel son süresine uyarak aynı kimlikle görevi yeniden alın. GET beklemesinin tamamlanması, yeni bir görev oluşturmak için gerekçe değildir.

  2. 2.

    ready veya failed durumunda durun

    Yalnızca ready durumu kullanılabilir bir çözüm içerir. failed durumunda sorgulamayı durdurun ve errorCode ile error alanlarını inceleyin; başarısız çözümlerin ücretleri iade edilir. Bir yanıtı görev olarak yorumlamadan önce başarılı olmayan HTTP yanıtlarını ele alın. Rotanın catch işleyicisi, döndürülen görev durumunu kontrol etmenin yerini tutmaz.

  3. 3.

    Bağlantı zaman aşımından sonra oluşturma işlemini kurtarın

    POST öncesinde bir x-request-id seçip saklayın. Görev kimliği aldıysanız bu kimlikle görevi alın. Oluşturma yanıtı kaybolduysa mevcut görevi kurtarmak için aynı istek kimliği ve değiştirilmemiş görev girdileriyle POST isteğini tekrarlayın. İstek kimlikleri 1–64 ASCII harfi, rakam, alt çizgi veya kısa çizgi kabul eder; aynı kimliği farklı girdiler için yeniden kullanmak çakışmaya yol açar.

ready durumundaki bir görev, solvethree'nin bir çözüm ürettiği anlamına gelir; hedefin çözümü kabul ettiği anlamına gelmez. SDK çözümü sizin yerinize göndermez. Gönderirken döndürülen userAgent ve secChUa değerlerini başarılı proxy ile, yani bu tek proxy'li örnekte yapılandırılmış proxy ile kullanın. İlgisiz bir tarayıcı kimliğine veya IP'ye geçmeyin.

İstek hataları veya son durum hataları için başka bir çözüme ödeme yapmadan önce API hata başvurusuna bakın. Geçersiz girdileri değiştirmeden yeniden denemek sorunu çözmez.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
Next.js Route Handler içinden çözücüyü çağırın · solvethree