160 lines
4.1 KiB
Go
160 lines
4.1 KiB
Go
package main
|
||
|
||
import (
|
||
"cursor-api-proxy/internal/providers/geminiweb"
|
||
"fmt"
|
||
"os"
|
||
|
||
"github.com/go-rod/rod"
|
||
"github.com/go-rod/rod/lib/launcher"
|
||
"github.com/go-rod/rod/lib/proto"
|
||
)
|
||
|
||
func main() {
|
||
fmt.Println("Starting Gemini DOM detection...")
|
||
fmt.Println("This will open a browser and analyze the Gemini web interface.")
|
||
fmt.Println()
|
||
|
||
// 啟動可見瀏覽器
|
||
l := launcher.New().Headless(false)
|
||
url, err := l.Launch()
|
||
if err != nil {
|
||
fmt.Fprintf(os.Stderr, "Failed to launch browser: %v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
browser := rod.New().ControlURL(url)
|
||
if err := browser.Connect(); err != nil {
|
||
fmt.Fprintf(os.Stderr, "Failed to connect browser: %v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
defer browser.Close()
|
||
|
||
page, err := browser.Page(proto.TargetCreateTarget{URL: "about:blank"})
|
||
if err != nil {
|
||
fmt.Fprintf(os.Stderr, "Failed to create page: %v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
// 載入 cookies(如果有)
|
||
home, _ := os.UserHomeDir()
|
||
cookieFile := home + "/.cursor-api-proxy/gemini-accounts/session-1/cookies.json"
|
||
if _, err := os.Stat(cookieFile); err == nil {
|
||
cookies, err := geminiweb.LoadCookiesFromFile(cookieFile)
|
||
if err == nil {
|
||
geminiweb.SetCookiesOnPage(page, cookies)
|
||
fmt.Println("Loaded existing cookies")
|
||
}
|
||
}
|
||
|
||
// 導航到 Gemini
|
||
fmt.Println("Navigating to gemini.google.com...")
|
||
if err := geminiweb.NavigateToGemini(page); err != nil {
|
||
fmt.Fprintf(os.Stderr, "Failed to navigate: %v\n", err)
|
||
}
|
||
|
||
fmt.Println()
|
||
fmt.Println("Browser is now open. Please:")
|
||
fmt.Println("1. Log in if needed")
|
||
fmt.Println("2. Wait for the chat interface to fully load")
|
||
fmt.Println("3. Look for the model selector dropdown")
|
||
fmt.Println()
|
||
fmt.Println("Press Enter to analyze the DOM...")
|
||
fmt.Scanln()
|
||
|
||
// 分析 DOM
|
||
analyzeDOM(page)
|
||
|
||
fmt.Println()
|
||
fmt.Println("Press Enter to close...")
|
||
fmt.Scanln()
|
||
}
|
||
|
||
func analyzeDOM(page *rod.Page) {
|
||
fmt.Println("=== DOM Analysis ===")
|
||
fmt.Println()
|
||
|
||
// 尋找可能的輸入框
|
||
fmt.Println("Looking for input fields...")
|
||
selectors := []string{
|
||
`textarea`,
|
||
`[contenteditable="true"]`,
|
||
`[role="textbox"]`,
|
||
`input[type="text"]`,
|
||
}
|
||
for _, sel := range selectors {
|
||
elements, err := page.Elements(sel)
|
||
if err == nil && len(elements) > 0 {
|
||
fmt.Printf(" Found %d elements with: %s\n", len(elements), sel)
|
||
for i, el := range elements {
|
||
tag, _ := el.Property("tagName")
|
||
class, _ := el.Attribute("class")
|
||
ariaLabel, _ := el.Attribute("aria-label")
|
||
placeholder, _ := el.Attribute("placeholder")
|
||
fmt.Printf(" [%d] tag=%s class=%s aria-label=%s placeholder=%s\n",
|
||
i, tag, class, ariaLabel, placeholder)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 尋找可能的發送按鈕
|
||
fmt.Println()
|
||
fmt.Println("Looking for send buttons...")
|
||
buttonSelectors := []string{
|
||
`button`,
|
||
`[role="button"]`,
|
||
`[type="submit"]`,
|
||
}
|
||
for _, sel := range buttonSelectors {
|
||
elements, err := page.Elements(sel)
|
||
if err == nil && len(elements) > 0 {
|
||
fmt.Printf(" Found %d elements with: %s\n", len(elements), sel)
|
||
for i, el := range elements {
|
||
if i >= 5 {
|
||
fmt.Printf(" ... and %d more\n", len(elements)-5)
|
||
break
|
||
}
|
||
tag, _ := el.Property("tagName")
|
||
class, _ := el.Attribute("class")
|
||
ariaLabel, _ := el.Attribute("aria-label")
|
||
text, _ := el.Text()
|
||
text = truncate(text, 30)
|
||
fmt.Printf(" [%d] tag=%s class=%s aria-label=%s text=%s\n",
|
||
i, tag, class, ariaLabel, text)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 尋找模型選擇器
|
||
fmt.Println()
|
||
fmt.Println("Looking for model selector...")
|
||
modelSelectors := []string{
|
||
`[aria-label*="model"]`,
|
||
`[aria-label*="Model"]`,
|
||
`button[aria-haspopup]`,
|
||
`[data-test-id*="model"]`,
|
||
`[class*="model"]`,
|
||
}
|
||
for _, sel := range modelSelectors {
|
||
elements, err := page.Elements(sel)
|
||
if err == nil && len(elements) > 0 {
|
||
fmt.Printf(" Found with: %s\n", sel)
|
||
for i, el := range elements {
|
||
tag, _ := el.Property("tagName")
|
||
class, _ := el.Attribute("class")
|
||
ariaLabel, _ := el.Attribute("aria-label")
|
||
text, _ := el.Text()
|
||
fmt.Printf(" [%d] tag=%s class=%s aria-label=%s text=%s\n",
|
||
i, tag, class, ariaLabel, truncate(text, 30))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func truncate(s string, max int) string {
|
||
if len(s) <= max {
|
||
return s
|
||
}
|
||
return s[:max] + "..."
|
||
}
|