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
}