File size: 1,207 Bytes
ac613eb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package internal
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
)
type captchaProviderResponse struct {
OK bool `json:"ok"`
Token string `json:"token"`
Error string `json:"error"`
}
// fetchCaptchaToken 从 captcha provider 服务获取验证码 token
func fetchCaptchaToken() (string, error) {
if Cfg.CaptchaProviderURL == "" {
return "", nil
}
url := strings.TrimRight(Cfg.CaptchaProviderURL, "/") + "/token"
client := &http.Client{Timeout: 75 * time.Second}
resp, err := client.Get(url)
if err != nil {
return "", fmt.Errorf("captcha provider request failed: %w", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("captcha provider read body failed: %w", err)
}
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("captcha provider status %d: %s", resp.StatusCode, string(body)[:min(200, len(body))])
}
var result captchaProviderResponse
if err := json.Unmarshal(body, &result); err != nil {
return "", fmt.Errorf("captcha provider decode failed: %w", err)
}
if !result.OK {
return "", fmt.Errorf("captcha provider error: %s", result.Error)
}
return result.Token, nil
}
|