当我这样做时
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。
任何想法,我如何发布所有必要的信息?
修改
好的,我通过这两个帖子here和here以及Daniel Stenberg
开始工作了所以我没有
就有相同的代码curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookies);
答案 0 :(得分:1)
发送到CURLOPT_POSTFIELDS的字符串与命令行使用的字符串不同!当您多次使用--data
时,curl会将字符串与中间的&符号(&)连接起来,而C代码则使用分号。
您将错误的输入传递给CURLOPT_COOKIEFILE。它接受文件名,没有别的。但是,您不需要在第二个请求中使用该选项,因为您启用了" cookie引擎"在第一个请求中,第一个请求中收到的所有cookie都保存在curl句柄中,并且在重用句柄时无论如何都将用于后续请求中。
要提取csrf_token
cookie,您可以使用CURLINFO_COOKIELIST
并解析Cookie列表来查找它,提取内容并在随后的POST请求中使用它。