首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用cookie发送Chromedp请求

用cookie发送Chromedp请求
EN

Stack Overflow用户
提问于 2022-10-17 15:01:09
回答 2查看 122关注 0票数 1

我试图用chromedp库打开一个结帐页面,但它没有收到我发送的cookie。我在一个循环中尝试了network.SetCookies()network.SetCookie(),但是它不起作用。,它编译并运行,没有错误,。非常感谢您的帮助,下面是代码:

代码语言:javascript
运行
复制
opts := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.Flag("headless", false))
actx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
ctx, cancel := chromedp.NewContext(actx)

// Call cancel() to close Chrome on some condition.
if false {
    cancel()
}

task := chromedp.Tasks{
    network.Enable(),
    chromedp.ActionFunc(func(ctx context.Context) error {
        cookieJar := getCookies(client)
        var cookiesParam []*network.CookieParam
        for _, v := range cookieJar {
            fmt.Println(v.Name, ":"+v.Value)
            cookiesParam = append(cookiesParam, &network.CookieParam{Name: v.Name, Value: v.Value})
        }
        network.SetCookies(cookiesParam)
        return nil
    }),
    chromedp.Navigate(res.Request.URL.String()),
}

// Run task.
err := chromedp.Run(ctx, task)
if err != nil {
    log.Fatal(err)
}

编辑:我试过@zachyoung给出的例子,但是当我尝试发送任何类型的cookie时,它都不起作用。下面是代码:

代码语言:javascript
运行
复制
// Command cookie is a chromedp example demonstrating how to set a HTTP cookie
// on requests.
package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/cdproto/cdp"
    "github.com/chromedp/cdproto/network"
    "github.com/chromedp/chromedp"
)

func main() {

    // create context
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    // run task list
    var res string
    err := chromedp.Run(ctx, setcookies("https://en.afew-store.com/", &res,
        "cookie1", "value1",
        "cookie2", "value2",
    ))
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("chrome received cookies: %s", res)
}

// setcookies returns a task to navigate to a host with the passed cookies set
// on the network request.
func setcookies(host string, res *string, cookies ...string) chromedp.Tasks {
    if len(cookies)%2 != 0 {
        panic("length of cookies must be divisible by 2")
    }
    return chromedp.Tasks{
        chromedp.ActionFunc(func(ctx context.Context) error {
            // create cookie expiration
            expr := cdp.TimeSinceEpoch(time.Now().Add(180 * 24 * time.Hour))
            // add cookies to chrome
            for i := 0; i < len(cookies); i += 2 {
                err := network.SetCookie(cookies[i], cookies[i+1]).
                    WithExpires(&expr).
                    WithDomain("https://en.afew-store.com/").
                    WithHTTPOnly(true).
                    Do(ctx)
                if err != nil {
                    return err
                }
            }
            return nil
        }),
        // navigate to site
        chromedp.Navigate(host),
        // read the returned values
        chromedp.Text(`#result`, res, chromedp.ByID, chromedp.NodeVisible),
        // read network values
        chromedp.ActionFunc(func(ctx context.Context) error {
            cookies, err := network.GetAllCookies().Do(ctx)
            if err != nil {
                return err
            }

            for i, cookie := range cookies {
                log.Printf("chrome cookie %d: %+v", i, cookie)
            }

            return nil
        }),
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2022-10-23 02:57:37

https://en.afew-store.com/不是一个域,您应该用en.afew-store.com替换它。

代码语言:javascript
运行
复制
- WithDomain("https://en.afew-store.com/").
+ WithDomain("en.afew-store.com").

而且页面上没有#result元素,所以chromedp.Text("#result", res, chromedp.ByID, chromedp.NodeVisible)永远不会返回。下面是一个经过修改的演示,运行:

代码语言:javascript
运行
复制
package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/cdproto/cdp"
    "github.com/chromedp/cdproto/network"
    "github.com/chromedp/chromedp"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    err := chromedp.Run(ctx,
        chromedp.ActionFunc(func(ctx context.Context) error {
            expr := cdp.TimeSinceEpoch(time.Now().Add(180 * 24 * time.Hour))
            cookies := []string{"cookie1", "value1", "cookie2", "value2"}
            for i := 0; i < len(cookies); i += 2 {
                err := network.SetCookie(cookies[i], cookies[i+1]).
                    WithExpires(&expr).
                    WithDomain("en.afew-store.com").
                    WithHTTPOnly(true).
                    Do(ctx)
                if err != nil {
                    return err
                }
            }
            return nil
        }),
        chromedp.Navigate("https://en.afew-store.com/"),
        chromedp.ActionFunc(func(ctx context.Context) error {
            cookies, err := network.GetAllCookies().Do(ctx)
            if err != nil {
                return err
            }

            for i, cookie := range cookies {
                log.Printf("chrome cookie %d: %+v", i, cookie)
            }

            return nil
        }),
    )
    if err != nil {
        log.Fatal(err)
    }
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74099245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档