使用libcurl填写表单并获取最终的URL

时间:2017-04-30 08:22:44

标签: c++ openssl libcurl

我需要使用C ++和libcurl在网站上进行授权 网站有复杂的网址并使用https 网站返回表单

Login field:
<input type="text" maxlength="64" name="edit[id]" id="edit-id" size="60" value="" class="form-text required">
Password field:
<input type="password" name="edit[pass]" id="edit-pass" value="" maxlength="20" size="30" class="form-text required">
Submit button:
<input type="submit" name="op" value="Log in" id="account_login_submit" class="form-submit submit_button button" data-role="none">

当您输入正确的登录密码对时,网站会将您重定向到另一个页面,并在GET参数中使用&amp; token = ...代码

我目前的代码:

CURL *curl;
CURLcode res;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();
if(curl)
{
    curl_easy_setopt(curl, CURLOPT_URL, "https://url/dialog/oauth?");
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "edit[id]=login&edit[pass]=password");
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 

    res = curl_easy_perform(curl);

    char url[256];
    curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &url);
    printf("final [%s]\n");
}

现在它在CURLINFO_REDIRECT_URL中没有返回任何内容,并且在详细日志中返回表单的html代码

1 个答案:

答案 0 :(得分:0)

首先,你使用curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL..)错了,因为你应该传入指向char *的指针,但你的代码会传入一个指向char缓冲区的指针。我现在在CURLINFO_REDIRECT_URL手册页中添加了一个示例,以便更好地展示它。

但最终您可能不应该使用此选项,因为它旨在显示它将重定向到的URL ,如果您没有要求libcurl重定向 - 并且您要求libcurl遵循重定向(使用CURLOPT_FOLLOWLOCATION)。

如果您想找出libcurl重定向到的网址,请改用CURLINFO_EFFECTIVE_URL。该页面还有一个示例(现在),以显示它是如何使用的。