5b10b419a2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
package browser
|
|
|
|
// CdpCookie representa una cookie del browser tal como la devuelve CDP.
|
|
type CdpCookie struct {
|
|
Name string `json:"name"`
|
|
Value string `json:"value"`
|
|
Domain string `json:"domain"`
|
|
Path string `json:"path"`
|
|
Expires float64 `json:"expires"`
|
|
HTTPOnly bool `json:"httpOnly"`
|
|
Secure bool `json:"secure"`
|
|
SameSite string `json:"sameSite"`
|
|
}
|
|
|
|
// cookieFromMap convierte un map[string]any CDP a CdpCookie con casts defensivos.
|
|
func cookieFromMap(m map[string]any) CdpCookie {
|
|
c := CdpCookie{}
|
|
if v, ok := m["name"].(string); ok {
|
|
c.Name = v
|
|
}
|
|
if v, ok := m["value"].(string); ok {
|
|
c.Value = v
|
|
}
|
|
if v, ok := m["domain"].(string); ok {
|
|
c.Domain = v
|
|
}
|
|
if v, ok := m["path"].(string); ok {
|
|
c.Path = v
|
|
}
|
|
if v, ok := m["expires"].(float64); ok {
|
|
c.Expires = v
|
|
}
|
|
if v, ok := m["httpOnly"].(bool); ok {
|
|
c.HTTPOnly = v
|
|
}
|
|
if v, ok := m["secure"].(bool); ok {
|
|
c.Secure = v
|
|
}
|
|
if v, ok := m["sameSite"].(string); ok {
|
|
c.SameSite = v
|
|
}
|
|
return c
|
|
}
|
|
|
|
// CdpGetCookies devuelve todas las cookies del browser via Network.getAllCookies.
|
|
// El caller puede filtrar por dominio, nombre, etc. sobre el slice retornado.
|
|
func CdpGetCookies(c *CDPConn) ([]CdpCookie, error) {
|
|
if _, err := c.sendCDP("Network.enable", nil); err != nil {
|
|
return nil, err
|
|
}
|
|
result, err := c.sendCDP("Network.getAllCookies", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
raw, _ := result["cookies"].([]any)
|
|
cookies := make([]CdpCookie, 0, len(raw))
|
|
for _, item := range raw {
|
|
if m, ok := item.(map[string]any); ok {
|
|
cookies = append(cookies, cookieFromMap(m))
|
|
}
|
|
}
|
|
return cookies, nil
|
|
}
|