Spaces:
Paused
Paused
File size: 2,445 Bytes
48d903a c9a9c69 75c41dd cbe30d3 c9a9c69 75c41dd 8219f66 c9a9c69 75c41dd c9a9c69 75c41dd c9a9c69 75c41dd c9a9c69 75c41dd c9a9c69 75c41dd c9a9c69 75c41dd | 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 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
} |