Explainers

Solve Media 验证码是什么:广告式验证码识别指南

一句话回答:Solve Media 是“把广告当验证码”的文字输入型验证码,图片里不是扭曲乱码,而是一句品牌口号,比如 “Taste The Rainbow”,照抄一遍就算通过。它本质是广告位,文字必须可读,在图片验证码里识别难度最低。

该产品后来并入 Permit.io / Radius Networks,新站点几乎不再部署,老系统仍在用。


它在页面上长什么样

交互只有四步:控件加载广告图片 → 用户读出短语并输入 → 服务端校验 → 通过后提交表单。

┌─────────────────────────────────┐
│                                 │
│   "Taste The Rainbow"           │
│                                 │
├─────────────────────────────────┤
│ Type the phrase: [____________] │
│                     [Verify]    │
└─────────────────────────────────┘

国内主流是 极验(GeeTest)、网易易盾、腾讯防水墙,滑块和点选是常态,抄写型早已退场。它基本只出现在一种场景:多年没动过的英文老站点。


怎么确认是 Solve Media

看 DOM 里有没有 adcopy 前缀的元素:

<!-- 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-outer 或脚本域名 api.solvemedia.com 即可确定,服务端校验的就是 adcopy_response。注意 CaptchaAI 没有 “Solve Media” 独立方法,它归在图片 / OCR 一类。


和普通文字验证码的差别

对比项 Solve Media 普通文字验证码
文字内容 品牌短语 随机字符
可读性
扭曲程度 很轻 很重
商业模式 广告变现
OCR 难度
用户体验 较好 较差

关键在最后两行:它是广告产品,不是安全产品——字做糊了广告就白投。


用 CaptchaAI 识别:Python 与 Node.js

流程和普通图片验证码一致:截图 → base64 提交 in.php → 轮询 res.php → 填回输入框。

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()

轮询每 5 秒一次、最多 30 次。国内装依赖走清华 TUNA 等镜像会快不少。

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');
}

Node.js 版本只负责拿短语,截图交给 Puppeteer 或 Playwright。


参数怎么填才不出错

参数 建议值 原因
phrase 1 短语带空格,是多个单词
numeric 2 短语基本只含字母
min_len / max_len 不设置 长度不定,写死会误判
大小写 原样提交 部分站点不区分大小写

最常见的翻车点是 phrase 留成 0:多词短语被当成单串,空格丢失,校验必失败。

CaptchaAI 按线程计费,BASIC $15/月(5 线程),识别次数不限,最低档够用。


常见问题

国内站点会遇到 Solve Media 吗?

基本不会。国内主流是极验、网易易盾、腾讯防水墙这类滑块与点选。会撞上它的多半是英文老站或旧系统维护。

不做截图 OCR,能直接拿到答案吗?

有时可以。部分实现把短语留在页面源码里,先查 adcopy_challenge,省一次识别。

短语提交后仍然失败,怎么排查?

按顺序查三处:截图是否截全、phrase 是否为 1、字段是不是 adcopy_response。都对还失败,多半是挑战过期,重载控件再跑。

同一套 OCR 代码还能识别哪些验证码?

只要是“图片里有文字、照抄即可”的类型都能用,比如老论坛的四位字符码。换类型只需调 phrasenumeric,主流程不动。


相关指南

该文章已禁用评论。