Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) [duvida] Busca em TWebBrowser


Vírus~

Pergunta

Hi there.

Gostaria de saber como posso descobrir se há algo em uma página. Exemplificando:

Quero saber se no google.com existe a palavra "amigo" escrito.

Mas não posso puxar o html para pesquisar nele (estou trabalhando com um site que usa import por javascript).

Ok ok, direto ao ponto.

É um programa que ficará monitorando meu orkut (ele puxa tudo por javascript, html não pega os textos...) e se encontrar alguma palavra de xingamento (de uma lista de palavras) me avisa imediatamente (com uma mensagem na tela).

O que preciso saber é apenas como descobrir se há algo escrito na página... Já penei pesquisando no google isso e não encontrei, até que achei esse fórum (primeiro fórum que vejo que tem usuarios bem ativos).

Se alguém souber help.

Editado por Vírus~
Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Testei o código...

Ele funciona nas páginas normais (no google funciona, etc) mas no orkut não ;x~

Esse é o problema, ele simplesmente não busca nada '-'

Já é o 3 código desse tipo que usa... Código que analisa HTML não funciona, porque o código do orkut é todo importado, não da nem para salvar as páginas.

Tem que ser alguma função que faça uma busca identica à busca dos navegadores... Elas encontram as palavras no orkut, mas no delphi as funções comuns não estão funcionando não :/

Nota: Obrigado pela resposta ^^

Se souber algum outro código ou como posso achar isso agradeço muito '-'

Editado por Vírus~
Link para o comentário
Compartilhar em outros sites

  • 0

Olha, encontrei um código que funciona como preciso:

procedure TForm2.WBFindDialog(AWebBrowser: TWebbrowser);
const
  CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
  HTMLID_FIND = 1;
var
  CmdTarget : IOleCommandTarget;
  vaIn, vaOut: OleVariant;
  PtrGUID: PGUID;
begin
  New(PtrGUID);
  PtrGUID^ := CGID_WebBrowser;
  if AWebBrowser.Document <> nil then
    try
      AWebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget);
      if CmdTarget <> nil then
        try
          CmdTarget.Exec(PtrGUID, HTMLID_FIND, 0, vaIn, vaOut);
        finally
          CmdTarget._Release;
        end;
    except
    end;
  Dispose(PtrGUID);
end;

Só não entendi como separar o código de busca certinho... Me parece que ele chama uma função já existente. Essa função consegue localizar o texto.

Se alguém souber isolar só o código de buscar, de modo que seja possível alterar ele para receber um true / false se ele encontrar ou não o texto a ajuda seria muito bem vinda '-'

Nota: Não quero que apareça o dialog, a busca tem que ser feita automaticamente pelo programa. Como buscar depois eu dou um jeito, faço ele seguir uma lista, o problema é como passar direto a string que quero buscar e apenas saber se tem ou não...

Editado por Vírus~
Link para o comentário
Compartilhar em outros sites

  • 0

Fala brother

então, tambem curioso fiquei tentando rs

até porque se mostra no browser, independente do que seja tipo javascript ou não, teria que ter uma forma de conseguir isso...

o segredo ta no seguinte, o Orkut emula um frame "quase" que invisível e isso que estava "impedindo" ou melhor, dificultando conseguir pegar o "texto" da página...

repara que quando você faz login no Orkut, lá emcima aparece tipo uma linha escura, na verdade é um Frame...

a solução foi primeiro obter o frame e depois o texto

pra testar, coloque um TWebBrowser um TButton e um TMemo...

procedure TForm1.Teste;
var
  documento: IHTMLDocument2;
  index: OleVariant;
  elementos: IHTMLElementCollection;
  frame_dispatch: IDispatch;
  framewnd: IHTMLWindow2;
  framedoc: IHTMLDocument2;
begin
  documento := WebBrowser1.Document as IHTMLDocument2;
  index := 0;
  frame_dispatch := documento.Frames.Item(index);
  if Assigned(frame_dispatch) then
  begin
    framewnd := frame_dispatch as IHTMLWindow2;
    framedoc := framewnd.document;
    Memo1.Text := framedoc.Get_body.Get_outerText;
  end;
end;

depois só chamar Teste e no Memo aparecerá o conteúdo :)

abrxx

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0

Postando a solução para quem algum dia precisar disso ^^

Me ajudam eu ajudo também quem precisar :P

procedure TForm2.Buscar(WB: TWebBrowser; Text: string);
var
  tr: IHTMLTxtRange;
  documento: IHTMLDocument2;
  index: OleVariant;
  frame_dispatch: IDispatch;
  framewnd: IHTMLWindow2;
  framedoc: IHTMLDocument2;
begin
  documento := WebBrowser1.Document as IHTMLDocument2;
  index := 0;
  frame_dispatch := documento.Frames.Item(index);
  if Assigned(frame_dispatch) then
  begin
    framewnd := frame_dispatch as IHTMLWindow2;
    framedoc := framewnd.document;
    framedoc.Get_body.Get_outerText;
   if Assigned(WB.Document) then
   begin
      tr := ((framedoc AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
     if tr.findText(Text, 1, 0) then
     begin
        ShowMessage('achou');
     end;
   end;
   end;
end;

Adaptei o código que ele passou no final com o código que me passou no começo!

O código mostra "achou" se encontrar a palavra buscada.

Ai é só adaptar para uma function com resposta true ou false ;D

Obrigado novamente!!!! :D

Link para o comentário
Compartilhar em outros sites

  • 0

Aproveitando o tópico para outra dúvida do mesmo assunto:

O comando "tr.scrollIntoView(True);" vai levar o documento até a 'ponta' do que ta escrito...

Eu queria que ele descesse umas 2 ou 3 linhas a mais, para mostrar o scrap inteiro (vou tirar foto)...

Tentei o "WebBrowser1.ScrollBy();" mas ele desce o treco todo e a foto continua saindo identica.

Se alguém (Churc) souber como fazer isso... agradeço novamente a ajuda XD

Link para o comentário
Compartilhar em outros sites

  • 0

fala rapazz :D

aqui foi direitinho, testa ai

function GetCurrentWbPos(wb: TWebBrowser): Integer;
var
  documento: IHTMLElement2;
begin
  Result := 0;

  if not Assigned(wb.Document) then
  Exit;

  documento := (wb.Document as IHTMLDocument3).documentElement as IHTMLElement2;

  if not Assigned(documento) then
  documento := (wb.Document as IHTMLDocument2).Body as IHTMLElement2;

  Result := documento.scrollTop;
end;

procedure ScrollWb(wb: TWebBrowser; i: Integer);
var
  documento: IHTMLElement2;
begin
  if not Assigned(wb.Document) then
  Exit;

  documento := (wb.Document as IHTMLDocument3).documentElement as IHTMLElement2;

  if not Assigned(documento) then
  documento := (wb.Document as IHTMLDocument2).Body as IHTMLElement2;

  documento.scrollTop := i;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := GetCurrentWbPos(WebBrowser1);

  ScrollWb(WebBrowser1, i + 200);
end;

se não está descendo o suficiente, aumente de 200 ou diminua conforme necessidade

abrxx

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0

tr.scrollIntoView(True);
        try
          i:=GetCurrentWbPos(WebBrowser1);
        finally
          ScrollWb(WebBrowser1, i + 200);
        end;

Não funcionou, fiz assim...

Expliquei errado no post anterior... queria dizer que o scrollIntoView funciona, mas o outro não :/

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...