最近想做个自动采集程序,发现不能下载有防盗链功能的网址(本站网址就是这样,好像自己在撬自家的锁哦!^_^),上CSDN问了一下,没有太多帮助,倒是自己慢慢研究出来了,把CSDN的发帖记录转到这里吧,作为一次探讨型的技术文章^_^
如何编写像FlashGet那样带引用地址的下载程序?
现在有很多下载地址有防盗链的处理,我写的下载程序不能获得该地址的真实文件路径,但FlashGet采用了一个引用页面的地址设置,这样它就可以下载了,请问这是什么原理啊?在VC中应该如何设置?我用的WinInet写的。
我是想自己写一个下载的程序,比如在这个网址
http://www.vscodes.com/Software/Catalog7/558.html
下面的下载地址为
http://www.vscodes.com/down.asp?id=556&downid=0
我直接采用http://www.vscodes.com/down.asp?id=556&downid=0这个地址下载(用自己的程序,不是右键另存或直接点击),它就会得到<script href='http://www.vscodes.com'></script>,而不是下载的文件。
但我用FlashGet下载时,它就能够下载到文件,我想做成这个样子!
有哪位大哥做过这样的程序啊?
asp页面进行了HTTP_REFERER判断。
我好像找到点思路了,用OpenRequest的时候里面有个一个Referer参数,但我SendRequest的时候就抛出异常了这是怎么回事啊?
代码日下:
void CWinInetDlg::OnBnClickedBtnDownload()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
CHttpConnection* pConnection;
CHttpFile* pFile;
CInternetSession session(NULL, 0);
DWORD dwRet;
char szBuff[1023];
BOOL result;
try
{
pConnection = session.GetHttpConnection("http://www.vscodes.com");
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,m_sUrl,"http://www.vscodes.com/Software/Catalog7/558.html",1,NULL,NULL,INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE);
result = pFile->SendRequest();
pFile->QueryInfoStatusCode(dwRet);
CString strPage;
if (dwRet == HTTP_STATUS_OK)
{
memset(szBuff,0,1023);
UINT nRead = pFile->Read(szBuff, 1023);
strPage=szBuff;
while (nRead > 0)
{
memset(szBuff,0,1023);
nRead = pFile->Read(szBuff,1023);
strPage+=szBuff;
//read file...
}
}
else
{
}
if(pFile!=NULL)
{
delete pFile;
pFile=NULL;
}
if(pConnection!=NULL)
{
delete pConnection;
pConnection =NULL;
}
m_sContent = strPage;
}
catch (CInternetException* pEx)
{
if(pFile!=NULL)
{
delete pFile;
pFile=NULL;
}
if(pConnection!=NULL)
{
delete pConnection;
pConnection =NULL;
}
pEx->Delete();
}
UpdateData(FALSE);
}
现在下载下来了,上面的问题在于pConnection = session.GetHttpConnection("http://www.vscodes.com");
应该用pConnection = session.GetHttpConnection("www.vscodes.com");
但又出了新的问题:它直接给我下载下来了,我如何得到真实的文件名啊?
算了,结贴吧,感谢楼上各位兄弟的关注!我把我知道的写下来吧:
在请求中添加"Referer:"参数加入引用页面,就可以突破防盗链的代码了;因为防盗链的代码原理是:
server_v1 = CStr(Request.ServerVariables("HTTP_REFERER"))
server_v2 = CStr(Request.ServerVariables("SERVER_NAME"))
If Mid(server_v1, 8, Len(server_v2)) = server_v2 Then
CheckPost = True
End If
用OpenRequest好像它直接识别了文档中的Redirect代码,所以直接下载下来了。我用自己写的代码获得了
<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="/UploadFile/2005-12/200512481477409.rar">here</a>.</body>
这样的内容,也就找到了真实的文件名了。