【记录】使用curl模拟浏览器请求绕过检测。
事情是这样的,之前给别人写的一个单子,爬数据的请求给检测到了。
当时我还是用的C# 自带Httpwebrequest 来请求的。
但是,我封装的请求本身没有异常,放到Postman来请求可以通过,所有觉得是更底层的东西被检测,期间我更是用三种抓包软件来代理,发现一样的数据,在fiddler和charles是不通过,而在mitmproxy则能通。后来又通过wireshark,来分析了两者的不同,发现是在tls那块不同,
也就是 cipher suite(密钥套件)长度不一样,这玩意我也第一次接触,问题是找到了。
C#的Httpwebrequest 短时间我是不知道怎么处理cipher suite了,花了些时间找合适的http库,找到了一个大佬们经常用的curl。我自己用也是第一次,开始是先在cmd测试,我用最新的windows版本(7.87.0)也不通过,但是换成(7.70.0)就通过,当时还没想着改ciphers。
库是找到了,当时就蠢着直接封装cmd执行请求然后返回结果。没跑多久就爆了,无奈之下只能去用libcurl,之前是想着封装一下libcurl,结果刚起头就觉得太麻烦不弄了。
最终在GitHub上找到了一个现成的(https://github.com/stil/CurlThin),不过因为有点旧的原因,并不能直接跑起来。
会报错->访问保护的内存。
解决方法:
原代码:[DllImport(LIBCURL, EntryPoint = "curl_easy_getinfo")]
修改后:[DllImport(LIBCURL, EntryPoint = "curl_easy_getinfo", CallingConvention = CallingConvention.Cdecl)]
能用libcurl后,跑了2天又噶了。
我就在想我用同一个ciphers是不是给抓特征了,于是乎整了一大堆,每次请求随机组合。虽然又行了,但没多久就有噶了。
这次沉下心来查资料,果然还是给我找到了,在GitHub上找到一个以curl为基础,完全模拟浏览器请求的项目(https://github.com/lwthiker/curl-impersonate)。
仔细看了,发现每个浏览器的ciphers都不同,但都是固定,我就拿了chrome的ciphers,能在原生libcurl改的参数都改了。好在到现在还没噶,等噶了再说吧。