Recaptcha阻止使用c++;libcurl

Recaptcha阻止使用c++;libcurl,curl,recaptcha,Curl,Recaptcha,首先,我不是一个网络开发人员,主要是通过搜索networkanalysis浏览器日志、cookie和curl文档来自学 使用C++中的LIGBURL,几个月前我编写了一个程序来处理需要登录的页面的请求。为了避免不得不用代码登录(我还不知道怎么做),我选择用我的浏览器(Firefox)登录,识别会话cookie,然后从Firefox cookie数据库在我的代码中加载cookie。比如: curl_global_init(CURL_GLOBAL_ALL); auto handle = curl_e

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

使用C++中的LIGBURL,几个月前我编写了一个程序来处理需要登录的页面的请求。为了避免不得不用代码登录(我还不知道怎么做),我选择用我的浏览器(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);
但我还是得到了“完成验证码”的结果。因此,我(除非日志隐藏了什么?)从代码发送的请求与从浏览器发送的请求完全相同,但我得到的响应不同。 在此之前,没有其他GET/POST或任何事情发生。当我清除日志并刷新页面时,这是浏览器发送的第一个请求

  • 我遗漏了什么信息?标头+cookies中的一组键/值不是整个请求吗
  • 我如何做到这一点,即代码中的“完成验证码”,即在浏览器中不可见且自动完成

我意识到captcha是用来阻止机器人登录的,但浏览器中不仅没有任何captcha,我也可以手动登录,只要我可以在代码中使用会话。换言之,浏览器可以在没有人机交互的情况下完成这项工作,因此显然可以在代码中完成这项工作。例如,如果我想写一个浏览器,我会怎么做?这方面的代码不会也使用curl吗?

我猜谷歌的服务器端代码足够聪明,可以看到浏览器和curl程序之间的差异,并提示验证码。你到底想登录什么?您可能应该“正确”地执行此操作,而不是试图找到一种方法来解决此问题。我的bot活动的第一个触发因素是“用户代理是否在未加载登录表单或其依赖资源的情况下提交了登录表单?”此外,如果站点所有者在其中放入了recaptcha,他们通常不希望人们以编程方式访问它。你确定你没有违反条款和条件吗?没有API可以替代吗?@super我会这样想,但是我希望发送更多的请求来完成其他事情,而不是通过一个请求和一个cookie得到我想要的响应?我正在尝试登录pixiv.net/@Botje。我在网站上没有找到有文档记录的API,但有相关应用程序,所以假设它存在于某个地方。。?也有大量的请求提供了实用的json响应,所以可能是API的一部分?但我对这些也很陌生。我发现网站改变了他们的cookie,不知何故有两种变体,一种使用验证码,另一种不使用验证码——在使用新的验证码后,它会再次工作。然而,我最初的问题对我来说仍然不清楚——在浏览器(仍然适用于旧版本)和代码中有什么不同——所以我不会给出答案。
// 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);