Extração de texto com OCR
Discuse extrai texto de imagens e documentos para que você possa ler — e moderar — conteúdos que, de outra forma, ficariam invisíveis para um filtro de texto. Envie até 5 URLs de imagens ou documentos para POST /api/v2/ocr e você receberá o texto reconhecido; por padrão, esse texto também será processado pelas verificações de conteúdo do seu projeto.
Por que usar OCR para moderação?
Muitos abusos ficam escondidos dentro de imagens: um insulto incorporado a um meme, um link de phishing em uma captura de tela, um número de telefone fraudulento em um panfleto. Uma verificação de texto simples nunca vê isso. O OCR extrai as palavras primeiro, para que as mesmas verificações de sentimento, spam, palavrões e idioma que você já aplica a textos também sejam aplicadas a conteúdos de imagens e documentos.
Como faço para extrair texto?
Envie uma ou mais URLs de arquivos. moderate usa true como padrão, então o texto extraído também é verificado e você recebe um objeto results; defina como false se quiser apenas o texto bruto.
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
}'
Uma única requisição aceita até 5 URLs de imagens ou documentos.
Resposta
{
"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
}
}
Quando moderate é false (ou nenhum texto foi encontrado), results é omitido e has_violations é false — você recebe apenas o text extraído.
Campos da requisição
| Campo | Tipo | Observações |
|---|---|---|
api_key |
string | Opcional no corpo; você pode enviar X-API-Key em vez disso |
file_urls |
string[] | URLs de imagens ou documentos a serem lidos. Pelo menos uma é obrigatória, até 5 |
moderate |
boolean | Executa o texto extraído nas suas verificações de texto. O padrão é true |
Campos da resposta
| Campo | Tipo | Descrição |
|---|---|---|
text |
string | Texto reconhecido, concatenado de todos os arquivos |
has_text |
boolean | Verdadeiro se algum texto não vazio foi reconhecido |
num_files |
number | Número de arquivos lidos com sucesso |
has_violations |
boolean | Verdadeiro se o texto moderado acionou alguma verificação |
results |
object | Os resultados da verificação de texto (veja Análise de texto), presente apenas quando a moderação foi executada e texto foi encontrado |
usage |
object | api_requests_used, api_requests_limit, api_requests_remaining |
O objeto results tem o mesmo formato de POST /api/v2/check — spamfinder, sentiment, language, badwords e o sinalizador de nível superior hits. Veja Análise de texto para detalhes dos campos.
Limites de uso
OCR é um recurso de planos pagos; cada arquivo do qual você extrai texto conta uma vez na sua cota de OCR.
| Plano | Extrações mensais de OCR | Taxa excedente |
|---|---|---|
| Basic | Não disponível | - |
| Gold | 1.000 | $0.0015/extração |
| Platinum | 2.000 | $0.001275/extração (15% de desconto) |
| Ultimate | 4.000 | $0.001125/extração (25% de desconto) |
Se um projeto não tiver uma assinatura ativa, as requisições de OCR serão negadas.
Boas práticas
Modere em uma única chamada
Deixe moderate ativado (o padrão) quando seu objetivo for detectar violações de política em imagens. Uma única chamada de OCR extrai o texto e o verifica, em vez de uma chamada de OCR seguida de uma chamada separada para /check.
async function moderateImage(fileUrl) {
const res = await ocr([fileUrl], true);
if (res.has_violations) {
await flagForReview(fileUrl, res.results);
}
return res.text;
}
Verifique has_text antes de agir
Uma imagem sem texto legível retorna has_text: false e um text vazio. Use isso como ramificação para não tratar "nada para ler" como "limpo e confirmado".
Agrupe arquivos relacionados
Se um envio incluir várias imagens, envie-as juntas (até 5) em uma única requisição, em vez de fazer uma chamada por arquivo — menos idas e vindas, uma única resposta contabilizada na cota.
Exemplos de integração
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()
Pronto para ler texto em imagens? Comece com Discuse.