卷曲 - 使用登录从间接URL下载文件

时间:2016-03-27 17:07:35

标签: c++ curl login download libcurl

大家好!

我目前正尝试通过curlcpp代码下载由URL提供的文件,如:

http://www.eoddata.com/Data/symbollist.aspx?e=CODE

如果我已连接到网站,则只能下载此文件。有当前的登录表单:

<div id="ctl00_cph1_lg1_pnlLogin" onkeypress="javascript:return WebForm_FireDefaultButton(event, &#39;ctl00_cph1_lg1_btnLogin&#39;)">

        <table cellpadding="4" cellspacing="0" width="100%" border="0" style="margin-bottom:10px;">
          <tr>
            <td>Email/Username:</td>
            <td><input name="ctl00$cph1$lg1$txtEmail" type="text" id="ctl00_cph1_lg1_txtEmail" style="width:160px;" /></td>
          </tr>
          <tr>
            <td>Password:</td>
            <td><input name="ctl00$cph1$lg1$txtPassword" type="password" id="ctl00_cph1_lg1_txtPassword" style="width:160px;" /></td>
          </tr>
          <tr>
            <td></td>
            <td><input id="ctl00_cph1_lg1_chkRemember" type="checkbox" name="ctl00$cph1$lg1$chkRemember" /><label for="ctl00_cph1_lg1_chkRemember">Remember Me</label></td>
          </tr>
          <tr><td colspan="2"><span id="ctl00_cph1_lg1_lblMessage" style="color:Red;"></span></td></tr>
          <tr>
            <td></td>
            <td><input type="submit" name="ctl00$cph1$lg1$btnLogin" value="Login" id="ctl00_cph1_lg1_btnLogin" class="fancy" with="80px;" style="height:28px;" /></td>
          </tr>         
        </table>        

我尝试执行以下代码:

static size_t http_write(void* buf, size_t size, size_t nmemb, void* userp)
{
if(userp){
    std::ostringstream* oss = static_cast<std::ostringstream*>userp);
    std::streamsize len = size * nmemb;
    oss->write(static_cast<char*>(buf), len);
    return nmemb;
}
return 0;                   
}  

bool getSymbols(std::vector<string> exchange_symbols) 
{
    ostringstream output;
    curl_ios<ostringstream> writer(output);
    curl_form form;
    curl_easy easy;
    string url = "http://www.eoddata.com/Data/symbollist.aspx?e=";
    string currentURL;
    std::ostringstream oss;
    char* curURL;

    // Login procedure  
    easy.add<CURLOPT_USERAGENT>("Mozilla/4.0");
    easy.add<CURLOPT_AUTOREFERER>(1L);
    easy.add<CURLOPT_FOLLOWLOCATION>(1L);
    easy.add<CURLOPT_COOKIEFILE>("tmp/cookieeodata.txt");

    char *data="ctl00$cph1$lg1$txtEmail=ausername&ctl00$cph1$lg1$txtPassword=apassword&ctl00$cph1$lg1$btnLogin=Login";

    easy.add<CURLOPT_URL>("http://www.eoddata.com/default.aspx");
    easy.perform();
    easy.add<CURLOPT_REFERER>("http://www.eoddata.com/default.aspx");
    easy.add<CURLOPT_POSTFIELDS>(data);
    easy.perform();

    for (auto const &element: exchange_symbols)
    {
        currentURL = url + element;
        curURL = (char*)currentURL.c_str();
        easy.add<CURLOPT_WRITEFUNCTION>(&http_write);
        easy.add<CURLOPT_NOPROGRESS>(1L);
        easy.add<CURLOPT_FILE>(&oss);
        easy.add<CURLOPT_TIMEOUT>(0);
        easy.add<CURLOPT_URL>(curURL);
        easy.add<CURLOPT_FOLLOWLOCATION>(1L);
    }   
    easy.perform();
    std::cout << oss.str() << std::endl;

}

但似乎登录无效。我有的输出是注册页面,登录表单,这意味着登录失败。有人有想法吗?

1 个答案:

答案 0 :(得分:1)

我发现了这个问题。问题在于网站本身,它使用令牌和javascripts与身份验证过程。由于这太复杂,我用Selenium间接使用。