From 5b5ccc975885e19b09def08de9f89e036624e915 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 22 Jul 2024 15:45:01 -0500 Subject: [PATCH] IWebPageResponseHook --- .../Browsing/IWebPageResponseHook.cs | 9 ++++ .../Browsing/Models/PageActionArgs.cs | 7 --- .../PlaywrightDriver/PlaywrightInstance.cs | 48 ++++++++++--------- .../PlaywrightWebDriver.GoToPage.cs | 14 +----- 4 files changed, 35 insertions(+), 43 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Browsing/IWebPageResponseHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebPageResponseHook.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebPageResponseHook.cs new file mode 100644 index 00000000..e8ec7494 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebPageResponseHook.cs @@ -0,0 +1,9 @@ +using BotSharp.Abstraction.Browsing.Models; + +namespace BotSharp.Abstraction.Browsing; + +public interface IWebPageResponseHook +{ + void OnDataFetched(MessageInfo message, string url, string postData, string responsData); + T? GetResponse(MessageInfo message, string url); +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs index 0698194e..d956834a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs @@ -14,11 +14,4 @@ public class PageActionArgs public bool WaitForNetworkIdle = true; public float? Timeout { get; set; } - - /// - /// On page data fetched - /// - public DataFetched? OnDataFetched { get; set; } } - -public delegate void DataFetched(string url, string postData, string responsData); diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs index ef487366..ebf1e524 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs @@ -93,9 +93,9 @@ public class PlaywrightInstance : IDisposable return _contexts[ctxId]; } - public async Task NewPage(string ctxId, DataFetched? fetched) + public async Task NewPage(MessageInfo message, IServiceProvider services) { - var context = await GetContext(ctxId); + var context = await GetContext(message.ContextId); var page = await context.NewPageAsync(); // 许多网站为了防止信息被爬取,会添加一些防护手段。其中之一是检测 window.navigator.webdriver 属性。 @@ -103,35 +103,37 @@ public class PlaywrightInstance : IDisposable var js = @"Object.defineProperties(navigator, {webdriver:{get:()=>false}});"; await page.AddInitScriptAsync(js); - if (fetched != null) + page.Response += async (sender, e) => { - page.Response += async (sender, e) => + if (e.Headers.ContainsKey("content-type") && + e.Headers["content-type"].Contains("application/json") && + (e.Request.ResourceType == "fetch" || e.Request.ResourceType == "xhr")) { - if (e.Headers.ContainsKey("content-type") && - e.Headers["content-type"].Contains("application/json") && - (e.Request.ResourceType == "fetch" || e.Request.ResourceType == "xhr")) + Serilog.Log.Information($"{e.Request.Method}: {e.Url}"); + JsonElement? json = null; + try { - Serilog.Log.Information($"{e.Request.Method}: {e.Url}"); - JsonElement? json = null; - try + if (e.Status == 200 && e.Ok) { - if (e.Status == 200 && e.Ok) - { - json = await e.JsonAsync(); - } - else - { - Serilog.Log.Warning($"Response status: {e.Status} {e.StatusText}, OK: {e.Ok}"); - } - fetched(e.Url.ToLower(), e.Request?.PostData ?? string.Empty, JsonSerializer.Serialize(json)); + json = await e.JsonAsync(); } - catch(Exception ex) + else { - Serilog.Log.Error(ex.ToString()); + Serilog.Log.Warning($"Response status: {e.Status} {e.StatusText}, OK: {e.Ok}"); + } + + var webPageResponseHooks = services.GetServices(); + foreach (var hook in webPageResponseHooks) + { + hook.OnDataFetched(message, e.Url.ToLower(), e.Request?.PostData ?? string.Empty, JsonSerializer.Serialize(json)); } } - }; - } + catch(Exception ex) + { + Serilog.Log.Error(ex.ToString()); + } + } + }; return page; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs index 8f122213..458889f9 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -1,5 +1,3 @@ -using System.Linq; - namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; public partial class PlaywrightWebDriver @@ -26,7 +24,7 @@ public partial class PlaywrightWebDriver } }*/ - var page = args.OpenNewTab ? await _instance.NewPage(message.ContextId, fetched: args.OnDataFetched) : + var page = args.OpenNewTab ? await _instance.NewPage(message, _services) : _instance.GetPage(message.ContextId); Serilog.Log.Information($"goto page: {args.Url}"); @@ -64,14 +62,4 @@ public partial class PlaywrightWebDriver return result; } - - private void Page_Response1(object sender, IResponse e) - { - throw new NotImplementedException(); - } - - private void Page_Response(object sender, IResponse e) - { - throw new NotImplementedException(); - } }