如何在 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);
  1. 您发送到 CURLOPT_POSTFIELDS 的字符串与您的命令行使用的字符串不同!当您多次使用 --data 时,curl 将在字符串之间使用与号 (&) 连接字符串,而您的 C 代码使用分号。

  2. 您将错误的输入传递给 CURLOPT_COOKIEFILE。它接受一个文件名,没有别的。但是您不需要在第二个请求中使用该选项,因为您在第一个请求中启用了 "cookie engine",第一个请求中收到的所有 cookie 都保存在 curl 句柄中,并将在后续请求中使用无论如何,当重新使用句柄时。

  3. 要提取 csrf_token cookie,您将使用 CURLINFO_COOKIELIST 并解析 cookie 列表以找到它,提取内容并在随后的 POST请求.