curl - 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 或任何事情发生。当我清除日志并刷新页面时,这是浏览器发送的第一个请求。
- 我缺少什么信息?标头 + cookie 中的键/值集不是整个请求吗?
- 如何使这项工作,即代码中的“完成验证码”,在浏览器中是不可见的并且静默/自动完成?
我意识到制作验证码是为了防止机器人登录,但不仅浏览器中实际上没有任何验证码,我也可以手动登录,只要我可以在我的代码中使用会话。换句话说 - 浏览器可以在没有人工交互的情况下完成它,所以很明显它可以用代码来完成。那么,如果我想写一个浏览器,我该怎么做呢?那代码不会也使用curl吗?
解决方案
推荐阅读
- python - 为什么 day_num 没有定义?
- r - emmeans 无法在 R 中处理类“bigglm”的对象
- python - 无法通过 Facebook Graph API 获取任何事件
- python - 我是给 cross_val_score() 整个数据集还是只给训练集?
- flutter - Flutter StatefulWidget 层次结构
- java - Android Studio 活动场景
- swift - 获取所有项目列表并将其传递给数组
- javascript - Nightwatch.js:如何在运行测试套件之前运行登录脚本
- javascript - 如何在我的网页中移动 dojo 脚本?
- c - 使用 _may_i_use_cpu_feature 时出现“未解决的外部”错误