12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package lxrod
- import (
- "net/http"
- "net/http/cookiejar"
- "net/url"
- "time"
- "github.com/go-rod/rod"
- "github.com/go-rod/rod/lib/proto"
- )
- // 将 p 中所有 cookie 提取到 jar 中。cookie 的 domain 设置为 u。
- // TODO: 双向绑定
- func SetCookieFor(p *rod.Page, u *url.URL) (http.CookieJar, error) {
- jar, _ := cookiejar.New(nil)
- cookies, err := p.Cookies(nil)
- if err != nil {
- return nil, err
- }
- cs := make([]*http.Cookie, len(cookies))
- for i, c := range cookies {
- cs[i] = CookieFrom(c)
- }
- jar.SetCookies(u, cs)
- return jar, nil
- }
- // 将 rod 的 cookie 格式转换为 go http 的 cookie。
- // go 1.19 以后的新字段不支持。
- func CookieFrom(c *proto.NetworkCookie) *http.Cookie {
- var t time.Time
- if c.Expires != -1 {
- t = c.Expires.Time()
- }
- return &http.Cookie{
- Name: c.Name,
- Value: c.Value,
- Path: c.Path,
- Domain: c.Domain,
- Expires: t,
- Secure: c.Secure,
- HttpOnly: c.HTTPOnly,
- SameSite: SameSite(c.SameSite),
- }
- }
- // 从 rod cookie 中提取创建 go cookie 所用的 SameSite 数据
- func SameSite(s proto.NetworkCookieSameSite) http.SameSite {
- switch s {
- case proto.NetworkCookieSameSiteStrict:
- return http.SameSiteStrictMode
- case proto.NetworkCookieSameSiteLax:
- return http.SameSiteLaxMode
- case proto.NetworkCookieSameSiteNone:
- return http.SameSiteNoneMode
- default:
- return http.SameSiteDefaultMode
- }
- }
|