Skip to content

Go Server SDK

SDK sisi server Go resmi — github.com/Captcha-La/captchala-go.

Tiga tugas yang ditangani SDK ini untuk Anda:

  1. Validate — memverifikasi pass token pt_ dari browser SDK.
  2. Issue — mencetak server token sct_ sekali pakai untuk mengikat tantangan berikutnya ke aksi / IP / UID tertentu.
  3. Moderate — moderasi konten multi-modal (teks + gambar) terhadap pipeline yang kompatibel dengan OpenAI, sama seperti yang dipakai dashboard.

Pasang

bash
go get github.com/Captcha-La/captchala-go

Hanya stdlib. Tanpa dependency eksternal.

Validate (token pt_)

go
import captchala "github.com/Captcha-La/captchala-go"

client := captchala.NewClient(appKey, appSecret)

result, err := client.ValidateWithClientIP(token, false, clientIP(r))
if err != nil || !result.Valid {
    http.Error(w, result.Error, http.StatusBadRequest)
    return
}
// proceed with the request

// Real end-user IP behind a CDN / proxy
func clientIP(r *http.Request) string {
    if ip := r.Header.Get("CF-Connecting-IP"); ip != "" {
        return ip
    }
    if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
        return strings.TrimSpace(strings.Split(xff, ",")[0])
    }
    host, _, _ := net.SplitHostPort(r.RemoteAddr)
    return host
}

Jika server_token awal diterbitkan dengan bind_uid, bandingkan:

go
if result.UID != expectedUserID {
    http.Error(w, "user mismatch", http.StatusBadRequest)
    return
}

Argumen IP ValidateWithClientIP bersifat opsional tetapi disarankan — kirim IP pengguna akhir dari request masuk Anda; dipakai untuk pemeriksaan risiko tambahan. Aman untuk dihilangkan (lalu gunakan Validate / ValidateWithOptions). Konteks saat penyelesaian juga dikembalikan dalam result.CaptchaArgs sebagai referensi Anda:

go
ip := result.CaptchaArgs.UserIP   // visitor IP recorded at solve time

Menerbitkan server token

Disarankan untuk alur bernilai tinggi (login, registrasi, pembayaran): backend mencetak token sct_ sekali pakai, mengirimkannya ke peramban, peramban memakainya sebagai prop serverToken. Sekali pakai, terikat aksi, dan opsional terikat IP/UID.

go
issue, err := client.IssueServerTokenWithOptions("login", captchala.IssueOptions{
    BindingIP: userIP,    // backend menolak token jika IP berbeda yang menukarkannya
    TTL:       300,       // detik
    MaxUses:   5,         // anggaran retry SDK
    BindUID:   userID,    // dipasangkan dengan ValidateResult.UID saat verifikasi
})
if err != nil || !issue.OK {
    http.Error(w, issue.Error, http.StatusBadRequest)
    return
}
// kirim issue.Token ke peramban

Pintasan default:

go
issue, err := client.IssueServerToken("login")

Moderasi konten

Multi-modal — menerima slice ModerationItem (teks dan/atau image_url dalam format kompatibel OpenAI):

go
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") {
        // blokir keras
    }
}

Pintasan teks polos:

go
result, err := client.ModerationText("user comment here", userID)

Kategori ditentukan oleh model; iterasikan result.Categories secara defensif daripada meng-hardcode himpunan tetap.

Tipe

TipeField
ValidateResultValid, Error, UID, ChallengeID, Action, Offline, ClientOnly, Warning, CaptchaArgs
CaptchaArgsPlatform, UserIP, Referer, Pkg, SolvedAt, RiskScore (informasional)
IssueResultOK, Token, ExpiresIn, IssuedAt, Error, Message
IssueOptionsBindingIP, TTL, MaxUses, BindUID
ModerationItemType, Text, ImageURL (gunakan helper TextItem() / ImageURLItem())
ModerationResultOK, Flagged, Categories, ContentType, Raw, Error, Message; method HasCategory(...names)

Tautan

MIT-licensed examples · CaptchaLa is operated independently