如何在C中使用带有libcurl的cookie和postfields?

时间:2016-02-03 01:02:32

标签: c cookies libcurl

当我这样做时

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,但会丢失错误的字段。所以我认为这一行会发布所有字段:

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field1=field1;field1=field1;csrfmiddlewaretoken=(csrf token)");

我也尝试通过这一行传递所有字段:

curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);

将所有内容放在char array

我也尝试用,替换;,但没有任何作用。

我不认为我写错了什么,看起来更像是帖子互相覆盖,因为如果我在没有COOKIEFILE行的情况下运行程序,它会说缺少cookie。

任何想法,我如何发布所有必要的信息?

修改

好的,我通过这两个帖子herehere以及Daniel Stenberg

开始工作了

所以我没有

就有相同的代码
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);

1 个答案:

答案 0 :(得分:1)

  1. 发送到CURLOPT_POSTFIELDS的字符串与命令行使用的字符串不同!当您多次使用--data时,curl会将字符串与中间的&符号(&)连接起来,而C代码则使用分号。

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

  3. 要提取csrf_token cookie,您可以使用CURLINFO_COOKIELIST并解析Cookie列表来查找它,提取内容并在随后的POST请求中使用它。