Разрешение DNS — это невидимый налог на каждый вызов API CAPTCHA. Каждый раз, когда ваш код вызывает ocr.captchaai.com, система может выполнять поиск DNS — добавляя 5–200 мс в зависимости от вашего провайдера DNS, состояния кэша и условий сети. В этом руководстве объясняется, когда DNS становится узким местом и как его устранить.
Как DNS влияет на решение CAPTCHA
Одно решение CAPTCHA включает 5–7 HTTP-запросов (1 отправка + 4–6 опросов). Без кэширования DNS:
| Сценарий | DNS-запросы | Добавлена задержка |
|---|---|---|
| Нет кэширования, медленный DNS (по 200 мс каждый) | 7 | 1400 мс |
| Кэш DNS на уровне ОС (только первый вызов) | 1 | 200 мс |
| Поддержание соединения (0 новых запросов) | 0 | 0 мс |
| Предварительное разрешение DNS + поддержка активности | 0 | 0 мс |
Ключевой вывод: Если вы уже используете HTTP-поддержание активности (постоянные соединения), DNS не является вашей проблемой — одно и то же TCP-соединение повторно использует разрешенный IP-адрес. DNS имеет наибольшее значение, когда соединения создаются по запросу.
Когда DNS имеет значение
Разрешение DNS становится узким местом, когда:
- Новые соединения на каждый запрос — Нет
Session(Python) или агента поддержки активности (Node.js). - Холодный запуск контейнера или бессерверного сервера – на новых экземплярах нет кэшированного DNS.
- Медленные поставщики DNS – DNS интернет-провайдера по умолчанию без локального кеша.
- Параллельное решение больших объемов — Многие исполнители начинают работу одновременно.
Python: оптимизация DNS
Проверьте текущее поведение DNS
import socket
import time
# Measure DNS resolution time
hostname = "ocr.captchaai.com"
start = time.time()
ip = socket.getaddrinfo(hostname, 443)
first_resolve = time.time() - start
start = time.time()
ip = socket.getaddrinfo(hostname, 443)
second_resolve = time.time() - start
print(f"First resolve: {first_resolve*1000:.1f}ms")
print(f"Second resolve: {second_resolve*1000:.1f}ms (OS cached)")
Предварительное разрешение и кэширование
import os
import socket
import requests
from urllib3.util.connection import create_connection
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
# Pre-resolve the API hostname
CAPTCHAAI_IP = socket.getaddrinfo("ocr.captchaai.com", 443)[0][4][0]
print(f"Resolved ocr.captchaai.com to {CAPTCHAAI_IP}")
# Patch connection to use cached IP
DNS_CACHE = {"ocr.captchaai.com": CAPTCHAAI_IP}
class CachedHTTPAdapter(requests.adapters.HTTPAdapter):
def send(self, request, **kwargs):
return super().send(request, **kwargs)
# Use with Session for fastest resolution
session = requests.Session()
session.headers.update({"Connection": "keep-alive"})
# The session already maintains keep-alive, so DNS is resolved once
# For the first request, the OS cache handles subsequent lookups
resp = session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance", "json": "1",
})
print(f"Balance: {resp.json()}")
Используйте более быстрый преобразователь DNS
Настройте свою систему или приложение для использования быстрого общедоступного DNS:
# For systems where you control DNS configuration:
# /etc/resolv.conf (Linux) or system DNS settings
# Recommended: Cloudflare (1.1.1.1) or Google (8.8.8.8)
# In Python, you can also use dnspython for explicit resolution
import dns.resolver
resolver = dns.resolver.Resolver()
resolver.nameservers = ["1.1.1.1", "8.8.8.8"]
answers = resolver.resolve("ocr.captchaai.com", "A")
for answer in answers:
print(f"Resolved: {answer}")
JavaScript: оптимизация DNS
Измерьте разрешение DNS
const dns = require('dns');
const { performance } = require('perf_hooks');
const hostname = 'ocr.captchaai.com';
// First resolution
const start1 = performance.now();
dns.lookup(hostname, (err, address) => {
const time1 = performance.now() - start1;
console.log(`First resolve: ${time1.toFixed(1)}ms → ${address}`);
// Second resolution (OS cached)
const start2 = performance.now();
dns.lookup(hostname, (err2, address2) => {
const time2 = performance.now() - start2;
console.log(`Second resolve: ${time2.toFixed(1)}ms → ${address2}`);
});
});
Предварительное разрешение с помощью DNS-кэша
const dns = require('dns');
const https = require('https');
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
// Pre-resolve and cache
let cachedIP = null;
async function preResolve() {
return new Promise((resolve, reject) => {
dns.lookup('ocr.captchaai.com', (err, address) => {
if (err) reject(err);
cachedIP = address;
console.log(`Cached IP: ${cachedIP}`);
resolve(address);
});
});
}
// Use keep-alive agent (DNS resolved once per connection)
const agent = new https.Agent({
keepAlive: true,
maxSockets: 20,
keepAliveMsecs: 60000,
});
const api = axios.create({
baseURL: 'https://ocr.captchaai.com',
httpsAgent: agent,
timeout: 30000,
});
(async () => {
await preResolve();
const resp = await api.get('/res.php', {
params: { key: API_KEY, action: 'getbalance', json: '1' },
});
console.log(`Balance: ${resp.data}`);
})();
Бессерверные и контейнерные среды
В AWS Lambda, Google Cloud Functions и контейнерах Docker:
| Среда | Поведение кэша DNS | Рекомендация |
|---|---|---|
| AWS Лямбда | Кэшируется в контексте выполнения, теряется при холодном запуске. | Предварительное разрешение в инициализации обработчика |
| Облачные функции Google | Кэшируется внутри экземпляра | Предварительное разрешение в глобальном масштабе |
| Докер | По умолчанию использует DNS хоста | Настроить --dns 1.1.1.1 |
| Кубернетес | CoreDNS с настраиваемым кешем | Установите ndots: 1 в конфигурации DNS модуля. |
Поиск неисправностей
| Проблема | Причина | Исправить |
Следующие шаги
- CaptchaAI Quickstart: ваше первое решение CAPTCHA за 5 минут
- Как решить reCAPTCHA v2 через API: пошаговое руководство
- Как решить Cloudflare Turnstile через API
- Как решить GeeTest v3 с помощью API