首页 > 解决方案 > Recaptcha 使用 c++ libcurl 防止使用会话 cookie 登录

问题描述

首先,我不是网络开发人员,主要是通过搜索网络分析浏览器日志、cookie 和 curl 文档来自学。

在 C++ 中使用 libcurl,几个月前我编写了一个程序来处理需要登录的页面的请求。为了避免不得不使用代码登录(我还不知道该怎么做) ,我选择简单地使用我的浏览器 (Firefox) 登录,识别会话 cookie,然后在我的代码中从 Firefox cookie 数据库加载 cookie。喜欢:

curl_global_init(CURL_GLOBAL_ALL);
auto handle = curl_easy_init();
curl_easy_setopt(handle, CURLOPT_COOKIEFILE, ""); // activate cookie engine
curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(handle, CURLOPT_URL, url);
curl_easy_setopt(handle, CURLOPT_COOKIE, firefox_cookie);
std::string buf;
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, 
    [](void* chunk, size_t size, size_t nmemb, void* buf) {
        const size_t realsize = size * nmemb;
        static_cast<std::string*>(buf)->append(static_cast<char*>(chunk), realsize);
        return realsize;
    });
if (curl_easy_perform(handle)) std::cout << "failed\n";
curl_global_cleanup();

do_something(buf);

到目前为止一切正常,但最近它停止工作,我现在得到一个页面,告诉我“完成验证码”作为响应。据我从日志中可以看出,使用了 google recaptcha,但这就是我在这里所了解的全部内容。

但是,当使用浏览器登录时,我永远不必完成任何验证码。我在这里迷路了,因为我根本看不到它是如何工作的,或者为什么浏览器中的结果与代码不同。我已经从浏览器日志中复制了完整的标题

// add this after setting the cookie in the code above
struct curl_slist* list = NULL;
list = curl_slist_append(list, R"(Key: value)");
// and more ..
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, list);

但我仍然得到这个“完成验证码”的结果。所以我(除非日志隐藏了什么?)从代码中发送与浏览器完全相同的请求,但我得到了不同的响应。在此之前没有其他 GET / POST 或任何事情发生。当我清除日志并刷新页面时,这是浏览器发送的第一个请求。

我意识到制作验证码是为了防止机器人登录,但不仅浏览器中实际上没有任何验证码,我也可以手动登录,只要我可以在我的代码中使用会话。换句话说 - 浏览器可以在没有人工交互的情况下完成它,所以很明显它可以用代码来完成。那么,如果我想写一个浏览器,我该怎么做呢?那代码不会也使用curl吗?

标签: curlrecaptcha

解决方案


推荐阅读