编程的方法

解决方案 »

  1.   

    分析网页,取得其中flash的url,再把它下载下来
      

  2.   

    begin
     xcount:=0;
      Wnd := FindWindow('IEFrame', nil);
      if Wnd = 0 then
          begin
           // form1.Memo1.Lines.Add('【IE没有运行】');
            exit;
          end;
      WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);
      if WndChild <> 0 then
          begin
                WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
                if WndChild <> 0 then
                begin
                  GetIEFromHWnd(WndChild, IE); //Get Iwebbrowser2 from Handle
                  Document := IE.Document as IHtmlDocument2;
                  if Assigned(Document) then
                      begin
                          all := Document.All;
                            for I := 0 to all.Length - 1 do
                             begin
                                vk:=i;
                                dispatch:=all.item(vk,0);
                                if succeeded(Dispatch.QueryInterface(IHTMLObjectElement,hinput)) then
                                begin
                                xcount:=xcount+1;
                                strx[xcount]:=hinput.altHtml;
                               // showmessage(IntToStr( xcount));
                           // form1.memo1.Lines.Add(hinput.altHtml);//:=edit1.Text
                           // form1.memo1.Lines.Add( '【FLASH】 '+hinput.codeBase);//:=edit1.Text
                             form1.Edit1.Text:=hinput.BaseHref;//:=edit1.Text
                            // form1.memo1.Lines.Add( '【FLASH】 '+hinput.data);//:=edit1.Text
                                end;
                              end;
                             end; 
                    end;  
        end;
    end;
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
      CheckListBox1.Clear;
      getIEpassword ;
      Timer1.Enabled:=true;end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      str:string;
      stari,endi,i:integer;
    begin
      if (pos('.htm',edit1.Text)<>0) or (pos('.shtml',edit1.Text)<>0) or (pos('.asp',edit1.Text)<>0) or (pos('.html',edit1.Text)<>0) or (pos('.jsp',edit1.Text)<>0) or (pos('.aspx',edit1.Text)<>0) then
      begin
        edit2.Text:=   StrrScan(pchar(edit1.text),'/') ;
        edit2.Text:=IntToStr( ansipos(edit2.text,edit1.Text ) );
        edit2.Text:=LeftStr(edit1.Text,StrToInt(edit2.Text));
      end else edit2.Text:=edit1.Text;
      label1.caption:=edit2.Text;
      for i:=1 to xcount do
      begin
              str:=UpperCase( trimright( strx[i]));
              stari:=  pos('"',str);
              endi:= Pos('.SWF',str);
              edit3.Text:=MidStr(str,stari+1,endi+3-stari) ;
             IF POS('/',EDIT3.Text)=1 THEN EDIT3.Text:=MidStr(EDIT3.Text,2,LENGTH(EDIT3.Text)-1);
             // ShowMessage(edit3.Text);
            if ansipos('http:',edit3.Text)=0 then
              edit2.text:=label1.Caption+edit3.text
            else edit2.text:=edit3.text;
           // ShowMessage(edit2.Text);
            if pos('.SWF',edit2.Text)<>0 then
              CheckListBox1.Items.Add(edit2.Text);
        end;
        Timer1.Enabled:=false;
    end;
    function GetURLFileName(aURL: string): string;
    var
      i: integer;
      s: string;
    begin //返回下载地址的文件名
      s := aURL;
      i := Pos('/', s);
      while i <> 0 do //去掉"/"前面的内容剩下的就是文件名了
      begin
        Delete(s, 1, i);
        i := Pos('/', s);
      end;
      Result := s;
    end;
    function GetProt(aURL: string): Byte;
    begin //检测下载的地址是http还是ftp
      Result := 0;
      if Pos('http', LowerCase(aURL)) = 1 then
        Result := 1; //http协议
      if Pos('ftp', LowerCase(aURL)) = 1 then
        Result := 2; //ftp协议
    end;
    procedure HttpDownLoad(aURL, aFile: string; bResume: Boolean);
    var
      tStream: TFileStream;
    begin //Http方式下载
      if FileExists(aFile) then //如果文件已经存在
        tStream := TFileStream.Create(aFile, fmOpenWrite) else
        tStream := TFileStream.Create(aFile, fmCreate);
      if bResume then //续传方式
      begin
        form1.IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
        tStream.Position := tStream.Size - 1; //移动到最后继续下载
        form1.IdHTTP1.Head(aURL);
        form1.IdHTTP1.Request.ContentRangeEnd := form1.IdHTTP1.Response.ContentLength;
      end else //覆盖或新建方式
      begin
        form1.IdHTTP1.Request.ContentRangeStart := 0;
      end;
      try
        form1.IdHTTP1.Get(aURL, tStream); //开始下载
      finally
        tStream.Free;
      end;
    end;procedure MyDownLoad(aURL, aFile: string; bResume: Boolean);
    begin
      case GetProt(aURL) of
        0: ShowMessage('不可识别的地址!');
        1: HttpDownLoad(aURL, aFile, bResume);
      end;
    end;
    procedure TForm1.CheckListBox1DblClick(Sender: TObject);
    var
      aURL, aFile: string;
    begin
    CheckListBox1.Checked[CheckListBox1.ItemIndex]:=TRUE; aURL := CheckListBox1.Items[CheckListBox1.Itemindex]; //下载地址,例如"http://www.2ccc.com/update/demo.exe"
      aFile := GetURLFileName(aURL); //得到文件名,例如"demo.exe"
      if FileExists(aFile) then
      begin
        case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, 0) of
          mrYes: MyDownLoad(aURL, aFile, True); //续传
          mrNo: MyDownLoad(aURL, aFile, False); //覆盖
          mrCancel: Exit; //取消
        end;
      end else MyDownLoad(aURL, aFile, False); //建立新文件下载
    end;procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      if AbortTransfer then
      begin //中断下载
        IdHTTP1.Disconnect;
        IdFTP1.Abort;
      end;
      ProgressBar1.Position := AWorkCount;
      Application.ProcessMessages;
    end;procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      AbortTransfer := False;
      if AWorkCountMax > 0 then
        ProgressBar1.Max := AWorkCountMax else
        ProgressBar1.Max := BytesToTransfer;
    end;procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      ProgressBar1.Position := 0;
    end;
      

  3.   

    这就是通过IE接口 分析网页中的FLAHS然后下栽 事实我这样做是错误的
      

  4.   

    这个没有那么复杂,
    感觉你的路子有点不对,
    这个东西我做过,
    用webbrowser控件
    其实很简单,用dom接口处理,
    你前面的差不多,
    都是首先 WeBbrowser1.Navigate(url);
    然后doc:=WebBrowser1.Document as IHTMLDocument2;
    a:=doc.all;
    e:=a.item(i, 0) as IHTMLElement;
    接着分析doc的元素,
    目前页面中的flash有好几种形式,
    分别处理,有的是直接取出object,有的要做语法分析,
    还有类似http://xx.yyy.zzz/check.php?m=xxxx这种带参数从库中直接调用的,
    至于要处理多少种情况,就要自己多测试各种站点了,
    判断各种flash这块是个重点,
    但我在你程序中没看出来都怎么处理了
    找到后处理下头尾得到文件名,
    一句话UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil)
    就下载了,不用自己弄一大堆下载的代码,
    记的UrlDownloadToFile要use urlmon
    做这种东西,MSDN要多看,看懂了就做的快了,
    ie很多接口拿来就用,功能很强,不用自己做,
    另外注意各个ie版本支持的功能差很多,
    特别是ie6和以前版本很多功能不兼容了
       
      

  5.   

    http://blog.csdn.net/jiangsheng/archive/2002/08/19/3788.aspx
      

  6.   

    如果是我,我绝不会用ie或者什么ie控件,我会先直接获得这个网页的源代码,再用正则表达式分析出其中的flash url,再下载下来。