SDK Go Server
SDK oficial server-side em Go — github.com/Captcha-La/captchala-go.
Três tarefas que o SDK executa para você:
- Validar — verifica um pass token
pt_vindo do SDK do navegador. - Emitir — cunha um server token
sct_de uso único para vincular o próximo desafio a uma action / IP / UID específica. - Moderar — moderação de conteúdo multimodal (texto + imagem) contra o mesmo pipeline compatível com OpenAI usado pelo painel.
Instalação
go get github.com/Captcha-La/captchala-goApenas stdlib. Sem dependências externas.
Validar (token pt_)
import captchala "github.com/Captcha-La/captchala-go"
client := captchala.NewClient(appKey, appSecret)
result, err := client.Validate(passToken)
if err != nil || !result.Valid {
http.Error(w, result.Error, http.StatusBadRequest)
return
}
// proceed with the requestSe o server_token original foi emitido com bind_uid, compare:
if result.UID != expectedUserID {
http.Error(w, "user mismatch", http.StatusBadRequest)
return
}Para tokens vinculados a IP, passe o IP do usuário no lado da verificação:
result, err := client.ValidateWithClientIP(passToken, false, userIP)Emitir um server token
Recomendado para fluxos de alto valor (login, cadastro, pagamento): o backend cunha um token sct_ de uso único, entrega ao navegador, o navegador o usa como a prop serverToken. De uso único, com escopo de action e opcionalmente vinculado a IP/UID.
issue, err := client.IssueServerTokenWithOptions("login", captchala.IssueOptions{
BindingIP: userIP, // backend rejects token if a different IP redeems it
TTL: 300, // seconds
MaxUses: 5, // SDK retry budget
BindUID: userID, // pair with ValidateResult.UID on verify
})
if err != nil || !issue.OK {
http.Error(w, issue.Error, http.StatusBadRequest)
return
}
// hand issue.Token to the browserAtalho apenas com padrões:
issue, err := client.IssueServerToken("login")Moderar conteúdo
Multimodal — aceita uma slice de ModerationItem (texto e/ou image_url em formato compatível com OpenAI):
result, err := client.ModerationCheck([]captchala.ModerationItem{
captchala.TextItem(userComment),
captchala.ImageURLItem(uploadedImageURL),
}, userID)
if err != nil || !result.OK {
http.Error(w, result.Error, http.StatusBadRequest)
return
}
if result.Flagged {
if result.HasCategory("violence", "csam") {
// hard block
}
}Atalho para texto puro:
result, err := client.ModerationText("user comment here", userID)As categorias são definidas pelo modelo; itere result.Categories de forma defensiva em vez de fixar um conjunto rígido.
Tipos
| Tipo | Campos |
|---|---|
ValidateResult | Valid, Error, UID, ChallengeID, Action, Offline, ClientOnly, Warning |
IssueResult | OK, Token, ExpiresIn, IssuedAt, Error, Message |
IssueOptions | BindingIP, TTL, MaxUses, BindUID |
ModerationItem | Type, Text, ImageURL (use os helpers TextItem() / ImageURLItem()) |
ModerationResult | OK, Flagged, Categories, ContentType, Raw, Error, Message; método HasCategory(...names) |