大家好!
我目前正尝试通过curlcpp代码下载由URL提供的文件,如:
http://www.eoddata.com/Data/symbollist.aspx?e=CODE
如果我已连接到网站,则只能下载此文件。有当前的登录表单:
<div id="ctl00_cph1_lg1_pnlLogin" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_cph1_lg1_btnLogin')">
<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;
}
但似乎登录无效。我有的输出是注册页面,登录表单,这意味着登录失败。有人有想法吗?
答案 0 :(得分:1)
我发现了这个问题。问题在于网站本身,它使用令牌和javascripts与身份验证过程。由于这太复杂,我用Selenium间接使用。