403 Forbidden
【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)
在之前的文章中,我们使用 Python 的 Requests 进行一些网页游戏的自动化操作,其中涉及到一个WAX云钱包的签名操作
import requests
resp = requests.get("https://public-wax-on.wax.io/wam/sign")
print(resp.text)
我们用 Python 对这个地址发起 GET 或 POST 请求,结果返回一个403 Forbidden 错误,正文是:
Please enable cookies.
Sorry, you have been blocked
You are unable to access wax.io
Why have I been blocked?
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 711e5eaf6819980c • Your IP: * • Performance & security by Cloudflare
但是呢,如果在 Chrome 中访问这个 URL 则非常正常,一点问题都没有,返回了正常的 JSON
经过一番研究,我们终于知道是被 Cloudflare 的反爬虫机制制裁了,它通过 TLS 特征,判断我们是脚本、机器人,而不是正常的浏览器,从而403阻止我们访问。
浏览器自动化方案
最初我们使用浏览器自动化方案来解决这个问题:
Selenium: www.selenium.dev/
Puppeteer: pptr.dev/
Playwright: playwright.dev/
这些框架允许你通过编程的方式,控制 Chrome / Firefox / Edge 等浏览器发起HTTP请求,这样 Cloudflare 收到的请求以及TLS指纹,是来自真实的浏览器,自然不会拦截你。
这些框架不仅支持 Python 调用,也提供 JavaScript / JAVA / C# 等编程语言的API
但这种方法太笨重了,它需要启动一个浏览器进程,非常消耗资源,尤其是你需要并发的时候,需要启动很多浏览器进程
WinHTTP方案
《借助WinHTTP突破Cloudflare的反爬限制(TLS指纹识别)》
在上一篇文章中,我们开发了一个 Python 包,使用 Windows 上的 WinHTTP 库发起请求,由于 WinHTTP 在 Windows 上是 IE / Edge 浏览器的底层库,它发出的 HTTP 请求的 TLS 指纹与 IE / Edge 浏览器完全一致,所以可以躲过 Cloudflare 的检测
但这种方法有一个弊端,就是只能在 Windows 上运行,无法在 Linux 上运行,而当今大多数服务器都是基于 Linux 的,对于大规模专业化的爬虫来说,是不适用的。
那么有没有什么第三方 HTTP 库,可以完全模拟 Chrome 等浏览器的 TLS 指纹呢?哎,还真的有
模拟TLS的库
我们一共找到了两个 HTTP 库可以模拟浏览器的TLS指纹
【tls-client】:github.com/bogdanfinn/…
【curl_cffi】:github.com/lexiforest/…
tls-client
tls-client 是一个 Go 语言实现的 HTTP 客户端,他可以模拟多款浏览器的指纹,比如 chrome / safari / firefox / opera 甚至 android 上的 okhttp4
当然它也提供 Python 的接口,只需安装如下包
pip install typing_extensions
pip install tls-client
示例代码:
import tls_client
session = tls_client.Session(client_identifier="chrome112", random_tls_extension_order=True)
resp = session.get("https://public-wax-on.wax.io/wam/sign")
print(resp.text)
其中 client_identifier 指定模拟 Chrome 浏览器的 112 版本
random_tls_extension_order 则是随机化 TLS 扩展顺序,增加随机特征,增加隐蔽性
curl_cffi
【curl-impersonate】:github.com/lexiforest/…
curl_cffi 其实是 curl-impersonate 的 Python 绑定,意思就是 curl-impersonate 本来是 C 语言写的,提供的是 C 语言的接口,curl_cffi 通过 cffi 这个库把这些 C 语言的接口包装成 Python 接口,让 Python 能直接调用。
那 curl-impersonate 又是什么呢?它其实是 curl / libcurl 的一个特化版本(分支),它在 curl / libcurl 的基础上增加了模仿浏览器 TLS 指纹的功能,他可以模仿 Chrome、Edge、Safari 和 Firefox 的指纹。
那 curl / libcurl 又是什么呢?这不用我说了吧,知名的老项目了,C语言写的 HTTP 客户端。
在 Python 中安装如下包即可使用:
pip install curl_cffi
示例代码:
from curl_cffi import requests
session = requests.Session()
resp = session.get("https://public-wax-on.wax.io/wam/sign", impersonate="chrome110")
print(resp.text)
非常简单,用法和 Python 的 Requests 基本一致, 就是多了些指定浏览器特征的参数
总结
以上两个库都可以完美的解决我们遇到的 Cloudflare TLS 指纹识别反爬问题
为什么2022年的时候,我没有说这个方案呢?
因为 tls-client 是 2023年4月面世的,curl_cffi 是2024年2月才面世的。
我们当年哪有这些好工具啊,,,都得自己研究。。
当年我可是借助 WinHTTP 手搓了一个能模拟 Edge 指纹的 HTTP 库,哪有现在那么多现成的东西。
终极方案
如果这些工具都不好使的话?
开源的东西,你当 Cloudflare 官方开发人员看不见啊?未来说不定哪天就河蟹了
当年我们通过 cloudscraper 和 cloudflare-scrape 等开源项目,来修改 TLS 特征,后来就被 Cloudflare 河蟹了。
那么终极方案,当然是花钱了,专业的事交给专业的人做。
我发现有的公司就是专门做反爬对抗和验证码对抗的,你只需要花钱,调用他们的API来爬取目标数据,遇到的反爬问题,他们会解决,不用管他们是怎么解决的,当然他们也不会告诉你。
比如 capsolver,2Captcha,YesCaptcha,具体我就不介绍了,我跟他们没有任何合作关系。
商业思考
这些公司不止做反爬对抗,也做验证码识别,尤其是 capsolver 是2022年才成立的公司,非常年轻。
其实2022年底 ChatGPT 等 LLM 开始火热的时候,我就发现 LLM 具备识别图形验证码的能力。
只需简单的包装,就可以让 LLM 来处理各种千奇百怪的验证码问题
要知道在 LLM 出来之前,验证码识别是怎么做的?
通用的办法就是人工打码,不然的话就用 tensorflow 自己训练,每个网站,每种验证码都要训练一遍,一旦对方改版,字体、花色改一下,你就得重新训练。
尤其是一些需要逻辑判断,找相似,找正方形,找不同的验证码,用深度学习的方法,很麻烦,而 LLM 则可以一劳永逸。
以此为基础开发一个验证码识别平台,提供收费 API 调用,是不是能赚到钱呢?可惜我们忙于打工没有行动
后来发现确实有很多公司在做了,并且已经上线运营很久了
软件出海
中国人太多了,太卷了,你能想到的别人也能想到,前段时间我玩了一下三角洲这个游戏,刷短视频发现倒卖子弹可以赚哈夫币,于是想做一个三角洲物价监控平台,上网一搜,尼玛已经有人做好了并且运营一年之久了。
基本上没有什么 Idea 是你能想到别人想不到的。
我想可能能做的只有软件出海了,像印尼、巴基斯坦、尼日利亚、巴西、墨西哥、日本、埃及、菲律宾、越南,都是1亿人口以上的国家,这些国家肯定也有 IT 系统,也有需求。但是这些国家未必每一个都有能发现 Idea 和 实现 Idea 的人。
比如 capsolver 这种反爬对抗和验证码识别,我敢打包票,目前日本和越南本土,没人做这个,其它那十几个国家估计也没有。反正只要不是中、美、印度、俄罗斯以及欧洲的几个IT发达的国家,很多软件 idea 其实在小国家根本没有本土人士做出来。那么软件出海和在该国落地就是机会。
如果你有出海经商的经验,不用自己开发,直接和 capsolver 这些公司合作,在目标国家落地,解决翻译沟通问题,解决收款合规问题,解决服务器本地部署问题,解决 API 网络延迟问题,直接和这些公司分利润即可。