在使用WebDriver时,总是会遇到官方的检测,官方时不允许这样做的,那么如何规避掉呢
我使用的Cefsharp的版本时79.0 ,那么在处理的时候需要添加这样一句话
string script = "if(navigator.webdriver){ Object.defineProperty(navigator, 'webdriver', {get: () => undefined});}";
chromiumWebBrowser.ExecuteScriptAsync(script);
这个我以为在程序加载完成之后进行处理,后来发现并不是的,因为在加载完成之后,官方已经知道了你的处理
那么,我们就需要在他知道之前进行处理掉,所以我尝试着在这个函数中进行处理
protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
想必在使用cefsharp79.0的小伙伴们都知道这个函数,之前的老版本跟现在的不一样,建议使用官方的例子进行研究下
在这个函数中写入这段话,就可以处理掉官方的检测了。
后来又出现一个问题,这个写过了之后,第一次的确时成功的“逃脱”了官方的检测,但是在我使用webdriver进行浏览器导向的时候,又出现了检测,这怎么办
而且这个问题还是断断续续的,有时会出现,有时不出现,让我很难处理,程序员最不喜欢的就是断断续续的Bug了,你说呢
那么在后来怎么处理掉了呢,我是这样处理,第一次直接让浏览器导航到你需要的问题,然后登录之后再进行处理其他的,当然再处理其他的时候,也要防止官方对你的检测,他们会再每个页面对WebDriver进行检测,所以要再改网站的每一个访问需要加上躲避代码呢。
下面说下修改Post的数据问题
首先需要知道对应的接口,然后知道相应的参数,比如图片一般是二进制数据,需要进行转换。
数据的格式问题,是Json还是简单的自负床
数据类型:是UTF-8还是form-data
弄清楚之后,再进行post,修改数据的需要写在这个函数里面
protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
在这个里面进行修改数据,那么怎么接收数据呢
这个函数里面进行接收数据
protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
好,知道在哪里处理数据了,本来的我以为这样一切都可以的时候,问题还是出现了,唉,果然不是我想象中的那么简单啊,问题总是提前一步
我在处理数据的那个函数中有这样一段话,你看看你们有没有
if (request.Method == "POST")
{
using (var postData = request.PostData)
{
if (postData != null)
{
var elements1 = request.PostData.Elements;
var charSet1 = request.GetCharSet();
foreach (var element in elements1)
{
if (element.Type == PostDataElementType.Bytes)
{
string myData = element.GetBody(charSet1);
Console.WriteLine(request.Url + "===============" + myData);
}
}
}
}
}
这段代码是进行获取数据使用的,想必大家都知道,然后,后面又写了对应的url的数据获取,然后理所应当的进行修改数据
一切就绪,竟然提示数据为空,真是奇怪了,怎么都不可能为空的(妈蛋的,都是奇葩的问题)
我使用调试,打断点发现,数据竟然是真的为空了,于是在页面中找逻辑,看看到底是哪里出现了错误,
最后,感觉没有错误,在这个输出函数的时候是可以进行输出,在我修改的url的if语句中竟然没有了,于是我想了想,会不会这个东西只能使用一次呢。
于是进行修改代码,前面不在进行获取数据,只在相对应的url的if语句中进行获取,代码就是这样了
if (request.Url == "https://www.baidu.com")
{
if (request.Method == "POST")
{
using (var postData = request.PostData)
{
if (postData != null)
{
var elements1 = request.PostData.Elements;
var charSet1 = request.GetCharSet();
foreach (var element in elements1)
{
if (element.Type == PostDataElementType.Bytes)
{
string myData = element.GetBody(charSet1);
Console.WriteLine(request.Url + "===============" + myData);
}
}
}
}
}
}
惊喜的时刻终于来了,成功了!!!,真是恶心,搞不懂为什么是这样的。
还有一些问题,给大家补充一下,当你接获到url的时候,需要给他添加数据的时候,可以这样使用
request.InitializePostData();
request.PostData.AddData(mypostdata, Encoding.UTF8);
这样就可以了,文章写的都是经验,谈的都是过往。
这就是其中我遇到的问题,以及解决的办法,希望能帮助你们,喜欢的点个赞吧
切记,获取内容必须在相对应的url中进行获取,不然是没有办法进行修改数据的呢。上货软件已经完成了,不容易,后面会把我遇到的其他问题给记录下来,给各位网友提供下帮助。
官方的例子的网站我也给忘了,你们自己找下把!!!想要的可以留言,我帮你们找找。