--- title: Go Sunucu SDK --- # Go Sunucu SDK Resmi Go sunucu tarafı SDK'sı — `github.com/Captcha-La/captchala-go`. SDK'nın sizin için üstlendiği üç iş: 1. **Validate** — tarayıcı SDK'sından gelen bir `pt_` pass token'ını doğrulayın. 2. **Issue** — gelecek challenge'ı belirli bir action / IP / UID'ye bağlamak için tek seferlik bir `sct_` server token'ı basın. 3. **Moderate** — panelin kullandığı OpenAI uyumlu pipeline ile çok modlu (metin + görüntü) içerik moderasyonu. ## Kurulum ```bash go get github.com/Captcha-La/captchala-go ``` Yalnızca stdlib. Harici bağımlılık yok. ## Doğrulama (`pt_` token) ```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 } ``` Orijinal `server_token`, `bind_uid` ile düzenlendiyse karşılaştırın: ```go if result.UID != expectedUserID { http.Error(w, "user mismatch", http.StatusBadRequest) return } ``` `ValidateWithClientIP`'in IP argümanı **isteğe bağlı ancak önerilir** — son kullanıcının IP'sini gelen isteğinizden geçirin; ek risk kontrolleri için kullanılır. Atlanması güvenlidir (o zaman `Validate` / `ValidateWithOptions` kullanın). Çözüm anındaki bağlam, başvurunuz için `result.CaptchaArgs` içinde de döndürülür: ```go ip := result.CaptchaArgs.UserIP // visitor IP recorded at solve time ``` ## Sunucu token'ı düzenleme Yüksek değerli akışlar (giriş, kayıt, ödeme) için önerilir: backend tek seferlik bir `sct_` token basar, tarayıcıya iletir, tarayıcı bunu `serverToken` prop'u olarak kullanır. Tek kullanımlık, action kapsamlı, isteğe bağlı IP/UID-bağlı. ```go 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 browser ``` Yalnızca varsayılan değerlerle kısayol: ```go issue, err := client.IssueServerToken("login") ``` ## İçerik moderasyonu Çok modlu — OpenAI uyumlu formatta `ModerationItem` slice'ı kabul eder (metin ve/veya image_url): ```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") { // hard block } } ``` Düz metin kısayolu: ```go result, err := client.ModerationText("user comment here", userID) ``` Kategoriler model tanımlıdır; sabit bir küme kodlamak yerine `result.Categories` üzerinde defansif olarak iterasyon yapın. ## Türler | Tür | Alanlar | |---|---| | `ValidateResult` | `Valid`, `Error`, `UID`, `ChallengeID`, `Action`, `Offline`, `ClientOnly`, `Warning`, `CaptchaArgs` | | `CaptchaArgs` | `Platform`, `UserIP`, `Referer`, `Pkg`, `SolvedAt`, `RiskScore` (yalnızca bilgi amaçlı) | | `IssueResult` | `OK`, `Token`, `ExpiresIn`, `IssuedAt`, `Error`, `Message` | | `IssueOptions` | `BindingIP`, `TTL`, `MaxUses`, `BindUID` | | `ModerationItem` | `Type`, `Text`, `ImageURL` (`TextItem()` / `ImageURLItem()` yardımcılarını kullanın) | | `ModerationResult` | `OK`, `Flagged`, `Categories`, `ContentType`, `Raw`, `Error`, `Message`; `HasCategory(...names)` yöntemi | ## Bağlantılar - [pkg.go.dev](https://pkg.go.dev/github.com/Captcha-La/captchala-go) · [GitHub](https://github.com/Captcha-La/captchala-go) - [Web SDK genel bakışı](/tr/web-sdk) · [API Referansı](/tr/api-reference)