package auth import ( "encoding/json" "fmt" "net/http" "net/http/cookiejar" "sync" "zai-proxy/internal/proxy" ) type AnonymousAuthResponse struct { Token string `json:"token"` } type SessionData struct { Token string Cookies []*http.Cookie } var ( sessionMu sync.RWMutex session *SessionData ) func ForceRefresh() { sessionMu.Lock() session = nil sessionMu.Unlock() } func GetAnonymousToken() (string, error) { sessionMu.RLock() if session != nil { t := session.Token sessionMu.RUnlock() return t, nil } sessionMu.RUnlock() return RefreshAnonymousSession() } func GetAnonymousSession() (*SessionData, error) { sessionMu.RLock() if session != nil { s := session sessionMu.RUnlock() return s, nil } sessionMu.RUnlock() return nil, fmt.Errorf("no session") } func RefreshAnonymousSession() (string, error) { jar, _ := cookiejar.New(nil) client := proxy.GetHTTPClient() // Primero visitar la página principal para obtener cookies CDN req1, _ := http.NewRequest("GET", "https://chat.z.ai/", nil) req1.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0") req1.Header.Set("Accept", "text/html") resp1, err := client.Do(req1) if err == nil { resp1.Body.Close() if resp1.Header["Set-Cookie"] != nil { jar.SetCookies(req1.URL, resp1.Cookies()) } } // Luego obtener el token req2, _ := http.NewRequest("GET", "https://chat.z.ai/api/v1/auths/", nil) req2.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0") req2.Header.Set("Accept", "application/json") req2.Header.Set("Origin", "https://chat.z.ai") // Agregar cookies del jar for _, c := range jar.Cookies(req2.URL) { req2.AddCookie(c) } resp2, err := client.Do(req2) if err != nil { return "", err } defer resp2.Body.Close() if resp2.StatusCode != http.StatusOK { return "", fmt.Errorf("status %d", resp2.StatusCode) } var authResp AnonymousAuthResponse if err := json.NewDecoder(resp2.Body).Decode(&authResp); err != nil { return "", err } // Guardar cookies allCookies := jar.Cookies(req2.URL) allCookies = append(allCookies, resp2.Cookies()...) // Agregar token como cookie allCookies = append(allCookies, &http.Cookie{Name: "token", Value: authResp.Token}) sessionMu.Lock() session = &SessionData{ Token: authResp.Token, Cookies: allCookies, } sessionMu.Unlock() return authResp.Token, nil }