我的CSDN博客下载器,下载博客文章保存为mht文件

                 近日,看到某人写了一个下载CSDN博文的软件,输入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 来保存。

软件界面

我的CSDN博客下载器,下载博客文章保存为mht文件_第1张图片

 

带关键字的文章检索

我的CSDN博客下载器,下载博客文章保存为mht文件_第2张图片

 

由关键字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里面函数,但是不知道怎么去实现

	 CoInitialize(NULL);
	 BSTR bstr=szPageURL.AllocSysString();
	 CString szUserName="domain\\username";
	 BSTR bstrUserName=szUserName.AllocSysString();
	 CString szPass="domain\\username";
	 BSTR bstrPass=szPass.AllocSysString();
	 IMessage *pMsg=NULL;
	 IConfiguration* pConfig = NULL;
	 _Stream*        pStm    = NULL;

	  HRESULT hr=CoCreateInstance(
		  __uuidof(Message),
		  NULL,
		  CLSCTX_INPROC_SERVER,
		  __uuidof(IMessage),
		  (void**)&pMsg);


	   hr=CoCreateInstance(
		   __uuidof(Configuration),
		   NULL,
		   CLSCTX_INPROC_SERVER,
		   __uuidof(IConfiguration),
		   (void**)&pConfig);

	  pMsg->put_Configuration (pConfig);

      try
      {
         pMsg->CreateMHTMLBody(
          bstr, 
            cdoSuppressNone,
            bstrUserName,
            bstrPass );
      }
      catch(_com_error err)
      {
         // handle exception
		  AfxMessageBox("Exception");
		  return 0;
      }   

      _StreamPtr pStream;
      pMsg->GetStream(&pStm);

      pStm->SaveToFile( szFileName.AllocSysString(),
	      adSaveCreateOverWrite);
      pMsg->Release();
      pStm->Release();
      CoUninitialize();
      return 1;

 

工程下载地址:http://download.csdn.net/detail/lilien1010/4475758

你可能感兴趣的:(java,exception,String,null,delete,internet)