CefSharp GetSourceAsync() 作为字节数组
CefSharp GetSourceAsync() as byte array
我在 GitHub、Whosebug 和 Google 上搜索了几个小时都没有成功,所以我想我被困住了。
我使用 CefSharp 获取位于 CloudFlare 后面的页面的源代码:
public static string GetCefSource(string url)
{
Browser.Load(url); //An instance of ChromiumWebBrowser
Thread.Sleep(15000); //Debatable (it would be better to wait for the real content instead of waiting for "some random time until CloudFlare does its thing")
string source = Browser.GetSourceAsync().ConfigureAwait(true).GetAwaiter().GetResult(); //Don't ask me the purpose of ConfigureAwait, NetAnalyzers asks for it (I'll look into it)
return source;
}
它 100% 的时间(目前)有效,但是如果我使用此方法获取图像,以便将其写入磁盘怎么办?
用上面的方法,我得到了类似的东西
"�PNG\r\n\u001a\n[=11=][=11=][=11=]\rIHDR[=11=][=11=]\u0001�[=11=][=11=][=11=]�\b\u0006..."
完全正常。如您所见,这是我正在等待的 PNG 图片,作为字符串、Unicode 等等,但不是我需要的格式。
我想在将图像写入磁盘之前对其进行操作,因此我需要源作为字节数组,以便与
一起使用
using MagickImage image = new(data)
所以问题是:
如何获取字节数组形式的远程文件,就像我将 HttpClient 与
一起使用一样
HttpContent.ReadAsByteArrayAsync().GetAwaiter().GetResult().ToArray()
但使用 CefSharp,因为 CloudFlare ?
谢谢!
感谢amaitland for about DownloadUrlAsync()。
我现在可以获取位于 CloudFlare 后面的任何资源,作为字符串或字节[],用这个:
public static object GetCefSource(string url, bool asByteArray = false)
{
Browser.Load(url); //An instance of ChromiumWebBrowser
Thread.Sleep(15000); //Wait for CloudFlare's Javascript to execute
object result = Browser.GetSourceAsync().ConfigureAwait(true).GetAwaiter().GetResult();
if (asByteArray)
{
IFrame mainFrame = Browser.GetMainFrame();
result = mainFrame.DownloadUrlAsync(url).ConfigureAwait(true).GetAwaiter().GetResult();
}
return result;
}
我可能会用 Thread.Sleep() 的替代方法重写它,并且不会将结果装箱在对象中。
谢谢!
我在 GitHub、Whosebug 和 Google 上搜索了几个小时都没有成功,所以我想我被困住了。
我使用 CefSharp 获取位于 CloudFlare 后面的页面的源代码:
public static string GetCefSource(string url)
{
Browser.Load(url); //An instance of ChromiumWebBrowser
Thread.Sleep(15000); //Debatable (it would be better to wait for the real content instead of waiting for "some random time until CloudFlare does its thing")
string source = Browser.GetSourceAsync().ConfigureAwait(true).GetAwaiter().GetResult(); //Don't ask me the purpose of ConfigureAwait, NetAnalyzers asks for it (I'll look into it)
return source;
}
它 100% 的时间(目前)有效,但是如果我使用此方法获取图像,以便将其写入磁盘怎么办?
用上面的方法,我得到了类似的东西
"�PNG\r\n\u001a\n[=11=][=11=][=11=]\rIHDR[=11=][=11=]\u0001�[=11=][=11=][=11=]�\b\u0006..."
完全正常。如您所见,这是我正在等待的 PNG 图片,作为字符串、Unicode 等等,但不是我需要的格式。
我想在将图像写入磁盘之前对其进行操作,因此我需要源作为字节数组,以便与
一起使用using MagickImage image = new(data)
所以问题是:
如何获取字节数组形式的远程文件,就像我将 HttpClient 与
一起使用一样HttpContent.ReadAsByteArrayAsync().GetAwaiter().GetResult().ToArray()
但使用 CefSharp,因为 CloudFlare ?
谢谢!
感谢amaitland for
我现在可以获取位于 CloudFlare 后面的任何资源,作为字符串或字节[],用这个:
public static object GetCefSource(string url, bool asByteArray = false)
{
Browser.Load(url); //An instance of ChromiumWebBrowser
Thread.Sleep(15000); //Wait for CloudFlare's Javascript to execute
object result = Browser.GetSourceAsync().ConfigureAwait(true).GetAwaiter().GetResult();
if (asByteArray)
{
IFrame mainFrame = Browser.GetMainFrame();
result = mainFrame.DownloadUrlAsync(url).ConfigureAwait(true).GetAwaiter().GetResult();
}
return result;
}
我可能会用 Thread.Sleep() 的替代方法重写它,并且不会将结果装箱在对象中。
谢谢!