Ir para o conteúdo

 Voltar a PW3270 Desen...
Tela cheia

Mudando um aplicativo do tipo "screen scraping" para um de acesso direto

12 de Fevereiro de 2010, 15:25 , por Desconhecido - | 2 Pessoas seguindo este artigo.
Visualizado 1329 vezes

Olá.

Trabalho aqui no BB (sou estagiário), e desenvolvo, em Java, aplicativos que fazem screen scraping no terminal da IBM (eNetwork Personal Communications). Só que não acho que essa seja a melhor forma de obter os dados solicitados.

Gostaria de saber como posso fazer para obter esses dados diretamente, sem a necessidade de realizar uma cópia dos dados apresentados na tela.

Sei que o desenvolvimento do pw3270 é em C, porém alguns nomes de bibliotecas ou API's auxiliem-me nas minhas pesquisas.

Tenha uma boa tarde.

Desde já agradeço.

Autor: Renato Marques Oliveira


2222 comentários

  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
    12 de Fevereiro de 2010, 15:48

     

    Também trabalho no BB, mas não uso Java. (-:

    Se você não precisa de uma tela do terminal 3270 visível, ou seja, se o usuário não precisa navegar pelo SisBB até chegar ao ponto que você preica é possível criar um módulo JNI que faça a interface do Java direto com a lib3270.(dll/so); nesse caso sua aplicação ia acessar direto o buffer de tela do 3270 e o terminal nem sequer seria visível para o usuário. Fiz isso na extensão 3270 para o OpenOffice.

     

    Ainda seria "screen scraping" só que o processo ficaria totalmente escondido para o usuário.

     

    • 92e21c65a4403072c02e9ad5d29e4d3d?only path=false&size=50&d=404Renato Marques Oliveira(usuário não autenticado)
      12 de Fevereiro de 2010, 17:03

       

      Então eu continuaria fazendo uso do método SendKeys(texto, linha, coluna) para enviar comandos ao terminal?

      É que eu tive bastantes problemas com sincronização em meus "robôs": por vezes eu enviava um comando e, devido ao pequeno delay que por ventura acontece (seja pelo tráfego da rede, seja pelo tempo de processamento da requisição ou outro motivo qualquer), erros ocorriam, pois o robô continuava sua execução.

      A solução que fiz foi (a cada requisição):

      1 - copiar a tela (tela1);

      2 - executar o comando desejado;

      3 - copiar a tela novamente (tela2);

      4 - Se a tela1 == tela2 então a tela requisitada ainda não foi recebida, portanto:

      4.1 - espere 100 milissegundos

      4.2 - retorne ao passo 3;

      5 - faça isso enquanto as telas não forem diferentes ou enquanto o somatório dos tempos de espera forem menores que 10000 (10 segundos).

      Mas esta solução, ao meu ver é bastante imbecil (perdão pelo termo), pois podem haver telas idênticas e isso faria com que o programa achasse que a tela ainda não foi carregada. Acredito que deve haver alguma forma de saber quando uma solicitação foi atendida e está pronta para ser utilizada, porém não a conheço.

      Minha esperança é que houvesse uma forma de fazer uma espécie de SELECT, onde seriam requisitados os dados e eles fossem retornados, sem a necessidade de "avançar" a tela para pegar a próxima leva.

      Desculpe pelas grandes explicações. É que, até agora, você foi a única pessoa que pude perguntar: não tenho um supervisor da minha área. :-)

      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
        14 de Fevereiro de 2010, 10:24

         

        Olá,

        Tive problemas semelhantes com meus robôs tanto que nas APIs Rexx e OpenOffice eu implementei chamadas na lib3270 para ajudar na sincronização, por exemplo, usando uma jni o seu exemplo poderia ficar algo do tipo...

        string = obj.getScreenContentAt(linha,coluna,tamanho);

        obj.setStringAt(linha,coluna,string);

        obj.sendEnter();

        while(!obj.isReady())

        {

            obj.processEvents();

        }

        O truque está no isReady() que indica se o terminal já processou o comando anterior e está novamente pronto para leitura; cheguei a implementar também um contador de telas recebidas para sincronizar melhor mas acabei não usando.

        Quanto ao "select" ou coisa no estilo não seria tão fácil já que o protocolo tn3270 é feito para ser usado como um terminal.

        Você tem notes? Se quiser posso te passar um script rexx que usa isso; com tempo é possível implementar uma jni que faça essas chamadas.

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          11 de Maio de 2010, 9:33

           

          Olá,

          Só para informar: Implementei um plugin e um módulo jni que podem conversar com o terminal diretamente; falta só testar para confirmar se funciona legal.

          • 7a8a50fb3b3340102af268938f15ab8a?only path=false&size=50&d=404Itamar Borges de Souza(usuário não autenticado)
            10 de Junho de 2010, 9:42

             

            Werneck, essa discussão e as experiências de vocês nesse tópico  me interessam muito, porque também gostaria de usar Java para copiar e processar campos das telas do SERPRO de modo transparente ao usuário. Tem como você me enviar documentação sobre essa JNI e a lib3270?

            Desenvolvi um aplicativo Java dedicado em teste que já processa satisfatoriamente as cópias de tela do SERPRO ( só que tenho de abrir o emulador e sair copiando e colando: é meio lambança mas poupa muito tempo no final). Falta só saber como instanciar um objeto correspondente ao pw3270 e seus métodos.

            Agradeço,

            Trabalho no MPF, em Goiás, e comecei a usar o pw3270 em substituição ao QWS3270 

             

            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
              10 de Junho de 2010, 22:11

               

              Olá,

              Eu cheguei a implementar uma jni e algumas tags que permitem incluir uma classe java direto como um elemento de menu no pw3270 mas por falta de tempo ou de outra pessoa para testar acabei deixando um pouco de lado. Se você quiser ajudar com os testes posso retomar/acelerar o trabalho com o plugin java.

               Já tem um pequeno exemplo de como colocar uma classe direto que lê dados da tela direto no menu em www.​soft​ware​publ​ico.​gov.​br/d​otlr​n/cl​ubs/​pw32​70/x​owik​i/ja​va

              A classe ainda é bem simples, você precisa apenas dar um import pw3270.* e criar um objeto terminal, ou seja: 

              import pw3270.*;

              (...)
              terminal h = new terminal();
              (...)

              A classe hoje implementa os seguintes métodos (estou aberto a sugestões):

              public native String getVersion(); - Obtem a versão do pw3270 que está sendo usado.
              public native String getRevision(); - Obtem a revisão do pw3270 que está sendo usado.

              public native int Connect( String hostinfo, int timeout ); - Conecta ao host informato.

              public native int Disconnect(); - Desconecta do host atual.

              public native int getConnectionState(); - Retorna o estado da conexão.

              public native boolean isConnected(); - Verifica se está conectado.

              public native boolean isTerminalReady(); - Verifica se o terminal está pronto para receber comandos.

              public native String getEncoding(); - Retorna o padrão de caracteres do terminal (ISO-8859-1).

              public native String getScreenContentAt(int row, int col, int size); - Copia a string na linha,coluna e tamanho informados.

              public native String getScreenContent(); - Copia o conteúdo do terminal.

              public native boolean queryStringAt(int row, int col, String key); - Verifica se a string está na linha/coluna informada.

              public native int sendEnterKey(); - Envia um "ENTER".

              public native int setStringAt(int row, int col, String str); - "digita" a string na linha e coluna informadas.

              public native int sendPFKey(int key); - Envia uma "PF".

              public native int wait(int seconds); - Aguarda "x" segundos mantendo o loop de processamento ativo.

              public native int waitForTerminalReady(int timeout); - Aguarda até que o terminal esteja disponível.

              public native int waitForStringAt(int row, int col, String key, int timeout); - Aguarda até que a string apareça na linha/coluna informadas.

               

               

              • 8d0f9bc37d874dd12a25723235a90972?only path=false&size=50&d=404Marcelo Landim(usuário não autenticado)
                25 de Abril de 2013, 13:09

                 

                Olá,

                 Sei que o tópico é relativamente antigo. Mas, gostaria de aproveitar a menção do assunto para tirar algumas dúvidas. Trabalho na CAIXA e, a exemplo do que foi informado por outros colegas bancários, também desenvolvemos alguns "bots" para "screen scraping" usando VBA (Access). 

                Estou tentando migrar tais sistemas para java.  Bem, tudo parece estar configurado corretamente. Consigo criar um novo objeto com sucesso e, até mesmo retorno algumas informações usando os métodos: getVersion() e getRevision(). Retornam 4.2 e 1429 respectivamente.

                O problema parece estar quando tento usar o método Connect(). Pelo que percebi, ele aceita apenas um parâmetro (String host). Acredito que, no meu caso, seja necessário setar a porta e SSL para conectar com sucesso. Há alguma maneira de fazer isso?

                Obrigado, desde já.

                Parabéns pelo excelente trabalho.

                Marcelo Landim 

                • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                  25 de Abril de 2013, 14:08

                   

                  Olá,

                  Se a conexão for SSL a string deve estar no formato "L:hostname:porta", se não foi ssl apenas retire o "L:" do início. Repare que é a mesma string que aparece no título da janela quando você está conectado ao host.

                  Quanto ao screen scrapping a versão 5 já possui suporte HLLAPI bem compatível com scripts antigos feitos em VBA (existe um tópico nesse fórum sobre isso). Na versão linux também já está funcional um pacote para integrar o pw3270 como um objeto acessível pelo starbasic (LibreOffice).

                   

                  • 8d0f9bc37d874dd12a25723235a90972?only path=false&size=50&d=404Marcelo Landim(usuário não autenticado)
                    26 de Abril de 2013, 9:33

                     

                    Bom dia, Perry.

                    Inicialmente, obrigado pela atenção. Fiquei realmente impressionado com  uma resposta rápida, principalmente por se tratar de um tópico "antigo".

                    Também quero agradecer pela solução. Apliquei a sua orientação e tudo funcionou perfeitamente. Já consigo retornar as primeiras telas.

                    Quanto ao suporte a HLLAPI na versão 5. Eu já tinha lido sobre isso aqui mesmo no fórum. A questão é que estou mesmo querendo migrar para Java. No meu setor, temos também a necessidade de capturar informações da intranet e, com Java, tudo ficou muito mais estável.

                    Mais uma vez, obrigado. Parabéns pelo excelente trabalho.

                    Marcelo Landim 

                     

                    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                      26 de Abril de 2013, 11:42

                       

                      Olá,

                      Nesse caso é melhor ficar na versão 4 mesmo; a atualização do módulo  java na versão 5 ainda deve demorar um tempo.

                       

                      • Fd3cf75314bd4b84b3ad5041c7a10b40?only path=false&size=50&d=404Cleverson Kramek(usuário não autenticado)
                        27 de Março de 2014, 16:00

                         

                        Boa tarde, estou precisando fazer um robô para pegar alguns dados periodicamente de um terminal. A empresa usa o pw3270 4.0 (Rev. 1190). Me passaram como pegar os dados, é simples tem que entrar, usuário e senha, 3 ou 4 comandos e pronto... os dados que preciso estarão lá! O problema é como eu chegar à esses dados automaticamente... depois com os dados "na mão", o resto eu me viro para jogá-los onde eles devem estar!

                        Pelo que vi esse pw3270.jar me ajudará, ou melhor, fará quase todo o trabalho de coletar os dados!!! Ou estou errado? Onde baixo ela para testar? Estou a procura por aqui mas não achei... primeira vez no software publico!!!

                        Obrigado,

                        Cleverson Kramek 

              • 7a8a50fb3b3340102af268938f15ab8a?only path=false&size=50&d=404Itamar Borges de Souza(usuário não autenticado)
                14 de Junho de 2010, 19:53

                 

                Vou ter de meter a cara no Rexx por uns dias !

              • 7a8a50fb3b3340102af268938f15ab8a?only path=false&size=50&d=404Itamar Borges de Souza(usuário não autenticado)
                14 de Junho de 2010, 19:14

                 

                Olá, Perry!

                 

                Obrigado pela atenção, valeu ! Vou começar seguir por esse caminho ( instanciar um objeto a partir da importação do pacote pw3270 para trabalhar com o terminal ). Vamos ver o que consigo retornar . Dou notícias !

                 

                Valeu!

                 

                 

                 

                 

                 

  • B8e12c87422d2aad529de576fab523df?only path=false&size=50&d=404Bruno Boaventura(usuário não autenticado)
    4 de Janeiro de 2012, 23:27

     

    Perry, estou interessado em escrever uma camada em Python para a lib3270. Você tem como conseguir algo de documentação (ou mesmo uma visão geral do código) da biblioteca?

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      10 de Fevereiro de 2012, 8:34

       

      Legal! Coincidiu que nos últimos dias ando reformulando toda a biblioteca para padronizar as chamadas e colocando a documentação no próprio fonte em formato doxygen. Você poderia dar uma olhada no fonte em ( http://svn.softwarepublico.gov.br/trac/pw3270/browser/trunk/latest/src/include/lib3270.h ) e opinar sobre como está ficando?

      Para a versão 5 também estou planejando converter toda a parte de terminal em um widget padrão gtk; isso deve facilitar a implementação de uma GUI em python também não?

       

      • E3a0327e1f1e0c10b25a0004b3a070c0?only path=false&size=50&d=404Fábio Lima(usuário não autenticado)
        12 de Fevereiro de 2012, 3:31

         

        Estava estudando uma maneira de conectar o php com a lib3270 usando o SWIG pra gerar um módulo que acesse a bibilioteca.

        Olhei esse código ai instalado em /usr/include/lib3270.h. Desse jeito ai parece bem mais organizado. Legal que tem uma descrição da função em um formato parecido com o javadoc. Adorei.

        Esse é um projeto que estou buscando um tempinho pra pegar.

        A propósito, o código menciona um pessoal do bb. Olhei lá o Kraucer, com quem tomei contato com a matriz ubuntu. Você é do bb também? Se for, como faço pra te localizar lá?

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          13 de Fevereiro de 2012, 7:39

           

          Olá,

          Não conhecia esse swig; aplicativo interessante. Já tinha fuçado um pouco sobre criação de plugins para phyton e PHP usando a API direto mas não cheguei a evoluir muito por pura falta de tempo.

          Trabalho no BB (sede IV): c1103788 - Mezanino da cooperativa.

           

    • E3a0327e1f1e0c10b25a0004b3a070c0?only path=false&size=50&d=404Fábio Lima(usuário não autenticado)
      9 de Fevereiro de 2012, 23:52

       

      Opa, e eu tô de olho em montar uma biblioteca usando php5....

  • 5cc9a32f2d11cf94b9593c530af4bae2?only path=false&size=50&d=404Éder Almeida Costa(usuário não autenticado)
    6 de Maio de 2013, 8:55

     

    Olá Perry, bom dia.

    Aproveitando que este post já foi ressuscitado...

    Trabalho aqui na Embasa e estamos fazendo um aplicativo de testes bem simples, utilizando o pw3270.jar. 

    Estamos com com tudo pronto e funcionando, salvo o seguinte detalhe: o script só passa da linha "host.waitForTerminalReady(5);" se o mouse for acionado ou alguma tecla for pressionada.

    Já viu isto acontecer antes? 

    SO: Windows 7 64 bits. PW 4.2 1429.

    Grato pela atenção. 

     

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      7 de Maio de 2013, 9:53

       

      Olá,

      Sim, já ví. Por algum motivo a fila de mensagems do windows parou de girar. Na versão  5 eu contornei o problema ativando um "timer" enquanto espera por uma resposta do terminal. Você está tentando rodar o aplicativo de dentro do emulador ou em modo stand-alone?

       

      • 5cc9a32f2d11cf94b9593c530af4bae2?only path=false&size=50&d=404Éder Almeida Costa(usuário não autenticado)
        14 de Outubro de 2013, 11:53

         

        Olá, Perry,

        Não recebi e-mail  de notificação de interação no post e esqueci totalmente que tinha perguntado.

        Estávamos tentando rodar dentro do emulador. Só funcionava mexendo o mouse mesmo. 

        Desta forma, optamos por fazer através do stand-alone. 

        Remontamos a tela do terminal num campo de texto  readonly e está funcionando tranquilamente.

        De qualquer forma, muito obrigado! 

         

         

         

         

Essa comunidade não possui posts nesse blog