0

Web ページの個々のリクエストの Cookie ヘッダーをオーバーライドしたいと考えています。これを行うために、私は現在PuppeteerSharpと Chrome Devtools Protocol Fetch API を使用しています (具体的にはFetch.enable、、、Fetch.requestPausedおよびを使用していますFetch.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",
            new Dictionary<string, object>
            {
                {
                    "patterns", new Dictionary<string, 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 の [Network] タブを見ると、21 件のリクエストのうち 3 件だけがabcdefg=1234567Cookie オーバーライドを持っていることがわかります。以下は、そうでないリクエストの例です。 ここに画像の説明を入力


更新: さらに調査を行うと、chrome.webRequest onBeforeSendHeadersは、私が探しているものを正確に達成するために機能します。これは、ブラウザーに Cookie が何であるかを伝えずに、個々の要求の Cookie ヘッダーをオーバーライドすることです。これは、Cookie ヘッダーが削除されるコード例です (上記の Puppeteer コード スニペットのように Cookie ヘッダーが置き換えられる例は見つかりませんでした)。

ここで、PuppeteerSharp がどのように機能するかを理解する必要onBeforeSendHeadersがあります....

4

0 に答える 0