Recaptcha防止使用c ++ libcurl登录会话cookie

时间:2020-10-15 04:43:47

标签: curl recaptcha

首先,我不是网络开发人员,主要是想通过搜索网络分析浏览器日志,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或其他任何事情。当我清除日志并刷新页面时,这是浏览器发送的第一个请求。

  • 我缺少什么信息?标头+ Cookie中的键/值集不是整个请求吗?
  • 我该如何进行这项工作,即在代码中“完成验证码”,该代码在浏览器中是不可见的,并且是无声/自动完成的?

我意识到验证码是为了防止机器人程序登录而创建的,但不仅浏览器中实际上没有任何验证码,而且还可以手动登录,只要我可以在代码中使用会话即可。换句话说,浏览器无需人工干预即可完成此任务,因此很显然可以用代码来完成。那怎么如果我想编写一个浏览器,我会这样做吗?为此的代码也不会使用curl吗?

0 个答案:

没有答案