近日,看到某人写了一个下载优快云博文的软件,输入csdn用户名就可以下载,但却是java写的,在java大行其道的天下,可惜我没学java,连java环境都没有,就想着用c++写一个类似的。
不过没有保存成pdf、doc之类的功能,(没有找到好的API,哈哈),因为我个人平时都是用浏览器直接保存为mht文件,所以直接在codeguru上面找了一个代码,保存一个页面为mht文件。
分析主要完成以下几个功能,
1、页面内容提取。
用CInterenetSession、CHttpConnection、CHttpFile 下载第一个页面,
2、分析blog主要信息,排名,积分等,这里没有用到xml分析(不会用),都是根据页面特点进行字符串扫描,效率有点低。
然后就在时提取里面的博客文章标题和它对应的url (当然如果有下一页就要不断分析了)
3、显示用户的主要blog信息。包括所有文章,以及头像(gdi+),这里还遇到了一个问题困扰了我两天,gdi+在vc6里面的配置问题
4、获取用户选择了的列表里面文章的URL交给 SaveOnePage 来保存。
软件界面
带关键字的文章检索
由关键字8086下载的内容
带头像
下载网页的代码
UINT GetWebText(CString & url,string *content,HWND hWnd=NULL)
{
CMyInternetSession *pSession = NULL;
CHttpConnection *pServer = NULL;
CHttpFile *pFile = NULL;
bool flag;
DWORD dwServiceType;
CString strServer;
CString strObject;
INTERNET_PORT nPort;
try{
flag=AfxParseURL( url,dwServiceType,strServer,strObject,nPort );
if(!flag)
{
AfxMessageBox(_T("打开地址错误")+url );
return false;
}
pSession=new CMyInternetSession;
pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,30000);
pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,2);
pServer = pSession->GetHttpConnection(strServer,nPort );
pSession->m_pMainWnd=hWnd;
pSession->EnableStatusCallback(TRUE);
}
catch (CInternetException* pEx)
{
pSession->Close();
pServer->Close();
pEx->Delete();
return false;
}
///
try
{
DWORD dwHttpRequestFlags =INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE ;
pFile=pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,NULL, 1,NULL, NULL,dwHttpRequestFlags);
pFile->SendRequest();
}
catch(CInternetException *pEx)
{
pSession->Close();
pServer->Close();
pEx->Delete();
return false;
}
char szBuf[1024]; //缓存
string *in,*out;
in=new string;
out=new string;
char * pText;
(*content)="";
while( pFile->ReadString(szBuf,1023))
{
in->assign(szBuf);
pText=(char *)in->c_str();
UTF_8ToGB2312(*out,pText, strlen(in->c_str()));
(*content).append(*out);
memset(szBuf,1024,0);
}
if( string::npos != (*content).find("没找到该页面") )
{
return 0;
}
delete in;
delete out;
pFile->Close();
pServer->Close();
pSession->Close();
if (pFile != NULL)
delete pFile;
if (pServer != NULL)
delete pServer;
if (pSession != NULL)
delete pSession ;
return 1;
}
下面的代码不是很懂,我的想法是可以调用浏览器里面的某个dll里面函数,但是不知道怎么去实现
工程下载地址:http://download.youkuaiyun.com/detail/lilien1010/4475758