opencode-cursor-agent/scripts/detect-gemini-dom.go

160 lines
4.1 KiB
Go
Raw Permalink Normal View History

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] + "..."
}