كلاهما متغيرات reCAPTCHA v2 تستخدم نفس التقنية الأساسية. يُظهر إصدار مربع الاختيار "أنا لست روبوتًا" وقد يعرض شبكات صور. يتم تشغيل الإصدار غير المرئي تلقائيًا عند إجراء المستخدم (النقر على الزر، أو إرسال النموذج، أو تحميل الصفحة) بدون أي أداة مرئية. بالنسبة لحل CaptchaAI، فإن الاختلاف الوحيد هو إضافة invisible=1 إلى طلبك - لكن عملية حقن الرمز المميز تختلف بشكل كبير.
المقارنة جنبا إلى جنب
| ميزة | مربع الاختيار v2 | الإصدار 2 غير مرئي |
|---|---|---|
| القطعة مرئية | نعم — خانة الاختيار "أنا لست روبوتًا". | لا — مخفي عن المستخدمين |
| آلية المحفّز | ينقر المستخدم على مربع الاختيار | النقر على الزر أو إرسال النموذج أو تحميل الصفحة |
| تحدي الصورة | يظهر عندما يشتبه Google في وجود روبوت | نافذة منبثقة في الزاوية اليمنى السفلية عند الشك |
| تجربة المستخدم | احتكاك معتدل | احتكاك منخفض/zero |
| التنفيذ | أضف g-recaptcha div إلى الصفحة |
أضف data-callback إلى الزر أو grecaptcha.execute() |
| تنسيق مفتاح الموقع | نفس غير مرئية | نفس خانة الاختيار |
| حقل الرمز المميز | g-recaptcha-response |
g-recaptcha-response |
| وظيفة رد الاتصال | اختياري | مطلوب دائما تقريبا |
| طريقة CaptchaAI | method=userrecaptcha |
method=userrecaptcha + invisible=1 |
| عمر الرمز | 120 ثانية | 120 ثانية |
| حل الوقت | 10-30 ثانية | 10-25 ثانية |
كيف يظهر كل منها في HTML
مربع الاختيار v2
<!-- Standard checkbox widget -->
<div class="g-recaptcha"
data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
data-callback="onSubmit">
</div>
<!-- Widget renders as: -->
<!-- [✓] I'm not a robot reCAPTCHA logo -->
يرى المستخدم مربع الاختيار ويتفاعل معه. إذا كان Google مريبًا، فسيظهر اختبار شبكة الصور مضمنًا.
الإصدار 2 غير مرئي
<!-- Pattern 1: Invisible widget on a button -->
<button class="g-recaptcha"
data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
data-callback="onSubmit"
data-size="invisible">
Submit
</button>
<!-- Pattern 2: Invisible div (programmatic trigger) -->
<div class="g-recaptcha"
data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
data-size="invisible"
data-callback="onSubmit">
</div>
<!-- Pattern 3: Programmatic render -->
<script>
grecaptcha.render('submit-btn', {
sitekey: '6Le-wvkSAAAAAPBMRTvw...',
callback: onSubmit,
size: 'invisible'
});
</script>
لا توجد القطعة مرئية. يتم تنشيط reCAPTCHA عندما يقوم المستخدم بتشغيل العنصر المحدد أو عند استدعاء grecaptcha.execute().
كيفية اكتشاف المتغير الموجود على الصفحة
** كشف بايثون: **
import requests
from bs4 import BeautifulSoup
import re
def detect_recaptcha_variant(url):
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
# Check for invisible indicators
invisible_widget = soup.find(attrs={"data-size": "invisible", "class": "g-recaptcha"})
if invisible_widget:
return {
"variant": "invisible",
"sitekey": invisible_widget.get("data-sitekey"),
"callback": invisible_widget.get("data-callback")
}
# Check for programmatic invisible in scripts
for script in soup.find_all("script"):
if script.string and "invisible" in str(script.string):
key_match = re.search(r"sitekey['\"]?\s*[:=]\s*['\"]([^'\"]+)", script.string)
if key_match:
return {
"variant": "invisible-programmatic",
"sitekey": key_match.group(1),
"callback": "check grecaptcha.render() call"
}
# Check for standard checkbox
checkbox_widget = soup.find(class_="g-recaptcha")
if checkbox_widget:
return {
"variant": "checkbox",
"sitekey": checkbox_widget.get("data-sitekey"),
"callback": checkbox_widget.get("data-callback")
}
return None
result = detect_recaptcha_variant("https://example.com/login")
print(result)
كشف Node.js:
const axios = require("axios");
const cheerio = require("cheerio");
async function detectRecaptchaVariant(url) {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
// Check for invisible
const invisible = $(".g-recaptcha[data-size='invisible']");
if (invisible.length) {
return {
variant: "invisible",
sitekey: invisible.attr("data-sitekey"),
callback: invisible.attr("data-callback"),
};
}
// Check scripts for programmatic invisible
const scripts = $("script")
.map((_, el) => $(el).html())
.get()
.join("\n");
if (scripts.includes("invisible")) {
const keyMatch = scripts.match(/sitekey['"]?\s*[:=]\s*['"]([^'"]+)/);
if (keyMatch) {
return {
variant: "invisible-programmatic",
sitekey: keyMatch[1],
callback: "check render call",
};
}
}
// Check for standard checkbox
const checkbox = $(".g-recaptcha");
if (checkbox.length) {
return {
variant: "checkbox",
sitekey: checkbox.attr("data-sitekey"),
callback: checkbox.attr("data-callback"),
};
}
return null;
}
فحص سريع لوحدة تحكم المتصفح:
const el = document.querySelector('[data-size="invisible"]');
console.log(el ? "Invisible reCAPTCHA" : "Checkbox reCAPTCHA");
| إشارة الكشف | مربع الاختيار v2 | الإصدار 2 غير مرئي |
|---|---|---|
data-size="invisible" |
غير موجود | الحاضر |
| مربع اختيار مرئي على الصفحة | نعم | لا |
تم استدعاء grecaptcha.execute() |
لا (نقرات المستخدم) | نعم (برمجي) |
| تحدي الموقف المنبثق | مضمنة، أسفل مربع الاختيار | الزاوية اليمنى السفلى من الصفحة |
الحل باستخدام CaptchaAI
مربع الاختيار v2
import requests
import time
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAA...",
"pageurl": "https://example.com/form"
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
الإصدار 2 غير مرئي
import requests
import time
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAA...",
"pageurl": "https://example.com/form",
"invisible": 1 # Only parameter difference
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
حقن الرمز المميز – الفرق الحاسم
مربع الاختيار v2: الحقل المخفي عادة ما يكون كافيًا
# Selenium — inject into hidden field
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# If the page uses a callback, also call it
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
driver.execute_script(f'{callback}("{token}");')
الإصدار 2 غير مرئي: رد الاتصال مطلوب دائمًا تقريبًا
# Selenium — inject AND call the callback
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# CRITICAL: Invisible reCAPTCHA almost always requires calling the callback
callback_name = driver.find_element(
"css selector", ".g-recaptcha[data-size='invisible']"
).get_attribute("data-callback")
driver.execute_script(f'{callback_name}("{token}");')
// Puppeteer — invisible callback injection
await page.evaluate((tok) => {
// Set the hidden field
document.getElementById("g-recaptcha-response").value = tok;
// Find and call the callback function
const widget = document.querySelector("[data-size='invisible']");
const cbName = widget?.getAttribute("data-callback");
if (cbName && typeof window[cbName] === "function") {
window[cbName](tok);
}
}, token);
الفرق الرئيسي: غالبًا ما تعمل نماذج مربع الاختيار v2 مع إدخال الحقل المخفي فقط لأن نقر المستخدم على مربع الاختيار سجل رد الاتصال بالفعل. لا تحتوي خدمة reCAPTCHA غير المرئية على هذه النقرة مطلقًا، ويجب استدعاء رد الاتصال بشكل صريح.
حل عالمي لكلا الخيارين
import requests
import time
from bs4 import BeautifulSoup
class RecaptchaV2UniversalSolver:
def __init__(self, api_key):
self.api_key = api_key
def detect_and_solve(self, page_url, page_html=None):
if not page_html:
page_html = requests.get(page_url).text
soup = BeautifulSoup(page_html, "html.parser")
# Detect variant
invisible = soup.find(attrs={"data-size": "invisible", "class": "g-recaptcha"})
widget = invisible or soup.find(class_="g-recaptcha")
if not widget:
raise Exception("No reCAPTCHA widget found")
sitekey = widget.get("data-sitekey")
is_invisible = invisible is not None
callback = widget.get("data-callback")
params = {
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
}
if is_invisible:
params["invisible"] = 1
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
return {
"token": result.text.split("|")[1],
"variant": "invisible" if is_invisible else "checkbox",
"callback": callback,
"sitekey": sitekey
}
if result.text != "CAPCHA_NOT_READY":
raise Exception(f"Solve error: {result.text}")
raise Exception("Timed out")
# Usage
solver = RecaptchaV2UniversalSolver("YOUR_API_KEY")
result = solver.detect_and_solve("https://example.com/login")
print(f"Variant: {result['variant']}, Callback: {result['callback']}")
استكشاف الأخطاء وإصلاحها
| مشكلة | إصلاح خانة الاختيار | إصلاح غير مرئي |
|---|---|---|
| الرمز غير مقبول | أدخل في حقل g-recaptcha-response |
حقن واستدعاء الدالة data-callback |
| لم يتم العثور على القطعة | ابحث عن فئة .g-recaptcha |
تحقق من وجود data-size="invisible" أو استدعاءات عرض البرنامج النصي |
| يتم إرسال النموذج ولكنه يفشل | تحقق مما إذا كان رد الاتصال متوقعًا | رد الاتصال مطلوب دائمًا تقريبًا - ابحث عنه واتصل به |
| يتم إعادة تحميل الصفحة بعد الحقن | فشل التحقق من صحة JavaScript | رد الاتصال before مشغلات الإرسال التلقائي |
الأسئلة الشائعة
هل يصعب حل اختبار reCAPTCHA غير المرئي؟
لا. عملية الحل من خلال CaptchaAI متطابقة تقريبًا. إن إضافة invisible=1 إلى طلبك هو التغيير الوحيد. التحدي الإضافي يكمن في جانب الحقن: يجب عليك العثور على وظيفة رد الاتصال وتنفيذها.
هل يستخدم كلاهما نفس تنسيق مفتاح الموقع؟
نعم. تنسيق مفتاح الموقع متطابق. لا يمكنك معرفة المتغير من مفتاح الموقع وحده — تحقق من وجود data-size="invisible" في HTML.
هل لا يزال اختبار reCAPTCHA غير المرئي يعرض تحديات الصورة؟
نعم. عندما يكتشف Google سلوكًا مريبًا، يعرض اختبار reCAPTCHA غير المرئي نافذة منبثقة لاختبار الصورة في الركن السفلي الأيسر من الصفحة. ولهذا السبب لا تزال بحاجة إلى CaptchaAI - لا يزال من الممكن أن يمثل الإصدار غير المرئي تحديات.
هل يمكن للموقع التبديل بين خانة الاختيار وغير المرئي؟
نعم. يعد هذا تغييرًا في التكوين في نهاية الموقع — نفس مفتاح الموقع، ولكن التنفيذ مختلف. تستخدم بعض المواقع مربع الاختيار على سطح المكتب وغير مرئي على الهاتف المحمول. اكتشف دائمًا المتغير ديناميكيًا.
أيهما أسرع في الحل؟
عادةً ما تكون الحلول غير المرئية أسرع قليلاً (10-25 ثانية مقابل 10-30 ثانية) لأنها تميل إلى إثارة عدد أقل من تحديات الصورة. لكن الفارق هامشي.