如何在 C 中将 cookie 和 postfields 与 libcurl 一起使用?
how to use cookies and postfields with libcurl in C?
当我做
curl --get --cookie-jar mycookie.cookie http://mypage/page/
它会将 cookie 存储为 mycookie.cookie
然后当我这样做时
curl --cookie mycookie.cookie --data "field1=field1" --data "field2=field2" --data csrfmiddlewaretoken=(csrf token) http://mypage/page/register/
那个csrf token
我通过一个猫mycookie.cookie
然后手动填进去
这行得通。它做我想要的。
所以现在我想使用带有 C
的 libcurl 来执行此操作。按照文档我有这个:
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, http://mypage/page/);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
res = curl_easy_perform(curl);
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
curl_easy_setopt(curl, CURLOPT_URL, http://mypage/page/register/);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field1=field1;field1=field1;csrfmiddlewaretoken=(csrf token)");
res = curl_easy_perform(curl);
printf("Erasing curl's knowledge of cookies!\n");
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
curl_slist_free_all(cookies);
}
curl_global_cleanup();
return 0;
所以这将传递 cookie,但会抛出缺少字段的错误。所以我认为这一行将 post 所有字段:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field1=field1;field1=field1;csrfmiddlewaretoken=(csrf token)");
我还尝试通过这一行传递所有字段:
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
通过在 char array
中骑乘所有东西
我也尝试用 ;
替换 ,
但没有任何效果。
我不认为我写错了什么,它看起来更像是 post 互相覆盖,因为如果我 运行 程序没有 COOKIEFILE
行它说丢失曲奇饼。
任何想法,我如何 post 所有必要的信息?
编辑
好的,我通过这两个 posts and here 和 Daniel Stenberg
得到了它
所以我有相同的代码只是没有
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
您发送到 CURLOPT_POSTFIELDS 的字符串与您的命令行使用的字符串不同!当您多次使用 --data
时,curl 将在字符串之间使用与号 (&) 连接字符串,而您的 C 代码使用分号。
您将错误的输入传递给 CURLOPT_COOKIEFILE。它接受一个文件名,没有别的。但是您不需要在第二个请求中使用该选项,因为您在第一个请求中启用了 "cookie engine",第一个请求中收到的所有 cookie 都保存在 curl 句柄中,并将在后续请求中使用无论如何,当重新使用句柄时。
要提取 csrf_token
cookie,您将使用 CURLINFO_COOKIELIST
并解析 cookie 列表以找到它,提取内容并在随后的 POST请求.
当我做
curl --get --cookie-jar mycookie.cookie http://mypage/page/
它会将 cookie 存储为 mycookie.cookie
然后当我这样做时
curl --cookie mycookie.cookie --data "field1=field1" --data "field2=field2" --data csrfmiddlewaretoken=(csrf token) http://mypage/page/register/
那个csrf token
我通过一个猫mycookie.cookie
然后手动填进去
这行得通。它做我想要的。
所以现在我想使用带有 C
的 libcurl 来执行此操作。按照文档我有这个:
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, http://mypage/page/);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
res = curl_easy_perform(curl);
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
curl_easy_setopt(curl, CURLOPT_URL, http://mypage/page/register/);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field1=field1;field1=field1;csrfmiddlewaretoken=(csrf token)");
res = curl_easy_perform(curl);
printf("Erasing curl's knowledge of cookies!\n");
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
curl_slist_free_all(cookies);
}
curl_global_cleanup();
return 0;
所以这将传递 cookie,但会抛出缺少字段的错误。所以我认为这一行将 post 所有字段:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field1=field1;field1=field1;csrfmiddlewaretoken=(csrf token)");
我还尝试通过这一行传递所有字段:
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
通过在 char array
我也尝试用 ;
替换 ,
但没有任何效果。
我不认为我写错了什么,它看起来更像是 post 互相覆盖,因为如果我 运行 程序没有 COOKIEFILE
行它说丢失曲奇饼。
任何想法,我如何 post 所有必要的信息?
编辑
好的,我通过这两个 posts
所以我有相同的代码只是没有
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
您发送到 CURLOPT_POSTFIELDS 的字符串与您的命令行使用的字符串不同!当您多次使用
--data
时,curl 将在字符串之间使用与号 (&) 连接字符串,而您的 C 代码使用分号。您将错误的输入传递给 CURLOPT_COOKIEFILE。它接受一个文件名,没有别的。但是您不需要在第二个请求中使用该选项,因为您在第一个请求中启用了 "cookie engine",第一个请求中收到的所有 cookie 都保存在 curl 句柄中,并将在后续请求中使用无论如何,当重新使用句柄时。
要提取
csrf_token
cookie,您将使用CURLINFO_COOKIELIST
并解析 cookie 列表以找到它,提取内容并在随后的 POST请求.