用libcurl在C中检索数据

用libcurl在C中检索数据,c,libcurl,C,Libcurl,我使用C和libcurl登录到一个网站并从表单中检索一个值(即将字符串“username=random”放入一个char数组)。这就是我到目前为止所做的: curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0"); curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); curl_easy_setopt(

我使用C和libcurl登录到一个网站并从表单中检索一个值(即将字符串“username=random”放入一个char数组)。这就是我到目前为止所做的:

curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0");
    curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 );
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, " "); 
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.website.com/login");
    curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_REFERER, "http://www.website.com/login");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,fields );
    curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.website.com/form-with-data");

    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    }
但我不知道从那以后该怎么办。我尝试将整个页面写入一个文件,然后手动搜索字符串,但没有成功

我相信有一个简单的答案,我对C和libcurl都是新手:)

你熟悉和吗?您至少应该知道什么是
GET
HEAD
POST
请求,以及当用户通过浏览器提交表单时,协议级别上到底发生了什么。您可以通过手动使用和键入HTTP请求进行练习

然后,您希望以编程方式发出
POST
请求。这本书有几个例子,你应该看看里面

你可以关注并研究一下这个例子。您的
CURLOPT_-COOKIEFILE
错误(您提供的文件以单个空格命名)


编译时不要忘记启用所有警告和调试信息。如果在Linux上,则使用
gcc-Wall-g yourexample.c-lcurl-o yourprog
编译代码,并改进代码,直到没有发出警告为止。然后学习使用gdb进行调试。

您当前的代码将完成一件事:它将数据写入标准输出。要积累数据,您必须执行以下操作:

size_t write_clbk(void *data, size_t blksz, size_t nblk, void *ctx)
{
    static size_t sz = 0;
    size_t currsz = blksz * nblk;

    size_t prevsz = sz;
    sz += currsz;
    void *tmp = realloc(*(char **)ctx, sz);
    if (tmp == NULL) {
        // handle error
        free(*(char **)ctx);
        *(char **)ctx = NULL;
        return 0;
    }
    *(char **)ctx = tmp;

    memcpy(*(char **)ctx + prevsz, data, currsz);
    return currsz;
}

hndl = curl_easy_init();
// Set up the easy handle, i. e. specify URL, user agent, etc.
// Do the ENTIRE setup BEFORE calling `curl_easy_perform()'.
// Afterwards the calls to `curl_easy_setopt()' won't be effective anymore

char *buf = NULL;
curl_easy_setopt(hndl, CURLOPT_WRITEFUNCTION, write_clbk);
curl_easy_setopt(hndl, CURLOPT_WRITEDATA, &buf);
curl_easy_perform(hndl);
curl_easy_cleanup(hndl);

// here `buf' will contain the data
// after use, don't forget:
free(buf);

不,我不熟悉HTTP或HTMl。我想我应该在尝试使用libcurl之前学习它们。我希望这样一个简单的任务不需要太多关于这两个方面的知识,但我想我错了。如果你不懂HTTP,不懂HTML,不懂C,那么在制作一个可用的程序之前,你有很多东西需要学习和阅读。请花几个小时(阅读和练习)。如果你知道一些脚本语言(Python、Ocaml、Ruby、Perl),你可以用它来代替
libcurl
(它在许多语言中都有绑定)。我对C比较了解,因为我学过几门课程,只是对HTML或HTTP没有经验。谢谢你的帮助。在我有15篇帖子之前我不能投票。不要使用
if(curl){code}
尝试使用
if(!curl){handleerrors}
后一种形式更紧凑、更方便。