feat(auth): enhance Gemini web auth with macOS support and input fallback

- Added detection for macOS to adjust behavior for cookie input.
- Improved fallback prompts for missing cookies and email inputs.
This commit is contained in:
Luis Pater
2025-09-25 21:57:52 +08:00
parent 80b6a95eba
commit 8fa52e9d31

View File

@@ -10,6 +10,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
"runtime"
"strings" "strings"
"time" "time"
@@ -27,8 +28,11 @@ import (
// 3. Call https://accounts.google.com/ListAccounts with the cookie to obtain email. // 3. Call https://accounts.google.com/ListAccounts with the cookie to obtain email.
// 4. Save auth file with the same structure, and set Label to the email. // 4. Save auth file with the same structure, and set Label to the email.
func DoGeminiWebAuth(cfg *config.Config) { func DoGeminiWebAuth(cfg *config.Config) {
reader := bufio.NewReader(os.Stdin) var secure1psid, secure1psidts, email string
reader := bufio.NewReader(os.Stdin)
isMacOS := strings.HasPrefix(runtime.GOOS, "darwin")
if !isMacOS {
fmt.Print("Paste your full Google Cookie and press Enter: ") fmt.Print("Paste your full Google Cookie and press Enter: ")
rawCookie, _ := reader.ReadString('\n') rawCookie, _ := reader.ReadString('\n')
rawCookie = strings.TrimSpace(rawCookie) rawCookie = strings.TrimSpace(rawCookie)
@@ -53,24 +57,8 @@ func DoGeminiWebAuth(cfg *config.Config) {
} }
} }
} }
secure1psid = strings.TrimSpace(cookieMap["__Secure-1PSID"])
secure1psid := strings.TrimSpace(cookieMap["__Secure-1PSID"]) secure1psidts = strings.TrimSpace(cookieMap["__Secure-1PSIDTS"])
secure1psidts := strings.TrimSpace(cookieMap["__Secure-1PSIDTS"])
// Fallback: prompt user to input missing values
if secure1psid == "" {
fmt.Print("Cookie missing __Secure-1PSID. Enter __Secure-1PSID: ")
v, _ := reader.ReadString('\n')
secure1psid = strings.TrimSpace(v)
}
if secure1psidts == "" {
fmt.Print("Cookie missing __Secure-1PSIDTS. Enter __Secure-1PSIDTS: ")
v, _ := reader.ReadString('\n')
secure1psidts = strings.TrimSpace(v)
}
if secure1psid == "" || secure1psidts == "" {
log.Fatal("__Secure-1PSID and __Secure-1PSIDTS cannot be empty")
return
}
// Build HTTP client with proxy settings respected. // Build HTTP client with proxy settings respected.
httpClient := &http.Client{Timeout: 15 * time.Second} httpClient := &http.Client{Timeout: 15 * time.Second}
@@ -89,23 +77,25 @@ func DoGeminiWebAuth(cfg *config.Config) {
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
resp, err := httpClient.Do(req) resp, err := httpClient.Do(req)
email := ""
if err != nil { if err != nil {
fmt.Printf("Request to ListAccounts failed: %v\n", err) fmt.Printf("Request to ListAccounts failed: %v\n", err)
} else { } else {
defer resp.Body.Close() defer func() {
_ = resp.Body.Close()
}()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
fmt.Printf("ListAccounts returned status code: %d\n", resp.StatusCode) fmt.Printf("ListAccounts returned status code: %d\n", resp.StatusCode)
} else { } else {
var payload []any var payload []any
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil { if err = json.NewDecoder(resp.Body).Decode(&payload); err != nil {
fmt.Printf("Failed to parse ListAccounts response: %v\n", err) fmt.Printf("Failed to parse ListAccounts response: %v\n", err)
} else { } else {
// Expected structure like: ["gaia.l.a.r", [["gaia.l.a",1,"Name","email@example.com", ... ]]] // Expected structure like: ["gaia.l.a.r", [["gaia.l.a",1,"Name","email@example.com", ... ]]]
if len(payload) >= 2 { if len(payload) >= 2 {
if accounts, ok := payload[1].([]any); ok && len(accounts) >= 1 { if accounts, ok := payload[1].([]any); ok && len(accounts) >= 1 {
if first, ok := accounts[0].([]any); ok && len(first) >= 4 { if first, ok1 := accounts[0].([]any); ok1 && len(first) >= 4 {
if em, ok := first[3].(string); ok { if em, ok2 := first[3].(string); ok2 {
email = strings.TrimSpace(em) email = strings.TrimSpace(em)
} }
} }
@@ -117,6 +107,34 @@ func DoGeminiWebAuth(cfg *config.Config) {
} }
} }
} }
}
// Fallback: prompt user to input missing values
if secure1psid == "" {
if !isMacOS {
fmt.Print("Cookie missing __Secure-1PSID. ")
}
fmt.Print("Enter __Secure-1PSID: ")
v, _ := reader.ReadString('\n')
secure1psid = strings.TrimSpace(v)
}
if secure1psidts == "" {
if !isMacOS {
fmt.Print("Cookie missing __Secure-1PSID. ")
}
fmt.Print("Enter __Secure-1PSIDTS: ")
v, _ := reader.ReadString('\n')
secure1psidts = strings.TrimSpace(v)
}
if secure1psid == "" || secure1psidts == "" {
log.Fatal("__Secure-1PSID and __Secure-1PSIDTS cannot be empty")
return
}
if isMacOS {
fmt.Print("Enter your account email: ")
v, _ := reader.ReadString('\n')
email = strings.TrimSpace(v)
}
// Generate a filename based on the SHA256 hash of the PSID // Generate a filename based on the SHA256 hash of the PSID
hasher := sha256.New() hasher := sha256.New()