Извлечение текста с помощью OCR
Discuse извлекает текст из изображений и документов, чтобы вы могли читать — и модерировать — контент, который иначе был бы невидим для текстового фильтра. Отправьте до 5 URL изображений или документов на POST /api/v2/ocr, и в ответ вы получите распознанный текст, а по умолчанию — ещё и результаты проверки этого текста по правилам контента вашего проекта.
Зачем нужен OCR для модерации?
Много злоупотреблений скрывается внутри изображений: оскорбление, встроенное в мем, фишинговая ссылка на скриншоте, мошеннический номер телефона на листовке. Обычная проверка текста этого не увидит. OCR сначала извлекает слова, поэтому те же проверки тональности, спама, запрещённых слов и языка, которые вы уже применяете к тексту, можно применять и к изображениям и документам.
Как извлечь текст?
Отправьте один или несколько URL файлов. moderate по умолчанию имеет значение true, поэтому извлечённый текст также будет проверен, а в ответе вы получите объект results; установите значение false, если вам нужен только исходный текст.
curl -X POST https://api.discuse.com/api/v2/ocr \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"file_urls": ["https://example.com/user-meme.jpg"],
"moderate": true
}'
Один запрос принимает до 5 URL изображений или документов.
Ответ
{
"text": "BUY FOLLOWERS NOW — dm @spammer for 50% off",
"has_text": true,
"num_files": 1,
"has_violations": true,
"results": {
"hits": true,
"spamfinder": {
"label": "spam",
"confidence": 0.94,
"is_spam": true,
"hit": true
}
},
"usage": {
"api_requests_used": 412,
"api_requests_limit": 10000,
"api_requests_remaining": 9588
}
}
Когда moderate равно false (или текст не найден), results не включается в ответ, а has_violations равно false — вы получаете только извлечённый text.
Поля запроса
| Поле | Тип | Примечания |
|---|---|---|
api_key |
string | Необязательное поле в теле запроса; вместо него можно отправить X-API-Key |
file_urls |
string[] | URL изображений или документов для считывания. Требуется минимум один, максимум 5 |
moderate |
boolean | Пропустить извлечённый текст через ваши текстовые проверки. По умолчанию true |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
text |
string | Распознанный текст, объединённый по всем файлам |
has_text |
boolean | True, если был распознан любой непустой текст |
num_files |
number | Количество успешно прочитанных файлов |
has_violations |
boolean | True, если модерируемый текст сработал на одной из проверок |
results |
object | Результаты текстовой проверки (см. «Анализ текста»), присутствуют только если модерация была выполнена и текст найден |
usage |
object | api_requests_used, api_requests_limit, api_requests_remaining |
Объект results имеет ту же структуру, что и POST /api/v2/check: spamfinder, sentiment, language, badwords и флаг верхнего уровня hits. Подробности по полям см. в разделе Анализ текста.
Лимиты использования
OCR доступен на платных тарифах; каждый файл, из которого вы извлекаете текст, один раз списывается из вашей квоты OCR.
| Тариф | Ежемесячные извлечения OCR | Стоимость сверх лимита |
|---|---|---|
| Basic | Недоступно | - |
| Gold | 1,000 | $0.0015/извлечение |
| Platinum | 2,000 | $0.001275/извлечение (скидка 15%) |
| Ultimate | 4,000 | $0.001125/извлечение (скидка 25%) |
Если у проекта нет активной подписки, запросы OCR отклоняются.
Рекомендации
Модерируйте за один вызов
Оставляйте moderate включённым (значение по умолчанию), если ваша цель — находить нарушения правил в изображениях. Один вызов OCR одновременно извлекает текст и проверяет его, вместо того чтобы сначала делать вызов OCR, а затем отдельный вызов /check.
async function moderateImage(fileUrl) {
const res = await ocr([fileUrl], true);
if (res.has_violations) {
await flagForReview(fileUrl, res.results);
}
return res.text;
}
Проверяйте has_text перед действиями
Изображение без читаемого текста возвращает has_text: false и пустой text. Учитывайте это в логике, чтобы не трактовать «нечего читать» как «чисто и подтверждено».
Группируйте связанные файлы
Если отправка содержит несколько изображений, отправляйте их вместе (до 5) в одном запросе, а не по одному вызову на файл: меньше сетевых обращений и один ответ, учитываемый в квоте.
Примеры интеграции
Node.js
async function ocr(fileUrls, moderate = true) {
const response = await fetch('https://api.discuse.com/api/v2/ocr', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({ file_urls: fileUrls, moderate })
});
return response.json();
}
Python
import os
import requests
def ocr(file_urls, moderate=True):
response = requests.post(
'https://api.discuse.com/api/v2/ocr',
headers={
'Content-Type': 'application/json',
'X-API-Key': os.environ['DISCUSE_API_KEY']
},
json={'file_urls': file_urls, 'moderate': moderate}
)
return response.json()
Готовы считывать текст с изображений? Начните работу с Discuse.