微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Puppeter / PuppeteerSharp:Cookie 标头覆盖是间歇性的

如何解决Puppeter / PuppeteerSharp:Cookie 标头覆盖是间歇性的

我想覆盖网页中各个请求的 cookie 标头。为此,我目前正在使用 PuppeteerSharp 和 Chrome Devtools 协议 Fetch API(具体来说,我正在使用 Fetch.enableFetch.requestPausedFetch.continueRequest)。

请注意,我不想使用 Network.setCookie,因为我想绕过浏览器对 cookie 存在的了解。 (换句话说,我不希望 cookie 显示在 Chrome DevTools -> Applications -> Cookies 选项卡中)。

我观察到这是间歇性的。 我怎样才能让这个 cookie 覆盖不是间歇性的,而是适用于所有请求?

这是 PuppeteerSharp 代码: (重要部分见SET THE COOKIE HEADER OVERRIDE注释)

class Program
{
    public static CDPSession _cdpSession;

    public static void CdpSessionMessageReceived(object sender,MessageEventArgs args)
    {
        if (args.MessageID == "Fetch.requestPaused")
        {
            Task.Run(async () => 
            {
                FetchRequestPausedResponse fetchRequest = args.MessageData.ToObject<FetchRequestPausedResponse>();

                List<Dictionary<string,object>> headers = new List<Dictionary<string,object>>();
                headers.Add(new Dictionary<string,object>
                {
                    { "name","cookie" },{ "value","abcdefg=1234567" } // SET THE COOKIE HEADER OVERRIDE FOR EVERY REQUEST
                });

                await _cdpSession.SendAsync("Fetch.continueRequest",new Dictionary<string,object>
                    {
                        { "requestId",fetchRequest.RequestId },{ "headers",headers.ToArray() }
                    }
                );
            });
        }
    }

    static void Main(string[] args)
    {
        browser b = await Puppeteer.LaunchAsync(new LaunchOptions()
        {
            ExecutablePath = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",defaultviewport = null,Headless = false
        });

        Page page = b.PagesAsync()[0];

        JObject response = await _cdpSession.SendAsync("Fetch.enable",object>
            {
                {
                    "patterns",object>[]
                    {
                        new Dictionary<string,object>
                        {
                            { "urlPattern","*" },// URL PATTERN IS * TO INTERCEPT EVERY REQUEST
                            { "requestStage","Request" }
                        }
                    }
                }
            });

        _cdpSession.MessageReceived += CdpSessionMessageReceived;

        await page.GoToAsync("https://www.google.com");

        await b.CloseAsync();
    }

    internal class FetchRequestPausedResponse
    {
        public string RequestId { get; set; }

        public string NetworkId { get; set; }
    }
}

如果我查看 Chrome DevTools 网络选项卡,我会看到 21 个请求中只有 3 个具有 abcdefg=1234567 cookie 覆盖。这是一个没有请求的示例:

enter image description here


更新:在进行更多研究时,chrome.webRequest onBeforeSendHeaders 确实可以完成我正在寻找的内容,即覆盖单个请求的 cookie 标头而不告诉浏览器 cookie 是什么是。 Here删除 cookie 标头的代码示例(我找不到以上面的 Puppeteer 代码片段的方式替换 cookie 标头的示例)。

现在来了解 PuppeteerSharp 如何完成 onBeforeSendHeaders 所做的......

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。