Go Server SDK
SDK sisi pelayan Go rasmi — github.com/Captcha-La/captchala-go.
Tiga tugas yang dikendalikan SDK untuk anda:
- Sahkan — sahkan token pass
pt_daripada SDK pelayar. - Keluarkan — cetak token pelayan
sct_sekali guna untuk mengikat cabaran yang akan datang kepada tindakan / IP / UID tertentu. - Kawal selia — pengawasan kandungan pelbagai mod (teks + imej) terhadap saluran serasi-OpenAI yang sama digunakan oleh papan pemuka.
Pemasangan
go get github.com/Captcha-La/captchala-goStdlib sahaja. Tiada kebergantungan luaran.
Sahkan (token pt_)
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 asal dikeluarkan dengan bind_uid, bandingkan:
if result.UID != expectedUserID {
http.Error(w, "user mismatch", http.StatusBadRequest)
return
}Argumen IP ValidateWithClientIP adalah pilihan tetapi disyorkan — hantar IP pengguna akhir daripada permintaan masuk anda; ia digunakan untuk pemeriksaan risiko tambahan. Selamat untuk ditinggalkan (kemudian gunakan Validate / ValidateWithOptions). Konteks masa penyelesaian turut dikembalikan dalam result.CaptchaArgs untuk rujukan anda:
ip := result.CaptchaArgs.UserIP // visitor IP recorded at solve timeKeluarkan token pelayan
Disyorkan untuk aliran bernilai tinggi (log masuk, pendaftaran, pembayaran): backend mencetak token sct_ sekali guna, menyerahkannya kepada pelayar, dan pelayar menggunakannya sebagai prop serverToken. Sekali guna, terhad kepada tindakan, secara pilihan diikat IP/UID.
issue, err := client.IssueServerTokenWithOptions("login", captchala.IssueOptions{
BindingIP: userIP, // backend menolak token jika IP berbeza menebusnya
TTL: 300, // saat
MaxUses: 5, // bajet cuba semula SDK
BindUID: userID, // pasangkan dengan ValidateResult.UID semasa pengesahan
})
if err != nil || !issue.OK {
http.Error(w, issue.Error, http.StatusBadRequest)
return
}
// serahkan issue.Token kepada pelayarPintasan lalai sahaja:
issue, err := client.IssueServerToken("login")Kawal selia kandungan
Pelbagai mod — menerima keping ModerationItem (teks dan/atau image_url dalam format serasi-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") {
// sekatan keras
}
}Pintasan teks biasa:
result, err := client.ModerationText("user comment here", userID)Kategori ditakrifkan oleh model; lelarkan result.Categories secara defensif dan bukannya mengekod set tetap.
Jenis
| Jenis | Medan |
|---|---|
ValidateResult | Valid, Error, UID, ChallengeID, Action, Offline, ClientOnly, Warning, CaptchaArgs |
CaptchaArgs | Platform, UserIP, Referer, Pkg, SolvedAt, RiskScore (untuk maklumat sahaja) |
IssueResult | OK, Token, ExpiresIn, IssuedAt, Error, Message |
IssueOptions | BindingIP, TTL, MaxUses, BindUID |
ModerationItem | Type, Text, ImageURL (gunakan pembantu TextItem() / ImageURLItem()) |
ModerationResult | OK, Flagged, Categories, ContentType, Raw, Error, Message; kaedah HasCategory(...names) |