Página 4 de 5

leitura de página da internet via Harbour

Enviado: 21 Jul 2021 19:54
por Daniel
Ola tente assim

Código: Selecionar todos

  
   nIni  := At('" window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
   cHtml1:= SubStr( cHtml, nIni)

   nIni  := At('" data-reactid="30"><span',  cHtml1)  // coloque mais esta duas linhas
   cHtml1:= SubStr( cHtml1, nIni)

   nIni  := At('D(ib)" data-reactid="31">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('</span>', cHtml) - 1
   cValor:= SubStr(cHtml1, nIni, nFim)

   nIni  := At('" data-reactid="32">',  cHtml) + 20
   cHtml1:= SubStr( cHtml, nIni)
   nFim  := At('</span>', cHtml1) - 1
   cIndice:= SubStr(cHtml, nIni, nFim)

leitura de página da internet via Harbour

Enviado: 21 Jul 2021 22:06
por cjp
Não funcionou não. cValor está vazio.

leitura de página da internet via Harbour

Enviado: 22 Jul 2021 18:39
por Daniel
Aqui esta funcionando

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 00:45
por cjp
É estranho, mas aqui não funciona.

Estou fazendo assim:

Código: Selecionar todos

function lendocot(cod,or)
         local link :="https://finance.yahoo.com/quote/"+cod+".SA/"

        oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
	      oServer:Open( "GET", link, .f. )
	      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
	      oServer:SetRequestHeader( "Connection", "keep-alive" )
	      oServer:Send()
	      oServer:WaitForResponse( 200000 )

	   cHtml:= oServer:ResponseBody


  
   nIni  := At(' window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
   cHtml1:= SubStr( cHtml, nIni)

   
   nIni  := At(' data-reactid="30">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('', cHtml) - 1
   cValor:= SubStr(cHtml1, nIni, nFim)
   

   nIni  := At(' data-reactid="32">',  cHtml) + 20
   cHtml1:= SubStr( cHtml, nIni)
   
   nFim  := At('', cHtml1) - 1
   cIndice:= SubStr(cHtml, nIni, nFim)
Pelos testes que fiz, o problema estaria neste trecho:

Código: Selecionar todos

    nIni  := At('" data-reactid="30">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('', cHtml) - 1
   cValor:= SubStr(cHtml1, nIni, nFim)
Veja no anexo o que está retornando o teste que fiz. Não achei o valor neste trecho, embora exista o data-reactid="30".

Pode me ajudar? Estou fazendo algo errado?

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 00:59
por Itamar M. Lins Jr.
Olá!
Copia o código do Daniel e cola no seu.
Rapidamente eu já vi 2 ou 3 difereças.

Saudações,
Itamar M. Lins Jr.

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 10:56
por cjp
A diferença que vc menciona é com relação às aspas, correto?
Eu tirei porque acho que está errado.
Veja, por exemplo:

nIni := At('" window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);', cHtml)

Tem uma aspa dupla sobrando aí.

Eu testei primeiro da forma como ele colocou, e não achou essa expressão. Quando tirei a aspa dupla, ele achou.

Se não for disso que vc está falando, por favor, me indique especificamente. Obrigado.

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 11:01
por Itamar M. Lins Jr.
Olá!
O ultimo nFim do Daniel está como ?
Coloca ele debaixo do seu ultimo nFim... Estão iguais ?

Saudações,
Itamar M. Lins Jr.

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 13:22
por cjp
codigo.png
Realmente não.
Vi agora que tem um problema aqui no fórum. Clicando em ver código, o código não aparece como está aqui. Veja a imagem anexa.
Copiei o código agora diretamente daqui, mas ainda não deu certo.
Agora, estranhamente, o cHtml inicial está bem diferente:

Código: Selecionar todos

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <title>Yahoo</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimal-ui">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <style>
      html {
          height: 100%;
      }
      body {
          background: #fafafc url(https://s.yimg.com/nn/img/sad-panda-201402200631.png) 50% 50%;
          background-size: cover;
          height: 100%;
          text-align: center;
          font: 300 18px "helvetica neue", helvetica, verdana, tahoma, arial, sans-serif;
          margin: 0;
      }
      table {
          height: 100%;
          width: 100%;
          table-layout: fixed;
          border-collapse: collapse;
          border-spacing: 0;
          border: none;
      }
      h1 {
          font-size: 42px;
          font-weight: 400;
          color: #400090;
      }
      p {
          color: #1A1A1A;
      }
      #message-1 {
          font-weight: bold;
          margin: 0;
      }
      #message-2 {
          display: inline-block;
          *display: inline;
          zoom: 1;
          max-width: 17em;
          _width: 17em;
      }
      </style>
      <script>
      
      </script>
  </head>
  <body>
  <!-- status code : 502 -->
  <!-- Could Not Connect -->
  <!-- host machine: e15.ycpi.bra.yahoo.com -->
  <!-- timestamp: 1627056994.541 -->
  <!-- url: https://finance.yahoo.com/quote/PETR3%20%20.SA/-->
  <script type="text/javascript">
    function buildUrl(url, parameters){
      var qs = [];
      for(var key in parameters) {
        var value = parameters[key];
        qs.push(encodeURIComponent(key) + "=" + encodeURIComponent(value));
      }
      url = url + "?" + qs.join('&');
      return url;
    }

    function generateBRBMarkup(site) {
      params.source = 'brb';
      generateBeaconMarkup(params);
      var englishHeader = 'Will be right back...';
      var englishMessage1 = 'Thank you for your patience.';
      var englishMessage2 = 'Our engineers are working quickly to resolve the issue.';
      var defaultLogoStyle = '';
      var siteDataMap = {
        'default': {
          logo: 'https://s.yimg.com/rz/p/yahoo_frontpage_en-US_s_f_p_205x58_frontpage.png',
          logoAlt: 'Yahoo Logo',
          logoStyle: defaultLogoStyle,
          header: englishHeader,
          message1: englishMessage1,
          message2: englishMessage2
        }
      };

      var siteDetails = siteDataMap['default'];

      document.write('<table><tbody><tr><td>');
      document.write('<div id="content">');
      document.write('<img src="' + siteDetails['logo'] + '" alt="' + siteDetails['logoAlt'] + '" style="' + siteDetails['logoStyle'] + '">');
      document.write('<h1 style="margin-top:20px;">' + siteDetails['header'] + '</h1>');
      document.write('<p id="message-1">' + siteDetails['message1'] + '</p>');
      document.write('<p id="message-2">' + siteDetails['message2'] + '</p>');
      document.write('</div>');
      document.write('</td></tr></tbody></table>');
    }

    function generateBeaconMarkup(params) {
        document.write('<img src="' + buildUrl('//geo.yahoo.com/b', params) + '" style="display:none;" width="0px" height="0px"/>');
        var beacon = new Image();
        beacon.src = buildUrl('//bcn.fp.yahoo.com/p', params);
    }

    var hostname = window.location.hostname;
    var device = 'desktop';
    var ynet = ('-' === '1');
    var time = new Date().getTime();
    var params = {
        s: '1197757129',
        t: time,
        err_url: document.URL,
        err: '502',
        test: '-',
        ats_host: 'e15.ycpi.bra.yahoo.com',
        rid: '-',
        message: 'Could Not Connect'
    };

    if(ynet) {
        document.write('<div style="height: 5px; background-color: red;"></div>');
    }
    generateBRBMarkup(hostname, params);

  </script>
  <noscript>
  <table>
    <tbody>
      <tr>
        <td>
          <div id="englishContent">
            <h1 style="margin-top:20px;">Will be right back...</h1>
            <p id="message-1">Thank you for your patience.</p>
            <p id="message-2">Our engineers are working quickly to resolve the issue.</p>
          </div>
        </td>
      </tr>
    </tbody>
  </table>
  </noscript>
  </body>
</html>

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 18:26
por Daniel
faz o teste com o prg que estou usando

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 23:06
por cjp
Pois é, veja que estranho: com o teu prg, funcionou perfeitamente.

Mas, quando coloquei no meu sistema, não funcionou.

Veja que fiz pouquíssimas alterações, apenas para ajudar o que preciso (passar o código em cada caso):

Código: Selecionar todos

Function lendocot(cod,or)
   Cls
   @ 12, 40 Say 'Aguarde'
      oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
	   oServer:Open( "GET", 'https://finance.yahoo.com/quote/'+cod+'.SA/', .f. )
	   oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
	   oServer:SetRequestHeader( "Connection", "keep-alive" )
	   oServer:Send()
	   oServer:WaitForResponse( 100000 )
	cHtml:= oServer:ResponseBody
   @ 12, 40 Say '                '
//   MemoWrit('siteA.txt', cHtml)
   nIni  := At(' window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
   cHtml1:= SubStr( cHtml, nIni)

   nIni  := At(' data-reactid="30"><span',  cHtml1)
   cHtml1:= SubStr( cHtml1, nIni)

   nIni  := At('D(ib) data-reactid="31">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('</span>', cHtml) - 1
   cValor:= SubStr(cHtml1, nIni, nFim)

	   @ 14,5 say "Valor: "+substr(cValor,1,10)+"                       "
	   inkey(1.5)
Tirei a aspa que estava sobrando para testar, mas antes já tinha testado do jeito que estava, com as aspas, e também não funcionou no meu sistema (embora tenha funcionado no teu).

Estou juntado uma imagem dos resultados do nIni em cada caso. O XX depois do código eu coloquei apenas para verificar se não teria algo um espaço indevido depois do código.

Não consigo enxergar o que estou fazendo errado. Pode me ajudar?

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 23:17
por Daniel
Você não pode tirar as aspas pois elas fazem parte do texto de procurar, se você olhar no arquivo de retorno tem as aspas

leitura de página da internet via Harbour

Enviado: 23 Jul 2021 23:56
por cjp
Recoloquei as aspas de novo e novamente não funcionou.

Mas acho que não é caso mesmo de colocar as aspas: o arquivo .txt está sem.

Veja:
if (!window.YAHOO || !window.YAHOO.i13n || !window.YAHOO.i13n.Rapid) { return; }
var rapidConfig = {"async_all_clicks":true,"click_timeout":300,"client_only":1,"compr_type":"deflate","keys":{"ver":"ydotcom","navtype":"server","pt":"utility","pct":"qsp","pstcat":"equities","pg_name":"summary","rvt":"PRSV11.SA","ticker":"PRSV11.SA","mrkt":"us","site":"finance","lang":"en-US","colo":"bf1","_yrid":"9488q5hgfn02u","_rid":"9488q5hgfn02u","abk":""},"pageview_on_init":true,"query_parameters":true,"test_id":"xray-finance-saliencemerge-test-3,JARVISTESTFINANCE0721-02,fd-enh-plutus-3,finance-us-web-xray-upsell-1,xray-us-finance-relatedq-test-2","tracked_mods_viewability":[],"track_right_click":true,"viewability":true,"dwell_on":true,"perf_navigationtime":2,"perf_resourcetime":1,"webworker_file":"/__rapidworker-1.2.js","spaceid":95993639};
window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);
})();</script></head><body><div id="app"><div class="" data-reactroot="" data-reactid="1" data-react-checksum="585159451"><div data-reactid="2"><div

leitura de página da internet via Harbour

Enviado: 24 Jul 2021 04:10
por JoséQuintas
Abre o html num editor de texto.
Manda procurar o texto que está colocando entre aspas.
Veja aonde vai parar.
O resultado no Harbour vai ser o mesmo do editor de texto.

Eu costumo usar [] ao invés de aspas, pra não confundir.

Código: Selecionar todos

cTexto := [tag "minhoca"]
nPos := At( cTexto, cHtml )

leitura de página da internet via Harbour

Enviado: 24 Jul 2021 10:00
por cjp
Então, é isso que estou fazendo. Veja na minha última postagem parte do .txt, onde achei a primeira parte, mas a parte da cotação propriamente não acha.

leitura de página da internet via Harbour

Enviado: 24 Jul 2021 10:48
por ANDRIL
Testei o prg postado pelo Daniel e esta correto. O seu código não funcionou, então o problema está na sua codificação.
Creio que esteja errando na extração dos dados, primeiro veja que esta procurando a string

Código: Selecionar todos

 nIni  := At(' data-reactid="30">',  cHtml1) + 25
Há diversas strings destas no retorno, então verifique se está selecionando a correta. Aparentemente está pegando a primeira, o resultado que deseja pode estar em outra.

Código: Selecionar todos

   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('', cHtml) - 1
Aqui está procurando NADA '' no código, então não deve achar nada retornando -1 fazendo com que a string retorne vazia.

Até+