首页 > 解决方案 > 无法从 cookiejar 获取 cookie

问题描述

我在网站上构建了一个简单的脚本,并在那里做了一些事情(在 lego.com 上自动结帐过程)

这一切都是使用带有 cookiejar 的 go http 客户端完成的,但是当我尝试在网站上的所有活动之后打印出 cookie 时,什么都没有打印 - 不确定我是否在这里做错了。

type Program struct {
    taskInfo task.Task
    client   http.Client
    jar      *cookiejar.Jar
    // Task Specific Variables
    maxOrderQty   string
    sessionID     string
    sku           string
    shipMethodUID string
}

HTTP客户端在下面初始化

func (pr *Program) initializeClient() {
    pr.jar, _ = cookiejar.New(nil)

    pr.client = http.Client{
        Timeout: time.Second * 10,
        Jar:     pr.jar,
    }
}

之后,我使用所述客户端对同一个域(GET 和 POST 的混合)进行了几次调用。当我尝试打印出 cookie 时,什么也没有打印出来。

func (pr *Program) getSessionCookies() {
    log.Debug("Getting Cookies")
    u, _ := url.Parse("https://www.lego.com/")
    for _, cookie := range pr.jar.Cookies(u) {
        fmt.Printf("  %s: %s\n", cookie.Name, cookie.Value)
    }
}

标签: go

解决方案


Go 的 http 包默认支持重定向,但必须刷新 cookie jar,特别是在域更改时。

前段时间我花了很多时间调试它,我找到的解决方案是指定一个重定向处理程序:

client.CheckRedirect = getRedirectHandler(req, &client)

其中有以下代码:

func getRedirectHandler(req *Request, client *http.Client) redirectHandler {
    fn := func(request *http.Request, via []*http.Request) error {
        if req.FollowRedirect {
            log.Debug(fmt.Sprintf("Redirecting to %s", request.URL.String()))
            jar, err := getCookieJarWithURL(request.URL.String(), req.Cookies)
            if err != nil {
                return err
            }
            client.Jar = jar
            return nil
        }
        return errors.New("Redirect not allowed")
    }
    return fn
}

完整的代码可以在这个gist中找到:

我希望这可以节省你一些时间:)


推荐阅读