Alguém que entenda de Parser HTML e queira discutir sobre o assunto?

Alguém que entenda de Parser HTML? Se houver alguém disposto a discutir o assunto…

Discutir o que rapaz?! O.o

Que tipo de coisas você quer saber? Que pacotes já existem prontos, que problema você precisa resolver com um parser HTML… ?

Isso de “discutir sobre o assunto” parece aquela outra frase famosa de “discutir a relação” - cada vez que um homem ouve essa expressão, ele sai de fininho porque lá vem chumbo grosso.

Por isso, seja menos genérico e diga o que realmente você quer saber.

Já que consegui despertar o interesse, vamos lá :smiley:

Estou tentando capturar a imagem do captcha deste site: http://processual.trf1.jus.br/consultaProcessual/numeroProcesso.php?secao=PI

private String imagem;

public void getImageFromTRF() {
        Document document = Jsoup.connect("http://processual.trf1.jus.br/consultaProcessual/numeroProcesso.php?secao=PI")
                .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5")
                .get();
        Element imagemCaptcha = document.getElementById("image_captcha");
        Element codigoCaptcha = document.getElementById("trf1_captcha_id");
        imagem = imagemCaptcha.attr("abs:src");
 }

E exibir na minha página:

<h:graphicImage value="#{captchaBean.imagem}"/>

O problema é que ela sempre vem sem as letras e número, aparece somente o fundo da imagem. E aí? O que acham que pode ser?

Sugestões:

1 - Verifique se a url que está na sua img, aponta de fato para o sistema deles.
2 - Pode ser que esta imagem esteja protegida contra linkagem externa, neste caso, acredito que você setando o referer para alguma pagina deles resolva o problema …

Não entendi o refer, teria um exemplo? O link esta correto, tanto que aparece a imagem sem os caracteres. Se eu abrir a página acima e copiar o link da imagem e jogar no navegador ele exibe a imagem, porém se eu matar a sessão, fechando o navegar e abrindo novamente ele aparece da mesma forma que no meu código.

[quote=WRYEL]Sugestões:

1 - Verifique se a url que está na sua img, aponta de fato para o sistema deles.
2 - Pode ser que esta imagem esteja protegida contra linkagem externa, neste caso, acredito que você setando o referer para alguma pagina deles resolva o problema …[/quote]

Você já tentou capturar a imagem usando a API Jsoup?

Capturando conteúdo HTML com JSoup

Da uma olhada.

E ai brother, beleza? Você nem viu o código né? Rsrsrs Olha essa linha:

Document document = Jsoup.connect("http://processual.trf1.jus.br/consultaProcessual/numeroProcesso.php?secao=PI")  
                .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5")  
                .get(); 

[quote=romarcio]Você já tentou capturar a imagem usando a API Jsoup?

Capturando conteúdo HTML com JSoup

Da uma olhada.[/quote]

[quote=benignoms]E ai brother, beleza? Você nem viu o código né? Rsrsrs Olha essa linha:

Document document = Jsoup.connect("http://processual.trf1.jus.br/consultaProcessual/numeroProcesso.php?secao=PI")  
                .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5")  
                .get(); 

[quote=romarcio]Você já tentou capturar a imagem usando a API Jsoup?

Capturando conteúdo HTML com JSoup

Da uma olhada.[/quote][/quote]

Hehe… Não reparei no código mesmo, só no link da imagem que você postou no código.

Foi mal!

Você viu que se executar apenas:

ImageIcon imagem = new ImageIcon(new URL("http://processual.trf1.jus.br/consultaProcessual/gen_captcha_image.php"));

JOptionPane.showMessageDialog(null, "", "Captcha", 0, imagem);

A imagem aparece com as letras? Agora, precisaria ter um n° de processo para testar se o código exibido vai ser validado.

Sim, se você chamar esse arquivo direto ele mostra com as letrar, entretanto, não serve como validação para o CAPTCHA pois é uma imagem aleatória, sem vínculo com a página de busca. :frowning:

[quote=romarcio]Você viu que se executar apenas:

ImageIcon imagem = new ImageIcon(new URL("http://processual.trf1.jus.br/consultaProcessual/gen_captcha_image.php"));

JOptionPane.showMessageDialog(null, "", "Captcha", 0, imagem);

A imagem aparece com as letras? Agora, precisaria ter um n° de processo para testar se o código exibido vai ser validado.[/quote]

Esse texto explica uma coisinha ou outra somo o parse de HTML é feito: http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/

Olá ViniGodoy, tudo bem?

O parser html eu faço tranquilo com Jsoup. O problema é a particularidade do CAPTCHA. A imagem gerada tem um id e um sid que devem ser informados paga a página get_captcha_image.php, mas há algo mais que não consigo decifrar.

A imagem é algo assim:

[img id="image_captcha" width="200px" height="50px" src="/consultaProcessual/gen_captcha_image.php?sid=221304863683cd2059e814822156ef22&id=8521ed07bed7138998d5f9423e55d413" title="Código de seguran¸a" alt="Código de segurança "]

Com um campo oculto que corresponde ao id e que deve ser enviado no POST do formulário para validar os caracteres digitados:

&lt;input id="trf1_captcha_id" type="hidden" value="8521ed07bed7138998d5f9423e55d413" name="trf1_captcha_id"&gt;

Eu capturo o SRC da imagem e coloco o caminho absoluto no meu campo para exibir a imagem, algo assim:
http://processual.trf1.jus.br/consultaProcessual/gen_captcha_image.php?sid=221304863683cd2059e814822156ef22&id=8521ed07bed7138998d5f9423e55d413

Mas mesmo assim a imagem vem sem os caracteres, somente o fundo.

Alguma idéia?

[quote=benignoms]Sim, se você chamar esse arquivo direto ele mostra com as letrar, entretanto, não serve como validação para o CAPTCHA pois é uma imagem aleatória, sem vínculo com a página de busca. :frowning:

[quote=romarcio]Você viu que se executar apenas:

ImageIcon imagem = new ImageIcon(new URL("http://processual.trf1.jus.br/consultaProcessual/gen_captcha_image.php"));

JOptionPane.showMessageDialog(null, "", "Captcha", 0, imagem);

A imagem aparece com as letras? Agora, precisaria ter um n° de processo para testar se o código exibido vai ser validado.[/quote][/quote]

A bom, era isso que eu tinha dúvidas.

E ai galera? Ninguem mais se habilita?

Bom, o problema não é mesmo no Parser, já que o trabalho dele (pegar a URL da imagem) está sendo feito, e o mesmo comportamento acontece quando se abre em um browser sem sessão aberta.
Essa imagem é gerada dinamicamente (a url é um .php), e em determinadas condições retorna a imagem inteira e em outras condições não. O motivo real disso está na implementação do image.php, que não temos como saber. O que está ao nosso alcance é apenas tentar deduzir.

Imagino que os dados do captcha são gerados na sua primeira requisição (página inicial) e ficam guardados na Sessão, sob um determinado ID. A url de geração da imagem (image.php) monta a figura de acordo com essa informação guardada na sessão, que também é usada na validação do submit.

Isso teria duas consequências, que atrapalham um pouco o que você está tentando fazer:

  • O ID não é um identificador global da imagem, como parece à primeira vista. Se fosse, alguém poderia ir reunindo informações para criar uma tabela que mapeia os IDs para texto, e a partir daí essa pessoa poderia montar um robô que acessa a página direto. Provavelmente o ID é um identificador que tem valor apenas na sessão corrente.
  • O processo acessar a página inicial, receber a imagem e submeter a tentativa deve acontecer dentro de uma mesma sessão.

A solução seria manter uma sessão aberta com o http:processual.trf1.jus.br, e fazer as requisições seguintes usando essa sessão. Isso significa basicamente guardar o cookie do SessionID e envia-lo de volta nas outras chamadas.

Como aplicar isso não me vem à cabeça de imediato, depende também do que se pretende fazer exatamente.

E certifique-se que esse acesso não está desrespeitando nenhuma condição de uso estabelecida pelo órgão responsável pelo Site, pode até dar cana! :slight_smile:

Legal sua idéia, acho que é exatamente isso, inclusive já tentei :-o . Capturei a sessão injetei ela na próxima conexão, mas mesmo assim a imagem vem sem os caracteres. Realmente estou enrolado com isso. Não tenho mais idéias. Pior, que já vi sistemas conseguindo capturar… :x

Quem puder ajudar, eu agradeço!

Acho que este processo não desrespeite nenhuma norma. Vários sistemas jurídicos fazem isso. E a intenção do teste de turing, ou captcha, é verificar se é um humano ou uma máquina. Como estou querendo exibir a imagem para o usuário digitar os caracteres, o teste esta sendo preservado.

[quote=gomesrod]Bom, o problema não é mesmo no Parser, já que o trabalho dele (pegar a URL da imagem) está sendo feito, e o mesmo comportamento acontece quando se abre em um browser sem sessão aberta.
Essa imagem é gerada dinamicamente (a url é um .php), e em determinadas condições retorna a imagem inteira e em outras condições não. O motivo real disso está na implementação do image.php, que não temos como saber. O que está ao nosso alcance é apenas tentar deduzir.

Imagino que os dados do captcha são gerados na sua primeira requisição (página inicial) e ficam guardados na Sessão, sob um determinado ID. A url de geração da imagem (image.php) monta a figura de acordo com essa informação guardada na sessão, que também é usada na validação do submit.

Isso teria duas consequências, que atrapalham um pouco o que você está tentando fazer:

  • O ID não é um identificador global da imagem, como parece à primeira vista. Se fosse, alguém poderia ir reunindo informações para criar uma tabela que mapeia os IDs para texto, e a partir daí essa pessoa poderia montar um robô que acessa a página direto. Provavelmente o ID é um identificador que tem valor apenas na sessão corrente.
  • O processo acessar a página inicial, receber a imagem e submeter a tentativa deve acontecer dentro de uma mesma sessão.

A solução seria manter uma sessão aberta com o http:processual.trf1.jus.br, e fazer as requisições seguintes usando essa sessão. Isso significa basicamente guardar o cookie do SessionID e envia-lo de volta nas outras chamadas.

Como aplicar isso não me vem à cabeça de imediato, depende também do que se pretende fazer exatamente.

E certifique-se que esse acesso não está desrespeitando nenhuma condição de uso estabelecida pelo órgão responsável pelo Site, pode até dar cana! :slight_smile: [/quote]

Para manter a sessão precisa fazer o download da imagem via programa, no browser (tag img) não tem como injetar a sessão de outro site. É assim que está tentando?

Para saber se realmente está mantendo a sessão, veja se na segunda conexão o browser responde com Set-Cookie PHPSESSID. Se mandar o ID é porque tem algo errado, essa segunda requisição não mandou corretamente o ID e o servidor iniciou uma nova sessão (não sei como funciona a manipulação de cookies nessa API que vc está usando para fazer as requisições, então não dá para ajudar com código de exemplo, mas com umas fuçadas vc consegue aplicar a idéia…)

Grande GOMESROD. Baseado no que você falou, apesar de ja ter tentado algo semelhante, raciocinei mais um pouco e consegui de uma forma um pouco diferente. Se alguém quiser ajuda com este processo basta pedir aqui. Muito obrigado, seu texto abriu minha mente.

Ah! Um link interessante que achei foi esse:
http://www.hccp.org/java-net-cookie-how-to.html#setting_values

Para manter a sessão precisa fazer o download da imagem via programa, no browser (tag img) não tem como injetar a sessão de outro site. É assim que está tentando?

Para saber se realmente está mantendo a sessão, veja se na segunda conexão o browser responde com Set-Cookie PHPSESSID. Se mandar o ID é porque tem algo errado, essa segunda requisição não mandou corretamente o ID e o servidor iniciou uma nova sessão (não sei como funciona a manipulação de cookies nessa API que vc está usando para fazer as requisições, então não dá para ajudar com código de exemplo, mas com umas fuçadas vc consegue aplicar a idéia…)
[/quote]