چالش جدید کد QR در Recaptcha بهصورت بومی توسط Anti-Captcha پشتیبانی میشود
تیم Anti-Captcha تأیید کرده است که چالش Recaptcha با یک کد QR جدید بهصورت بومی توسط سرویس ما پشتیبانی میشود. هیچ تغییری در یکپارچهسازی شما لازم نیست: از آنجا که هر کپچا در Anti-Captcha توسط افراد واقعی حل میشود، کارگران ما این چالش جدید را همانطور که یک بازدیدکنندهی عادی وبسایت انجام میدهد، مدیریت میکنند.

چالش کد QR در Recaptcha چیست
گوگل این چالش جدید را در تابستان ۲۰۲۶ معرفی کرد. در حال حاضر پیش از عرضه برای همه مشتریان Recaptcha، در حالت بسته روی مجموعهای محدود از وبسایتها در حال آزمایش است. بهجای انتخاب تصاویر یا زدن تیک یک چکباکس، به کاربر یک کد QR نمایش داده میشود و از او خواسته میشود تأیید را روی گوشی موبایل خود کامل کند. چالش کد QR به یک نسخه واحد از Recaptcha وابسته نیست: هم در وبسایتهایی که از Recaptcha V2 استفاده میکنند و هم در وبسایتهایی که از Recaptcha V3 استفاده میکنند ظاهر میشود.
ایدهی پشت آن ساده است: برای یک ربات نسبتاً ارزان است که یک مرورگر دسکتاپ را شبیهسازی کند، اما شبیهسازی یک گوشی هوشمند فیزیکی واقعی با دوربین، یک سیستمعامل اصیل و دسترسی به فروشگاههای رسمی اپلیکیشن بسیار دشوارتر است.
ویژگیهای فنی
- با محوریت موبایل. این چالش را نمیتوان در همان مرورگری که نمایش داده میشود تکمیل کرد. تأیید به یک دستگاه جداگانه — گوشی هوشمند کاربر — منتقل میشود و مرورگر فقط منتظر تأیید میماند.
- با دوربین گوشی اسکن میشود. کد QR با اپلیکیشن دوربین معمولی گوشی اسکن میشود. به هیچ اسکنر QR شخص ثالثی نیاز نیست: دوربین کد را تشخیص میدهد و پیشنهاد میکند که تأیید را باز کند.
- توسط مینیاپهای Google Play و App Store حل میشود. اسکن کد یک مینیاپ سبک را که از طریق Google Play (اندروید با Google Play Services 25.41.30) یا App Store (iOS 15/16+) توزیع میشود، اجرا میکند. مینیاپ بدون نصب کامل بلافاصله باز میشود و تأیید را روی دستگاه انجام میدهد.
- تأیید گرهخورده به دستگاه. نتیجه به یک دستگاه فیزیکی واقعی گره خورده است که خودکارسازی این چالش با مرورگرهای headless، شبیهسازها یا حلکنندههای مبتنی بر هوش مصنوعی را بسیار دشوار میکند.
چگونه کارگران Anti-Captcha آن را مدیریت میکنند
ما یک آزمایش داخلی میان کارگران Anti-Captcha انجام دادیم: حدود ۵۰٪ از آنها توانستند چالش جدید را بلافاصله حل کنند با استفاده از گوشیهای خودشان، بدون هیچ دستورالعمل یا آمادهسازی اضافی. بقیه بیشتر نیاز دارند سیستمعامل خود را بهروزرسانی کنند یا به یک دستگاه پشتیبانیشده تغییر دهند که موضوعی زمانی است نه یک مانع واقعی.
دقیقاً همینجاست که یک سرویس مبتنی بر نیروی انسانی بر حلکنندههای خودکار برتری دارد. فردی با یک گوشی هوشمند معمولی این چالش را در چند ثانیه تکمیل میکند، در حالی که یک ربات باید مزرعهای از دستگاههای واقعی را به کار بگیرد تا همان کار را انجام دهد.
این برای مشتریان ما چه معنایی دارد
شما به همان روشی که اکنون انجام میدهید، به ارسال وظایف Recaptcha V2 یا V3 ادامه میدهید. وقتی یک وبسایت چالش کد QR را نمایش میدهد، توسط کارگران ما روی گوشیهایشان حل میشود و شما یک توکن g-recaptcha-response معمولی را در نتیجه وظیفه دریافت میکنید.
چگونه بفهمیم یک وبسایت از کدام نسخه Recaptcha استفاده میکند
صفحه دارای captcha را در Chrome باز کنید، کنسول توسعهدهنده را باز کنید (F12، سپس تب Console)، اسکریپت زیر را جایگذاری کنید و Enter را بزنید. آن را پس از ظاهر شدن captcha روی صفحه اجرا کنید، برای مثال پس از کلیک روی دکمه ارسال فرم.
(() => {
const out = { scripts: [], iframes: [], clients: [], verdict: [] };
// 1. Loaded Recaptcha scripts
document.querySelectorAll('script[src*="recaptcha"]').forEach(s => {
const u = new URL(s.src, location.href);
out.scripts.push({
src: u.pathname,
enterprise: u.pathname.includes('enterprise'),
render: u.searchParams.get('render'),
});
});
// 2. Anchor-iframe
document.querySelectorAll('iframe[src*="/anchor"]').forEach(f => {
const u = new URL(f.src);
out.iframes.push({
enterprise: u.pathname.includes('/enterprise/'),
sitekey: u.searchParams.get('k'),
size: u.searchParams.get('size'),
action: u.searchParams.get('sa'),
s: u.searchParams.has('s'),
});
});
// 3. Internal config: look for objects with a sitekey
const seen = new WeakSet();
const walk = (o, depth = 0) => {
if (!o || typeof o !== 'object' || seen.has(o) || depth > 6) return;
seen.add(o);
if (typeof o.sitekey === 'string') {
out.clients.push({
sitekey: o.sitekey,
size: o.size,
action: o.action,
callback: typeof o.callback === 'function' ? o.callback.name || 'fn'
: o.callback || null,
badge: o.badge,
});
}
for (const k in o) { try { walk(o[k], depth + 1); } catch {} }
};
try { walk(window.___grecaptcha_cfg?.clients); } catch {}
// 4. Verdict
const renderKey = out.scripts.find(s => s.render && s.render !== 'explicit' && s.render !== 'onload');
const ent = out.scripts.some(s => s.enterprise) || !!window.grecaptcha?.enterprise;
if (renderKey) out.verdict.push(`v3/score (render=${renderKey.render})`);
out.iframes.forEach(i => {
if (i.size === 'normal' || i.size === 'compact') out.verdict.push(`v2 checkbox (${i.sitekey})`);
else if (i.size === 'invisible' && (!renderKey || renderKey.render !== i.sitekey))
out.verdict.push(`v2 invisible (${i.sitekey})`);
});
if (ent) out.verdict.push('Enterprise');
console.table(out.scripts);
console.table(out.iframes);
console.table(out.clients);
console.log('VERDICT:', out.verdict.length ? out.verdict.join(' | ') : 'not found (the captcha may not be loaded yet)');
return out;
})();این اسکریپت اسکریپتهای Recaptcha، ویجتها و تنظیمات آنها (sitekey، size، action) را بهصورت جدول چاپ میکند و سپس یک خط VERDICT میآید:
v3/score— Recaptcha V3: مقدار sitekey در پارامترrenderاسکریپت Recaptcha ارسال میشود.v2 checkbox/v2 invisible— Recaptcha V2 با یک چکباکس یا یک ویجت نامرئی.Enterprise— وبسایت از Recaptcha Enterprise (اسکریپتenterprise.js) استفاده میکند.
از sitekey موجود در خروجی بهعنوان کلید وبسایت، و از مقدار action، در صورت وجود، بهعنوان اکشن صفحه در نمونهکدهای زیر استفاده کنید.
نمونهکدها
نسخه Recaptcha یافتشده در وبسایت را انتخاب کنید:
چگونه Recaptcha QR را در Python حل کنیم
#pip3 install anticaptchaofficial
from anticaptchaofficial.recaptchav2enterpriseproxyless import *
solver = recaptchaV2EnterpriseProxyless()
solver.set_verbose(1)
solver.set_key("YOUR_API_KEY_HERE")
solver.set_website_url("https://website.com")
solver.set_website_key("YOUR_API_KEY_HERE")
# set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
solver.set_is_invisible(True)
# Set page action value:
solver.set_enterprise_payload({"action": "form_submit"})
g_response = solver.solve_and_return_solution()
if g_response != 0:
print("g-response: "+g_response)
# user-agent in case you need it:
print("user-agent: "+solver.get_user_agent())
else:
print("task finished with error "+solver.error_code)