diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs index 2bbd6ffc..0368bfdd 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs @@ -4,7 +4,7 @@ namespace BotSharp.Abstraction.Browsing; public interface IWebBrowser { - Task LaunchBrowser(MessageInfo message); + Task LaunchBrowser(MessageInfo message, BrowserActionArgs args); Task ScreenshotAsync(MessageInfo message, string path); Task ScrollPage(MessageInfo message, PageActionArgs args); diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionArgs.cs index 1a6920c8..21bdf6ab 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionArgs.cs @@ -2,5 +2,5 @@ namespace BotSharp.Abstraction.Browsing.Models; public class BrowserActionArgs { - + public bool Headless { get; set; } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionParams.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionParams.cs index 04ba82b2..edc66781 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionParams.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionParams.cs @@ -1,5 +1,6 @@ namespace BotSharp.Abstraction.Browsing.Models; +[Obsolete("This class is deprecated, use BrowserActionArgs instead.")] public class BrowserActionParams { public Agent Agent { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MetaAI/Settings/MetaAiSettings.cs b/src/Plugins/BotSharp.Plugin.MetaAI/Settings/MetaAiSettings.cs index cde5121c..1c8cb1d9 100644 --- a/src/Plugins/BotSharp.Plugin.MetaAI/Settings/MetaAiSettings.cs +++ b/src/Plugins/BotSharp.Plugin.MetaAI/Settings/MetaAiSettings.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.MetaAI.Settings; public class MetaAiSettings { - public fastTextSetting fastText { get; set; } + public fastTextSetting fastText { get; set; } = new(); } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs index 1bd14b3a..151cf506 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs @@ -1,4 +1,3 @@ -using Microsoft.Playwright; using System.IO; namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; @@ -21,33 +20,29 @@ public class PlaywrightInstance : IDisposable public IPage GetPage(string id, string? pattern = null) { - InitInstance(id).Wait(); return _contexts[id].Pages.LastOrDefault(); } - public async Task InitInstance(string ctxId) + public async Task GetContext(string ctxId) { + return _contexts[ctxId]; + } + + public async Task InitContext(string ctxId, BrowserActionArgs args) + { + if (_contexts.ContainsKey(ctxId)) + return _contexts[ctxId]; + if (_playwright == null) { _playwright = await Playwright.CreateAsync(); } - return await InitContext(ctxId); - } - - public async Task InitContext(string ctxId) - { - if (_contexts.ContainsKey(ctxId)) - return _contexts[ctxId]; string tempFolderPath = $"{Path.GetTempPath()}\\playwright\\{ctxId}"; _contexts[ctxId] = await _playwright.Chromium.LaunchPersistentContextAsync(tempFolderPath, new BrowserTypeLaunchPersistentContextOptions { -#if DEBUG - Headless = false, -#else - Headless = true, -#endif + Headless = args.Headless, Channel = "chrome", ViewportSize = new ViewportSize { @@ -100,8 +95,13 @@ public class PlaywrightInstance : IDisposable public async Task NewPage(string ctxId, DataFetched? fetched) { - await InitContext(ctxId); - var page = await _contexts[ctxId].NewPageAsync(); + var context = await GetContext(ctxId); + var page = await context.NewPageAsync(); + + // 许多网站为了防止信息被爬取,会添加一些防护手段。其中之一是检测 window.navigator.webdriver 属性。 + // 当使用 Playwright 打开浏览器时,该属性会被设置为 true,从而被网站识别为自动化工具。通过以下方式屏蔽这个属性,让网站无法识别是否使用了 Playwright + var js = @"Object.defineProperties(navigator, {webdriver:{get:()=>false}});"; + await page.AddInitScriptAsync(js); if (fetched != null) { 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 a6f48440..f0b9c738 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -7,7 +7,7 @@ public partial class PlaywrightWebDriver public async Task GoToPage(MessageInfo message, PageActionArgs args) { var result = new BrowserActionResult(); - var context = await _instance.InitInstance(message.ContextId); + var context = await _instance.GetContext(message.ContextId); try { // Check if the page is already open diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LaunchBrowser.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LaunchBrowser.cs index b08716f6..d6509fd2 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LaunchBrowser.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LaunchBrowser.cs @@ -2,9 +2,9 @@ namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; public partial class PlaywrightWebDriver { - public async Task LaunchBrowser(MessageInfo message) + public async Task LaunchBrowser(MessageInfo message, BrowserActionArgs args) { - var context = await _instance.InitInstance(message.ContextId); + var context = await _instance.InitContext(message.ContextId, args); var result = new BrowserActionResult { IsSuccess = context.Pages.Count > 0 diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/SeleniumDriver/SeleniumWebDriver.LaunchBrowser.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/SeleniumDriver/SeleniumWebDriver.LaunchBrowser.cs index 4d8c678f..4e8b6498 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/SeleniumDriver/SeleniumWebDriver.LaunchBrowser.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/SeleniumDriver/SeleniumWebDriver.LaunchBrowser.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.WebDriver.Drivers.SeleniumDriver; public partial class SeleniumWebDriver { - public async Task LaunchBrowser(MessageInfo message) + public async Task LaunchBrowser(MessageInfo message, BrowserActionArgs args) { var context = await _instance.InitInstance(message.ContextId); var result = new BrowserActionResult() diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Functions/OpenBrowserFn.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Functions/OpenBrowserFn.cs index 67158ea6..6f4c3654 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Functions/OpenBrowserFn.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Functions/OpenBrowserFn.cs @@ -31,7 +31,10 @@ public class OpenBrowserFn : IFunctionCallback ContextId = convService.ConversationId, MessageId = message.MessageId }; - var result = await _browser.LaunchBrowser(msgInfo); + var result = await _browser.LaunchBrowser(msgInfo, new BrowserActionArgs + { + Headless = false + }); result = await _browser.GoToPage(msgInfo, new PageActionArgs { Url = url