Spaces:
Paused
Paused
| 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 | |
| } |