我想做像迅雷一样的软件
用脚本调用COM把URL传到我自己的程序
做到这里发现很多论坛的URL都不是真实的URL
Google了一下大致都说是要看http数据包
也抓了来看
但是把所有包都看透了还是没有找到我要的http://…… .torrent的真实URL
请问还有别的方法可以实现吗?
非常感谢

解决方案 »

  1.   

    没弄过,支持一下子,可能与CInternetSession相关
      

  2.   

    迅雷是用BHO实现把URL传递到程序的吧?
      

  3.   

    迅雷的实现不仅仅是简单的分析一个网页,他自己维护了一个资源的服务器,所有的都要先到他的服务器上搜索看是否有相应的资源,最后才会使用url中的内容。
      

  4.   

    很感谢上面两位大哥热心回答
    但我已经实现把URL传进我自己的程序里了,现在问题是在很多网站的下载链接显示出来的URL都不是真实的,例如: http://dl1.www2.btchina.net/download.php?s=5284695909d28b74&attachmentid=1151897
    后缀名不是.torrent,这样一来没办法用我自己写的程序下载,
    请问要如何得到真正的文件链接,迅雷,flashget等软件都可以做到的,感谢了
      

  5.   

    blackcat242(黑猫)大哥
    您的意思是迅雷的资源服务器上面搜集了各种各样的种子档案吗
    他会先根据档名去搜索吗?
    所以网页上显示的URL大多数是参考用?
    这样一个服务器要实现的流程大概如何?
    小弟很菜..
    还请高手们多多赐教
      

  6.   

    应该是URL重定向吧,你仔细看一下flashget的下载详细信息
      

  7.   

    下载大体是两类:一是迅雷、bt这种方式采用类似p2p方式,需要维护节点或者资源信息的;二是直接根据url下载的;你的意思应该是直接使用url下载吧,那就重定向一下
      

  8.   

    我明白楼主的意思了,楼主是说,某些网址上的URL是http://xxx.yyy.com/zzz.php?s=1234567这样的东西,点击后才会出现保存torrent文件的提示,对吧?那是因为这个torrent文件是在该网站的某个目录下,只有通过上面的php加参数才会被验证并读取,这是一种网站下载的管理方式,你就算下载一个RAR压缩的文件他也是这样存放及下载的.所以你直接去取的这个URL是不能作为资源文件的,主要是那个PHP就相当于一个函数,你传入了参数他再计算出真实的URL,我明白楼主的意思了,给你代码吧:
    CString   CDownInfoDlg::DownURL(CString   strURL)   
      {   
      CInternetSession   m_Session("DigitalTitan");   
      CHttpFile*   pFile=NULL;   
      CException*   e;   
        
      TCHAR   szTempPath[MAX_PATH],szTempFile[MAX_PATH];   
      DWORD   dwResult=::GetTempPath(MAX_PATH,szTempPath);   
      CString   strURLPath;   
      GetTempFileName(szTempPath,_T("DigitalTitan_"),0,szTempFile);   
      strURLPath=szTempFile;   
      TRY   
      {   
         pFile=(CHttpFile*)m_Session.OpenURL(strURL);   
      }   
      CATCH_ALL(e)   
      {   
         pFile=NULL;   
         AfxMessageBox("URL地址不合法",MB_ICONINFORMATION);   
         return   "";   
      }   
      END_CATCH_ALL   
        
      if(pFile)   
      {   
         DWORD   dwStatus;   
         DWORD   dwBufLen=sizeof(dwStatus);   
         BOOL   bSuccess=pFile->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,&dwStatus,&dwBufLen);   
       if(bSuccess&&dwStatus>=200&&dwStatus<300)   
       {   
         CStdioFile   m_File;   
         if(m_File.Open(strURLPath,CFile::modeWrite|CFile::modeCreate|CFile::typeBinary))   
         {   
           BYTE   pBuf[1024];   
           DWORD   dwRead;   
           do   
           {   
            dwRead=pFile->Read(pBuf,1024);   
            m_File.Write(pBuf,dwRead);   
           }   
           while(dwRead>0);   
           m_File.Close();   
         }   
       }   
         pFile->Close();   
         delete   pFile;   
      }   
      else   
      {   
          m_Session.Close();   
      }   
      return   strURLPath;   
      }   
      
      

  9.   

    以上代码专业针对此类URL地址的,函数返回真实URL地址。
      

  10.   


    我的问题正是你理解的那样
    但是这代码我刚试了下,产生这样的URL?C:\DOCUME~1\Elsie\LOCALS~1\Temp\Dig3C.tmp
    我是传了这个进去试http://dl1.www2.btchina.net/download.php?s=5284695909d28b74&attachmentid=1151897
    请帮忙我看下..
    我现在初步是要把种子.torrent档下载下来,还没到要下载档案本身,URL应该是有解的吧?
    或者给我点思路,感谢
      

  11.   

    又抓了数据包来看
    客户端->服务器:
    GET /download.php?s=8c1c67f0da10360b&attachmentid=1221891 HTTP/1.1\r\n
    Request Method: GET
    Request URI: /download.php?s=8c1c67f0da10360b&attachmentid=1221891
    Request Version: HTTP/1.1
    Accept: */*\r\n
    Referer: http://bt1.btchina.net/yycaf/\r\n
    Accept-Language: zh-tw\r\n
    Accept-Encoding: gzip, deflate\r\n
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; .NET CLR 2.0.50727; InfoPath.1; CIBA)\r\n
    Host: nnv.dl1.btchina.net\r\n
    Connection: Keep-Alive\r\n
    Cookie: default_search_line=0\r\n服务器->客户端
    HTTP/1.1 200 OK\r\n
    .
    .
    Content-disposition: filename=www.yycaf.net[\304\332\326\372\326\256\315\365.10][yycaf\326\306\327\367]-caf.torrent\r\n
    此封包的data就是我要的torrent档的内容我尝试制造一样的GET数据包发到服务器想直接得到torrent档内容,结果返回403 forbidden,表示这方法行不通…
    若是URL重定向是否在数据包里会有真实的URL,
    能够透过VC代码找出URL的真实地址吗
    非常困惑阿…请达人给我指点
      

  12.   

    抓一下迅雷下载 http://dl1.www2.btchina.net/download.php?s=5284695909d28b74&attachmentid=1151897 的数据包分析一下。估计与 cookie 有关。
      

  13.   

    或者 http://dl1.www2.btchina.net/download.php?s=5284695909d28b74&attachmentid=1151897 已经过期了
      

  14.   

    我用迅雷下载torrent档然后自己构造了一模一样的GET数据包:
    GET /download.php?s=de813a98848fc890&attachmentid=1215934 HTTP/1.1\r\n
    Accept: */*\r\n
    Cache-Control: no-cache\r\n
    Connection:   Keep-Alive\r\n
    Cookie: default_search_line=0; btchina_sid=951acf783d14c2bb263c31afb26ee3057c39d53191c323eb\r\n
    Host: dl2.www2.btchina.net\r\n
    Pragma: no-cache\r\n
    Referer: http://search3.btchina.net/btsearch.php?query=%BA%AB%BE%E7&type=0\r\n
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n
    \r\n成功发送出去了但是服务器没有任何反应,请问会是哪个环节不通过,cookie吗?
    再请各位大侠指点
    如小弟的方向错误也请达人不吝纠正
      

  15.   


    服务器->客户端 
    HTTP/1.1 200 OK\r\n 


    Content-disposition: filename=www.yycaf.net[\304\332\326\372\326\256\315\365.10][yycaf\326\306\327\367]-caf.torrent\r\n 
    此封包的data就是我要的torrent档的内容 
    ---------------------------------------太笨了吧?服务器不是给你内容了么?你自己都知道了,此封包的data就是我要的torrent档的内容
    你可以把这个内容保存一个torrent文件啊
      

  16.   

    这是迅雷下载时的数据包,不是我自己实现得到的…
    现在我要做一个跟迅雷差不多的下载器
    一直卡在URL的问题
    还有人可以为我解惑吗