الشروحات المعمقة

ما هو Solve Media CAPTCHA وكيف يعمل

إذا فتحت كود صفحة قديمة ووجدت حقلاً مخفياً باسم adcopy_response ومربّع إدخال يطلب كتابة عبارة تسويقية مثل «Taste The Rainbow»، فأنت أمام Solve Media: كابتشا نصية تعرض رسالة إعلانية داخل صورة بدل الحروف العشوائية المشوّهة، وتُحَلّ تقنياً بالمسار نفسه الذي تُحَلّ به أي كابتشا صورة عبر OCR.

الفكرة التجارية خلفه كانت بسيطة: بدل أن يضيّع الزائر وقته في فكّ رموز بلا معنى، يقرأ شعار علامة تجارية تدفع مقابل الظهور. أما الأثر التقني لهذه الفكرة فهو ما يهمّك كمطوّر: النص واضح ومقروء عن قصد، وهذا يجعله من أطوع أنواع الكابتشا أمام محرّكات التعرّف الضوئي على الحروف. انتقل Solve Media لاحقاً إلى Permit.io / Radius Networks وتراجع انتشاره كثيراً، لكنه ما زال حاضراً في نماذج تسجيل وصفحات تعليقات لم تُحدَّث منذ سنوات.


دورة التحقق في Solve Media خطوة بخطوة

المسار كامل يجري بين المتصفح وخوادم Solve Media في أربع مراحل:

  1. تُحمَّل الأداة داخل النموذج وتعرض عبارة إعلانية على هيئة صورة
  2. يقرأ المستخدم العبارة ويكتبها في حقل الإدخال المجاور
  3. ترسل الصفحة النص إلى خوادم Solve Media للتحقق منه
  4. عند تطابق النص، يُستكمل إرسال النموذج
┌─────────────────────────────────┐
│                                 │
│   "Taste The Rainbow"           │
│                                 │
├─────────────────────────────────┤
│ Type the phrase: [____________] │
│                     [Verify]    │
└─────────────────────────────────┘

لاحظ ما لا يوجد في هذه الدورة: لا بصمة متصفح، ولا تقييم سلوكي، ولا رمز جلسة طويل العمر. المخرَج النهائي نصّ عادي يُوضع في adcopy_response ويُرسل مع adcopy_challenge الذي يحدّد أي تحدٍّ كان معروضاً. هذا الفارق البنيوي يفسّر لماذا يختلف التعامل معه جذرياً عن reCAPTCHA أو Cloudflare Turnstile: هناك تنتظر رمزاً يصدره مزوّد الحماية، وهنا تقرأ نصاً من صورة وتكتبه.


كيف تتعرّف على Solve Media داخل كود الصفحة

قبل كتابة سطر واحد من الأتمتة، تأكّد أن ما أمامك Solve Media فعلاً وليس أداة صور أخرى. ابحث عن هذه البصمات في مصدر الصفحة:

<!-- Solve Media script -->
<script src="https://api.solvemedia.com/papi/challenge.script"></script>

<!-- Widget container -->
<div id="adcopy-outer"></div>

<!-- Hidden response fields -->
<input type="hidden" name="adcopy_challenge" />
<input type="hidden" name="adcopy_response" />

أي عنصر يبدأ معرّفه بـ adcopy- أو يحمل اسم solvemedia دليل كافٍ. صورة التحدي نفسها تُعرض عادةً داخل #adcopy-puzzle-image، وهو العنصر الذي ستلتقط منه اللقطة قبل إرسالها للحل.


حلّ Solve Media عبر CaptchaAI بمسار الصور

لا توجد طريقة مخصّصة تحمل اسم Solve Media في CaptchaAI، ولا حاجة إليها. ما دام التحدي نصاً داخل صورة، فمسار الصور القياسي يكفي: أرسل الصورة بترميز base64 إلى in.php، احتفظ بالمعرّف العائد، ثم استطلع res.php حتى تصل الاستجابة. محرّك الصور في CaptchaAI يغطّي أكثر من 27,500 نمط صورة من بينها أنماط Solve Media، والزمن المعلن لحل كابتشا الصور أقل من 0.5 ثانية مع معدّل نجاح مرتفع على الأنواع المدعومة.

Python

import requests
import time
import base64

API_KEY = "YOUR_API_KEY"

# Capture the CAPTCHA image
# Method 1: Screenshot the widget
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/page-with-solvemedia")

captcha_img = driver.find_element(By.CSS_SELECTOR, "#adcopy-puzzle-image img")
captcha_img.screenshot("solvemedia.png")

# Submit to CaptchaAI
with open("solvemedia.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "base64",
    "body": img_b64,
    "phrase": 1,      # Contains spaces (multi-word phrase)
    "json": 1
})

task_id = response.json()["request"]

# Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        text = result["request"]
        print(f"Phrase: {text}")
        break

# Type the phrase
driver.find_element(By.CSS_SELECTOR, "#adcopy_response").send_keys(text)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Node.js

const axios = require('axios');
const fs = require('fs');

async function solveSolveMedia(imagePath) {
  const imageB64 = fs.readFileSync(imagePath).toString('base64');

  const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: 'YOUR_API_KEY',
      method: 'base64',
      body: imageB64,
      phrase: 1,
      json: 1
    }
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

المنطق واحد في اللغتين: التقط الصورة، حوّلها إلى base64، أرسلها إلى نقطة النهاية، احتفظ بالمعرّف، استطلع النتيجة حتى تصبح status مساوية 1، ثم اكتب النص العائد في حقل adcopy_response وأرسل النموذج.


المعاملات التي تصنع الفارق في معدل الحل

ضبط أربعة معاملات فقط هو ما يفصل بين نتيجة نظيفة وسلسلة إخفاقات بلا سبب ظاهر:

المعامل الضبط الموصى به لماذا
phrase 1 عبارات Solve Media مكوّنة من كلمتين أو أكثر تفصل بينها مسافات
numeric 2 العبارات حروف فقط في الغالب الأعم، بلا أرقام
min_len / max_len اتركهما دون ضبط طول العبارة يتغيّر من تحدٍّ لآخر
حالة الأحرف أرسل النص كما ورد بعض التطبيقات تتحقق من الحالة وبعضها يتجاهلها

وإذا بدأت ترى استجابات خطأ متكرّرة بدل النص المتوقّع، فالسبب غالباً في جودة اللقطة أو في هذه المعاملات لا في الخدمة نفسها؛ راجع أخطاء OCR الشائعة وطرق إصلاحها قبل أن ترفع عدد المحاولات.


لماذا يُعدّ أسهل من الكابتشا النصية التقليدية

المقارنة مع الكابتشا النصية التقليدية توضّح لماذا لا يستحق Solve Media بنية معالجة خاصة به:

المعيار Solve Media الكابتشا النصية التقليدية
محتوى النص عبارات علامات تجارية وكلمات إنجليزية حقيقية حروف وأرقام عشوائية
وضوح القراءة عالٍ – صُمّم ليُقرأ منخفض – صُمّم ليصعب
مستوى التشويه محدود جداً كثيف
نموذج الإيرادات إعلاني لا يوجد
صعوبة التعرّف الضوئي منخفضة، النص نظيف مرتفعة، النص مشوّه
تجربة المستخدم أفضل، كلمات مألوفة أسوأ، فكّ رموز

السبب في هذا الفارق أن Solve Media وُلد منتجاً إعلانياً لا منتجاً أمنياً: كلما صعُبت قراءة العبارة، ضاعت الرسالة التسويقية التي دفع المعلن مقابلها. الأمان كان أثراً جانبياً، والوضوح كان الهدف المعلن.


متى تستغني عن OCR تماماً

ليست كل صفحة تحتاج إلى التقاط صورة. في تطبيقات غير قليلة يكون نص التحدي أو معرّفه متاحاً في مصدر الصفحة أو في استجابة الواجهة التي تحمّل الأداة، وعندها يصبح تمرير الصورة خطوة زائدة. رتّب الكود على هذا الأساس:

  1. افحص الحقل المخفي adcopy_challenge أولاً؛ فإن وجدت ما تحتاجه هناك تكون قد وفّرت رحلة شبكة كاملة وزمن استطلاع لا داعي له.
  2. اجعل مسار الصور البديل الاحتياطي الذي يعمل حين لا يكون النص متاحاً في الصفحة.

حالة عملية: نموذج تعليقات عربي ما زال يعمل بـ Solve Media

السيناريو الأكثر شيوعاً في السوق العربي ليس موقعاً حديثاً، بل بوابة محتوى أو منتدى أو موقع إعلانات مبوّبة أُطلق في مطلع العقد الماضي وما زال يعمل بالتكامل نفسه دون تحديث. فريق يشغّل مجموعة اختبارات انحدار ليلية على نموذج تعليقات كهذا يصطدم بثلاث نقاط عملية:

  • العبارة إنجليزية والصفحة عربية. واجهة الموقع بالعربية واتجاه الصفحة rtl، لكن نص التحدي يبقى إنجليزياً لأنه في الأصل نصّ إعلاني للمعلن. لا تضبط خطوة الحل على العربية، وأرسل الصورة كما هي.
  • الحقل داخل نموذج rtl. ترتيب العناصر بصرياً معكوس، لذا حدّد الحقل بمُحدّد CSS صريح مثل #adcopy_response بدل الاعتماد على ترتيب العناصر في الصفحة أو على موقعها المرئي.
  • الحجم صغير والتزامن هو ما يحدّد التكلفة. مجموعة اختبارات تُشغَّل ليلياً وتنفّذ بضعة آلاف من عمليات الحل شهرياً لا تحتاج أكثر من خطة BASIC — 15 دولاراً شهرياً مقابل 5 threads. الفوترة في CaptchaAI محسوبة على عدد الـ threads المتزامنة مع عدد حلول غير محدود لكل thread، فما يحدّد الخطة هو ذروة التزامن لا إجمالي العمليات.

القاعدة العملية هنا: شغّل هذا المسار على نموذج تملكه أنت وضمن اختبارات جودة معتمدة. هذا هو الموضع الذي تحتاج فيه فعلاً إلى أتمتة موثوقة لمسار تسجيل قديم لا تريد أن ينكسر بصمت مع كل إصدار.


الأسئلة الشائعة

أربعة أسئلة تتكرّر كلما ظهر Solve Media في بيئة إنتاج قديمة:

هل تظهر عبارة Solve Media بالعربية على المواقع العربية؟

لا في الغالب. العبارة نصّ إعلاني يأتي من شبكة المعلنين، وكانت إنجليزية في معظم عمليات النشر. تعامل معها كنص إنجليزي عند ضبط معاملات التعرّف الضوئي حتى لو كانت بقية الصفحة عربية بالكامل.

ما الفرق بين adcopy_challenge وadcopy_response؟

  • adcopy_challenge — معرّف التحدي المعروض حالياً، وتضعه الأداة تلقائياً في النموذج.
  • adcopy_response — الحقل الذي تُكتب فيه العبارة المقروءة من الصورة.

لا يُقبل الإرسال إلا إذا وصل الحقلان معاً ضمن الجلسة نفسها، ولهذا لا يكفي أن ترسل النص الصحيح وحده.

لماذا يُرفض النموذج أحياناً رغم أن النص المُستخرج صحيح؟

غالباً لأن التحدي انتهت صلاحيته. لكل تحدٍّ نافذة زمنية قصيرة، فإذا طالت دورة الالتقاط والاستطلاع وصل النص الصحيح بعد فوات الأوان. أعد تحميل الأداة والتقط تحدياً جديداً بدل إعادة إرسال العبارة نفسها.

هل أحتاج طريقة API مخصّصة لـ Solve Media في CaptchaAI؟

لا. استخدم مسار الصور القياسي — method=base64 أو method=post — مع phrase=1، وهو المسار نفسه الذي تستخدمه لأي كابتشا نصية داخل صورة. للبدء من الصفر راجع دليل البدء السريع مع CaptchaAI.


أدلة ذات صلة

لتعميق التعامل مع كابتشا الصور داخل مسار الأتمتة:

التعليقات غير مفعّلة لهذا المقال.