IWebPageResponseHook

This commit is contained in:
Haiping Chen 2024-07-22 15:45:01 -05:00
parent 0abaa2df94
commit 5b5ccc9758
4 changed files with 35 additions and 43 deletions

View file

@ -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<T>(MessageInfo message, string url);
}

View file

@ -14,11 +14,4 @@ public class PageActionArgs
public bool WaitForNetworkIdle = true;
public float? Timeout { get; set; }
/// <summary>
/// On page data fetched
/// </summary>
public DataFetched? OnDataFetched { get; set; }
}
public delegate void DataFetched(string url, string postData, string responsData);

View file

@ -93,9 +93,9 @@ public class PlaywrightInstance : IDisposable
return _contexts[ctxId];
}
public async Task<IPage> NewPage(string ctxId, DataFetched? fetched)
public async Task<IPage> 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<IWebPageResponseHook>();
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;
}

View file

@ -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();
}
}