一句话回答: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 代码还能识别哪些验证码?
只要是“图片里有文字、照抄即可”的类型都能用,比如老论坛的四位字符码。换类型只需调 phrase、numeric,主流程不动。