所以我知道还有其他类似的问题,我也一直在阅读,但我认为我的问题是独一无二的。我正在尝试登录mojang.com(不要问)并保持登录以便后续请求。但是当我将POST请求发送到登录页面时,它只是将登录页面转发给我。如何获得PAST登录页面?
我相信我已经激活了cookie引擎,并且成功记录并打印了cookie,但可能没有使用?
我的目标是在成功登录后访问此页面:https://account.mojang.com/me
session* mojang_login(const char *user, const char *pass,
const char *q1, const char *q2, const char *q3)
{
const char *url = "https://account.mojang.com/login";
const char *payload = construct_payload(user, pass);
const char *ua =
"Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0";
char errbuf[CURL_ERROR_SIZE] = {0};
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (!curl)
{
fprintf(stderr, "Failed to initialize curl\n");
return NULL;
}
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERAGENT, ua);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
res = curl_easy_perform(curl);
free((void*) payload);
if (res != CURLE_OK)
{
curl_err(res, errbuf);
return NULL;
}
struct curl_slist *cookies;
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
if (res != CURLE_OK)
{
curl_err(res, errbuf);
return NULL;
}
while (cookies)
{
printf("\nCOOKIE DATA: %s\n", cookies->data);
cookies = cookies->next;
}
session *s1 = NULL; /* safe_malloc(sizeof(session));*/
curl_easy_cleanup(curl);
return s1;
}
答案 0 :(得分:0)
(因为你实际上并没有提供完整的源代码,我无法准确地告诉你,但我会用通用术语来说明这个问题)
首先,您需要确保在登录POST之前记录cookie。一些站点在您查看登录页面时设置了cookie,因此您可能需要先获取该cookie。
然后,您需要确保在浏览器提交时提交登录信息(包括您在浏览器视图中看不到的隐藏表单字段)。解决问题的一个好方法是使用浏览器的网络工具准确捕获浏览器发送的内容,然后确保代码发送相同的内容。然后,您可以迭代几次,以确保您的请求与浏览器的请求尽可能相似。
当然,您必须启用Cookie,并且必须遵循重定向,因为大多数登录都会将您带到另一个页面。