|

在 Playwright Go 中检测 Cookie 是否过期,可以通过以下步骤实现:
核心思路
获取所有 Cookie:使用 BrowserContext.Cookies() 方法
检查过期时间:将 Cookie 的 Expires 字段与当前时间比较
判断会话 Cookie:Expires 为 0 表示会话 Cookie(浏览器关闭时过期)
示例代码
go
package main
import (
"fmt"
"time"
"github.com/playwright-community/playwright-go"
)
func main() {
pw, err := playwright.Run()
if err != nil {
panic(err)
}
defer pw.Stop()
browser, err := pw.Chromium.Launch()
if err != nil {
panic(err)
}
defer browser.Close()
context, err := browser.NewContext()
if err != nil {
panic(err)
}
defer context.Close()
// 获取当前上下文的所有 Cookie
cookies, err := context.Cookies()
if err != nil {
panic(err)
}
// 当前时间(UTC)
currentTime := time.Now().UTC()
// 检查每个 Cookie
for _, cookie := range cookies {
// 会话 Cookie (Expires = 0)
if cookie.Expires == 0 {
fmt.Printf("会话 Cookie: [%s] (关闭浏览器后过期)\n", cookie.Name)
continue
}
// 将过期时间转换为 time.Time
expireTime := time.Unix(int64(cookie.Expires), 0).UTC()
if expireTime.Before(currentTime) {
fmt.Printf("已过期 Cookie: [%s] (过期于 %s)\n",
cookie.Name, expireTime.Format(time.RFC1123))
} else {
fmt.Printf("有效 Cookie: [%s] (将在 %s 后过期)\n",
cookie.Name, expireTime.Sub(currentTime).Round(time.Second))
}
}
}
关键说明:
Cookie 结构字段:
go
type Cookie struct {
Name string
Value string
Domain string
Path string
Expires float64 // Unix 时间戳(秒),0 表示会话 Cookie
HttpOnly bool
Secure bool
SameSite SameSiteAttribute
}
特殊处理会话 Cookie:
go
if cookie.Expires == 0 {
// 这是会话 Cookie,关闭浏览器后失效
}
时间比较:
go
expireTime := time.Unix(int64(cookie.Expires), 0) // 转换为 time.Time
if expireTime.Before(time.Now().UTC()) {
// Cookie 已过期
}
实际应用场景
go
// 检查特定 Cookie 是否有效
func isCookieValid(ctx playwright.BrowserContext, cookieName string) (bool, error) {
cookies, err := ctx.Cookies()
if err != nil {
return false, err
}
now := time.Now().UTC()
for _, cookie := range cookies {
if cookie.Name == cookieName {
if cookie.Expires == 0 { // 会话 Cookie
return true, nil
}
expireTime := time.Unix(int64(cookie.Expires), 0).UTC()
return expireTime.After(now), nil
}
}
return false, nil // 未找到 Cookie
}
注意事项:
时区处理:始终使用 UTC 时间避免时区问题
精度问题:Expires 是秒级时间戳,time.Unix() 会自动处理
会话 Cookie:浏览器关闭后失效,程序运行时始终视为有效 |
|