2

我正在使用 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 都是新手 :)

4

2 回答 2

2

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

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);
于 2012-10-29T06:24:40.870 回答
1

您熟悉HTTPHTML吗?您至少应该知道什么是GETHEADPOSTrequests ,以及当用户通过浏览器提交表单时,协议级别究竟发生了什么。您可以通过使用telnet并手动键入 HTTP 请求来练习。

然后,您想以POST编程方式发出请求。libcurl有几个例子,你应该看看postit2.c

您可能会关注HTTP cookie,并查看cookie_interface.c示例。你CURLOPT_COOKIEFILE错了(你给了一个由单个空格命名的文件)。

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

于 2012-10-29T06:04:08.343 回答