Ir para conteúdo

POWERED BY:

biakelly

[Resolvido] Somar dados recuperados de uma API

Recommended Posts

Oi, tenho uma dúvida para avançar em uma API.

Preciso somar os valores de todos os endereços exibidos nela. No total deste exemplo tenho 2,484 endereços. A API me deixa exibir no máximo 200 por página

 

Como exibir total de valores considerando todos endereços

 

<?php
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.trongrid.io/v1/contracts/TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq/tokens?only_confirmed=true&only_unconfirmed=true&order_by=balance,desc&limit=200",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly, tudo bem?

 

Na documentação da TRON Grid diz o seguinte:

The same time window can get up to XXX pieces of data. If you need to get more data, you can move the time window to get more data.

Traduzindo:

A mesma janela de tempo pode ter até X dados. Se você precisa recuperar mais dados, você pode mover a janela de tempo.

 

Ou seja, você está recuperando os últimos (DESC) 200 tokens. O que você precisa é:

1 - Após recuperar os 200 iniciais, pegar a data do último e rodar uma nova consulta, recuperando os próximos 200 com a Query max_timestamp definida para esse momento.

2 - Agora você tem de 0,199 e de 200,399. Basta prosseguir o loop até não haver registros restantes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares tudo bem? Estou buscando sobre esse assunto e como posso aplicar, ainda estou pegando algumas manhas hi hi , no momento estou meio perdida, parece ser complexo mas tentando :) Ainda estou nesse code :flushed:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @biakelly.

 

Então. Apesar de eu ter uma certa familiaridade com criptomoedas, inclusive a própria TRX, pois lido com mineração e pequenos investimentos, infelizmente eu não tenho experiência com a terminologia e requisições dessa API para poder lhe ajudar.

Também desconheço o propósito do que você está construindo nesse código, mas minha intuição me diz que seu endpoint utilizado está incorreto.

 

Encontrei esse endpoint, que apresenta um resultado mais completo e que talvez possa lhe ser útil. Esse aqui, se não estou enganado, está entregando a informação Epoch / Timestamp do bloco, que poderá servir para fazer o que mencionei no meu post anterior:

https://api.trongrid.io/event/contract/TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq

 

A título de comparação, a sua requisição original era essa:

https://api.trongrid.io/v1/contracts/TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq/tokens?only_confirmed=true&amp;only_unconfirmed=true&amp;order_by=balance,desc&amp;limit=200

 

A documentação dessa API encontra-se aqui: https://developers.tron.network/docs/tron-grid-intro

 

Uma sugestão adicional que eu faria é de não utilizar CURL. Ele é muito verboso, cheio de linhas para fazer uma requisição simples.

Você poderia dar uma olhadinha nessa aqui: https://docs.guzzlephp.org/en/stable/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares Que legal que conhece TRX, ando fazendo alguns estudos dela para meus projetos.

 

Então, meu objetivo com essa API é tentar mostrar o Total Supply da moeda e o Total Supply circulante em tempo real. Infelizmente não encontrei local que eu possa pegar estas duas informações. Na documentação do Developers não tem exemplo de como posso pegar essa informação. Aliais, ja encontrei para contratos TRC10 mas neste caso preciso para TRC20

 

Sobre CURL eu acredito que você havia me alertado antes, usei por mania mesmo, mas vou passar a não utiliza-lo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá aí um assunto que ainda pretendo estudar futuramente. Ainda sou um completo ignorante em blockchain a nível de implementação e integração.

Dei uma pesquisada rápida para ver se encontrava algum material que pudesse lhe auxiliar. O que encontrei foi o seguinte:

 

1 - https://api.trongrid.io/v1/assets/TRX/list

 

2 - SDK para interagir com o protocolo Tron, em PHP, mas só encontrei coisas específicas de carteiras, blocos, transações, etc. Talvez seja interessante fazer uma issue ali perguntando sobre o Total Supply que você está buscando. https://github.com/iexbase/tron-api

 

3 - A Tronscan exibe muita informação útil mais mastigadinha. Veja: https://tronscan.org/#/ Talvez seja interessante ver essa API deles, e quem sabe perguntar a respeito da extração desses dados, no Github.

Aqui está a API dessa plataforma: https://github.com/tronscan/tronscan-frontend/blob/master/document/api.md

Talvez esse endpoint seja interessante para você:

https://apilist.tronscan.org/api/tokens/overview?start=0&amp;limit=20&amp;order=desc&amp;filter=trc20&amp;sort=volume24hInTrx&amp;order_current=descend

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares Eu comecei agora mas tem muita informação que ainda não sei também. O assunto é bastante abrangente mesmo

 

Essa lista numero 1 tem especificamente para TRC10 (incrivel como contratos dessa origem tem informacão) Agora para TRC20 não tem tão fácil

 

Neste último link que passou, cavei um pouco mais e achei esse: https://apilist.tronscan.org/api/token_trc20?contract=

 

aparentemente ele tem mais informações sobre TRC20 mas, só exibe o total emitido e não tem o total circulante. Na verdade o total circulante seria aquela api lá em cima que postei onde deve somar todos os valores de contrato, debitar o valor da carteira de origem e subtrair do total emitido. Agora meu amigo, como fazer isso esta deixando meus cabelos pela cadeira, 7 dias nesse impasse. :expressionless:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... você pode dar uma ollhadinha na API da Binance também. Pelo que vi, bem rapidamente, é bem completa e abrange diferentes moedas e protocolos.

https://binance-docs.github.io/apidocs/spot/en/#introduction

 

44 minutos atrás, biakelly disse:

Na verdade o total circulante seria aquela api lá em cima que postei onde deve somar todos os valores de contrato, debitar o valor da carteira de origem e subtrair do total emitido

Entendi.

E baseado nesse link: https://api.trongrid.io/v1/contracts/TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq/tokens?only_confirmed=true&amp;only_unconfirmed=true&amp;order_by=balance,desc&amp;limit=200

O que representa a chave e o que é o valor? Explique como se fosse para um primata alfabetizado :sweat_smile:

Exemplo: {"TLRt2GZrfxBsYWjsh7wjmZbXT3WKMoEws9":"48706920457628000000"}

 

Amanhã se eu conseguir um tempinho eu dou uma olhada com mais atenção nisso, mas precisava de mais informações, pois não entendi o retorno desse endpoint.

É uma falha dessa API não facilitarem a navegação por páginas. Eles dizem que é necessário informar o range de timestamp, mas não temos a informação do timestamp do último item desse conjunto para fazer o que eu disse anteriormente.

 

Minha suspeita é de que devemos fazer uma consulta específica no último registro do conjunto retornado (se eu descobrir exatamente qual endpoint deve ser consultado). Daí pegamos o timestamp e prosseguimos com a lógica de filtro do tempo.

 

Você saberia consultar um desses registros, como esse que colei acima, para ver os detalhes dele, como o timestamp? Pois é exatamente isso que está faltando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares

 

 Realmente a API da Binance é bem completa, porém ela só abrange projetos que estão listados lá. O projeto que quero não é listado por la por ser um token da rede Tron.

 

Sobre esse este ponto

Citar

E baseado nesse link: https://api.trongrid.io/v1/contracts/TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq/tokens?only_confirmed=true&amp;only_unconfirmed=true&amp;order_by=balance,desc&amp;limit=200

O que representa a chave e o que é o valor? Explique como se fosse para um primata alfabetizado :sweat_smile:

Exemplo: {"TLRt2GZrfxBsYWjsh7wjmZbXT3WKMoEws9":"48706920457628000000"}

 

Sim, a chave neste exemplo seria o contrato, neste caso utiliza-se o contrato do projeto, vamos usar este exemplo de contrato: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

 

achei um link para ver o contrato hoje mas sem o danado do Supply circulante, veja como ele apresenta os dados:

https://apilist.tronscan.org/api/token_trc20?contract=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

 

Citar

É uma falha dessa API não facilitarem a navegação por páginas. Eles dizem que é necessário informar o range de timestamp, mas não temos a informação do timestamp do último item desse conjunto para fazer o que eu disse anteriormente.

 

Essa é justamente minha dificuldade sabia, meio confuso pois eles entregam o mínimo possível na documentação

 

 

Citar

Você saberia consultar um desses registros, como esse que colei acima, para ver os detalhes dele, como o timestamp? Pois é exatamente isso que está faltando...

 

Estou tentando descobrir, passei o dia hoje focada nisso, cheguei mandar uma mensagem para eles semana passada, mas não obtive nenhum retorno, não sei se eles respondem

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @biakelly :D

 

Algumas APIs oferecem uma seção à parte dos resultados onde são expostas metainformações, ou seja, informações alheias aos resultados, mas relacionadas à resposta da requisição em si. Isso é comum quando trabalhamos com APIs grandes como do Twitter, Facebook, Google, etc.

 

E por que estou falando sobre isso? Bom, porque na minha afobação ao tentar interpretar os resultados eu acabei ignorando uma coisa que estava na minha cara: a resposta da requisição DIZ exatamente o link que você deve chamar para obter o próximo conjunto de registros, ou seja, a próxima página.

 

Veja essa print, que ilustra o que estou dizendo: E08SDtp.png

 

 

Bom. Agora vamos à parte divertida: Código!

 

1 - O primeiro passo é instalar o Guzzle. Ele diminuirá drasticamente a quantidade de linhas de código que precisamos programar. Isso pode ser feito via Composer (recomendadíssimo) ou apenas baixando o zip do repositório oficial:

Repositório: https://github.com/guzzle/guzzle

Zip: https://github.com/guzzle/guzzle/archive/refs/heads/master.zip

Instruções no site oficial: https://docs.guzzlephp.org/en/stable/overview.html#installation

 

2 - Se o Guzzle estiver instalado e tiver sido inicializado corretamente, primeiro definimos as configurações padrões das nossas futuras requisições:

$client = new GuzzleHttp\Client([
    'base_uri' => 'https://api.trongrid.io/v1/',// URL base para as requisições relativas
    'timeout'  => 10.0,
]);

 

3 - Como vamos repetir o processo de requisitar na API, vamos encapsular essa lógica em uma função:

// Função anônima para fazer uso do "use", que nos dá acesso ao construtor de requisição do Guzzle
$requestPage = function ( $uri ) use ( $client ) {
    $response = $client->get( $uri );// Fazemos a requisição
    $content = $response->getBody()->getContents();// Selecionamos o conteúdo da resposta
    
    // Retornamos o conteúdo em formato de objeto (sem o decode, $content seria apenas uma string)
    return json_decode( $content );
};

 

4 - Show. Agora vamos fazer uma função que será responsável pelo somatório preciso desses números gigantes que vamos lidar:

function getTokensSum( $tokens ) {
    $sum = 0;
    
    foreach ( $tokens as $token )
        $sum = bcadd( $sum, current( $token ) );// bcadd é uma soma (+), mas com maior foco na precisão
    
    return $sum;
};

 

5 - Vamos agora definir algumas variáveis iniciais:

$i = 0;// Quantidade de requisições feitas. Apenas informativo
$total = 0;// Nosso somatório começa em 0
$max_requests = 100000;// Garantia de que não vamos fazer requsições infinitas
$rest_time = 500000;// 0,5 seg (500.000 usec) de descanso entre cada requisição para respeitar a API

$first_page = 'TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq';
$uri = "contracts/{$first_page}/tokens?only_confirmed=true&only_unconfirmed=true&order_by=balance,desc&limit=200";

 

6  - Aqui vem o loop. Rodamos sequencialmente todas as requisições de acordo com o meta da próxima página e executamos a função do somatório para acumular o total, que é o nosso objetivo:

do {
    ++$i;// Incrementamos a quantidade de requisições
    
    $body = $requestPage( $uri );
    $tokens = $body->data;// aqui são os itens em forma de objetos (instâncias de \stdClass)
    $total = bcadd( $total, getTokensSum( $tokens ) );// 0 + 123123123 + 456456456...
    
    $meta = $body->meta;
    
    printf( "Página: %d. Somatório: %s\n", $i, $total );
    
    if ( isset( $meta->links->next ) )
        $uri = $meta->links->next;// Definimos a URI da próxima página
    else {
        $uri = false;// Como não vai mais haver URI (uri=false), o while vai ser encerrado em seguida...
        echo 'Encerrado :)';
    }
    
    usleep( $rest_time );
    
} while( --$max_requests >= 0 && $uri );// Pare quando não houver próx. pág. ou alcançar o limite de requisições

 

7 - ... é isso. Vamos ver a saída:

[...]
Página: 321. Somatório: 999989999998544365675
Página: 322. Somatório: 999989999998609511160
Página: 323. Somatório: 999989999998654020937
Página: 324. Somatório: 999989999998688034206
Página: 325. Somatório: 999989999998708163201
Página: 326. Somatório: 999989999998722618884
Página: 327. Somatório: 999989999998731141588
Página: 328. Somatório: 999989999998739362169
Página: 329. Somatório: 999989999998744533851
Página: 330. Somatório: 999989999998746466850
Página: 331. Somatório: 999989999998747035083
Página: 332. Somatório: 999989999998747149932
Página: 333. Somatório: 999989999998747159904
Página: 334. Somatório: 999989999998747161478
Encerrado :)

Esse é o número que você queria: 999989999998747161478.

Levou 5 minutos e 2 segundos para executar esse script aqui, mas lembre-se de que limitei uma requisição a cada 0,5 segundo. Você pode personalizar esse valor de acordo com as regras da API, mas nunca deixe zerado: https://developers.tron.network/reference#rate-limits

 

Aqui está o código completo. Qualquer dúvida é só postar :)

<?php
require_once 'vendor/autoload.php';// inicializa o Guzzle através do Composer

$client = new GuzzleHttp\Client([
    'base_uri' => 'https://api.trongrid.io/v1/',// URL base para as requisições relativas
    'timeout'  => 10.0,
]);

// Função anônima para fazer uso do "use", que nos dá acesso ao construtor de requisição do Guzzle
$requestPage = function ( $uri ) use ( $client ) {
    $response = $client->get( $uri );// Fazemos a requisição
    $content = $response->getBody()->getContents();// Selecionamos o conteúdo da resposta
    
    // Retornamos o conteúdo em formato de objeto (sem o decode, $content seria apenas uma string)
    return json_decode( $content );
};

function getTokensSum( $tokens ) {
    $sum = 0;
    
    foreach ( $tokens as $token )
        $sum = bcadd( $sum, current( $token ) );// bcadd é uma soma (+), mas com maior foco na precisão
    
    return $sum;
};

$i = 0;// Quantidade de requisições feitas. Apenas informativo
$total = 0;// Nosso somatório começa em 0
$max_requests = 100000;// Garantia de que não vamos fazer requsições infinitas
$rest_time = 500000;// 0,5 seg (500.000 usec) de descanso entre cada requisição para respeitar a API

$first_page = 'TFczxzPhnThNSqr5by8tvxsdCFRRz6cPNq';
$uri = "contracts/{$first_page}/tokens?only_confirmed=true&only_unconfirmed=true&order_by=balance,desc&limit=200";

do {
    ++$i;// Incrementamos a quantidade de requisições
    
    $body = $requestPage( $uri );
    $tokens = $body->data;// aqui são os itens em forma de objetos (instâncias de \stdClass)
    $total = bcadd( $total, getTokensSum( $tokens ) );// 0 + 123123123 + 456456456...
    
    $meta = $body->meta;
    
    printf( "Página: %d. Somatório: %s\n", $i, $total );
    
    if ( isset( $meta->links->next ) )
        $uri = $meta->links->next;// Definimos a URI da próxima página
    else {
        $uri = false;// Como não vai mais haver URI (uri=false), o while vai ser encerrado em seguida...
        echo 'Encerrado :)';
    }
    
    usleep( $rest_time );
    
} while( --$max_requests >= 0 && $uri );// Pare quando não houver próx. pág. ou alcançar o limite de requisições

// O total estará armazenado em $total. Agora é só usar :)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares   :smiley:

 

Você não sabe o quão importante esta sendo aprender com suas explicações. Em algum momento explico porque demoro um pouco para assimilar e como a programação me ajuda neste caminho.

 

Mas antes de mais nada, deixe-me agradecer muito por tanta ajuda muito muito muito obrigada mesmo, por separar seu tempo e me ajudar com tamanha gentileza. Uma pergunta você é professor? Se não for deve ser um dom explicar tão bem sabia

 

Tenho duas dúvidas:

Pela soma de todas carteiras  temos o total emitido será possível retirar da soma o saldo da carteira emissora? Ou seja a carteira que emitiu os tokens. Esse token foi emitido por esta carteira: TRX6Q82wMqWNbCCiLqejbZe43wk1h1zJHm e ela possui neste momento: 30,631.068883 creio que retirando o saldo dela, tenha-se o total supply circulante.

 

será possível salvar o resultado em um bloco de notas excluindo o saldo da carteira emissora? Explico porque: como o procedimento demora 5 minutos e é até plausível pois se requisitar constantemente posso ter um bloqueio, queria deixa-lo rodando em um cron e pegar o resultado do bloco de notas. (Essa idéia é meio maluca?)

 

Ah sim, instalei o guzzle e rodei localmente, recebi este resultado, será que fiz algo errado?:

 

Página: 1. Somatório: 266776399057638157611 Página: 2. Somatório: 447214411508646157611 Página: 3. Somatório: 627214110265891157611 Página: 4. Somatório: 806801668280161157611 Página: 5. Somatório: 986009240941621157611 Página: 6. Somatório: 997438732687086836052 Página: 7. Somatório: 997825745183029030265 Página: 8. Somatório: 998178663703425961464 Página: 9. Somatório: 998501265196564812406 Página: 10. Somatório: 998793736527787688218 Página: 11. Somatório: 999033727075743111954 Página: 12. Somatório: 999208692053902332886 Página: 13. Somatório: 999315225086628403129 Página: 14. Somatório: 999374579028274479794 Página: 15. Somatório: 999414554476855614421 Página: 16. Somatório: 999442573830287980504 Página: 17. Somatório: 999464643294805953867 Página: 18. Somatório: 999483193225277640624 Página: 19. Somatório: 999498657547145144396 Página: 20. Somatório: 999511724848417120082 Página: 21. Somatório: 999523112385196847684 Página: 22. Somatório: 999533242064117723960 Página: 23. Somatório: 999542434303620695242 Página: 24. Somatório: 999550814698714846122 Página: 25. Somatório: 999558696463093043715 Página: 26. Somatório: 999566014409407734633 Página: 27. Somatório: 999572783752742761059 Página: 28. Somatório: 999579097323939407644 Página: 29. Somatório: 999585008974293067130 Página: 30. Somatório: 999590517553942105965 Página: 31. Somatório: 999595668594415154443 Página: 32. Somatório: 999600531229627737066 Página: 33. Somatório: 999605133959281855768 Página: 34. Somatório: 999609482087127508033 Página: 35. Somatório: 999613619691898959783 Página: 36. Somatório: 999617627550012216201 Página: 37. Somatório: 999621627550012216201 Página: 38. Somatório: 999625627550012216201 Página: 39. Somatório: 999629627550012216201 Página: 40. Somatório: 999633627550012216201 Página: 41. Somatório: 999637627550012216201 Página: 42. Somatório: 999641627550012216201 Página: 43. Somatório: 999645627550012216201 Página: 44. Somatório: 999649625919988870982 Página: 45. Somatório: 999653548270948165858 Página: 46. Somatório: 999657312564169108591 Página: 47. Somatório: 999660919684946180214 Página: 48. Somatório: 999664361713512232026 Página: 49. Somatório: 999667651802571091011 Página: 50. Somatório: 999670808899800380967 Página: 51. Somatório: 999673844403038422705 Página: 52. Somatório: 999676754845225436019 Página: 53. Somatório: 999679539728407867098 Página: 54. Somatório: 999682215450158401026 Página: 55. Somatório: 999684795977009465191 Página: 56. Somatório: 999687287896462898518 Página: 57. Somatório: 999689708355421117717 Página: 58. Somatório: 999692067911739049350 Página: 59. Somatório: 999694357827853236220 Página: 60. Somatório: 999696579651047718905 Página: 61. Somatório: 999698729849856237234 Página: 62. Somatório: 999700813260791961318 Página: 63. Somatório: 999702848119519271885 Página: 64. Somatório: 999704836781553802999 Página: 65. Somatório: 999706777686662067524 Página: 66. Somatório: 999708664675606844297 Página: 67. Somatório: 999710499717405544915 Página: 68. Somatório: 999712293061940831446 Página: 69. Somatório: 999714037786640908306 Página: 70. Somatório: 999715739770933196199 Página: 71. Somatório: 999717405026042259647 Página: 72. Somatório: 999719035077784155044 Página: 73. Somatório: 999720634844888191745 Página: 74. Somatório: 999722210373159092224 Página: 75. Somatório: 999723763856012697493 Página: 76. Somatório: 999725289109663115968 Página: 77. Somatório: 999726808446679115968 Página: 78. Somatório: 999728327783695115968 Página: 79. Somatório: 999729842053785331059 Página: 80. Somatório: 999731323530717471886 Página: 81. Somatório: 999732770476483432677 Página: 82. Somatório: 999734186803020889813 Página: 83. Somatório: 999735572886558989765 Página: 84. Somatório: 999736930717675325123 Página: 85. Somatório: 999738261578048108072 Página: 86. Somatório: 999739565531814853150 Página: 87. Somatório: 999740843885087443034 Página: 88. Somatório: 999742099529940900323 Página: 89. Somatório: 999743334269287484874 Página: 90. Somatório: 999744549932416459599 Página: 91. Somatório: 999745748176061780315 Página: 92. Somatório: 999746928068603650949 Página: 93. Somatório: 999748087409523092876 Página: 94. Somatório: 999749226168697534256 Página: 95. Somatório: 999750345316908741312 Página: 96. Somatório: 999751444076281976424 Página: 97. Somatório: 999752523910869604891 Página: 98. Somatório: 999753587112242753152 Página: 99. Somatório: 999754631675569979343 Página: 100. Somatório: 999755660011200290017 Página: 101. Somatório: 999756673861454234239 Página: 102. Somatório: 999757673352674052138 Página: 103. Somatório: 999758658029835986512 Página: 104. Somatório: 999759628177044116980 Página: 105. Somatório: 999760584739200824177 Página: 106. Somatório: 999761529551120381017 Página: 107. Somatório: 999762461817263105621 Página: 108. Somatório: 999763381025393114693 Página: 109. Somatório: 999764289396084047523 Página: 110. Somatório: 999765186658300248553 Página: 111. Somatório: 999766072496599959035 Página: 112. Somatório: 999766948053859458904 Página: 113. Somatório: 999767813257616205465 Página: 114. Somatório: 999768668653532648773 Página: 115. Somatório: 999769514653610313389 Página: 116. Somatório: 999770351098035146929 Página: 117. Somatório: 999771178739588295899 Página: 118. Somatório: 999771998327933821320 Página: 119. Somatório: 999772810428982954013 Página: 120. Somatório: 999773616297562260949 Página: 121. Somatório: 999774416160158298623 Página: 122. Somatório: 999775209632611787867 Página: 123. Somatório: 999775998162024532431 Página: 124. Somatório: 999776784229845193306 Página: 125. Somatório: 999777567196846402031 Página: 126. Somatório: 999778341162972208909 Página: 127. Somatório: 999779106098691621244 Página: 128. Somatório: 999779861816937309651 Página: 129. Somatório: 999780609009196991937 Página: 130. Somatório: 999781347305129754784 Página: 131. Somatório: 999782076975128734781 Página: 132. Somatório: 999782799213189536978 Página: 133. Somatório: 999783513824307532874 Página: 134. Somatório: 999784220947347280569 Página: 135. Somatório: 999784920377000470673 Página: 136. Somatório: 999785612084707738348 Página: 137. Somatório: 999786296968329310054 Página: 138. Somatório: 999786975046596785023 Página: 139. Somatório: 999787645556314418253 Página: 140. Somatório: 999788308845986333736 Página: 141. Somatório: 999788965794235979346 Página: 142. Somatório: 999789616224625063724 Página: 143. Somatório: 999790260587939393028 Página: 144. Somatório: 999790898854265983480 Página: 145. Somatório: 999791531409846799202 Página: 146. Somatório: 999792159138161482152 Página: 147. Somatório: 999792781459361278176 Página: 148. Somatório: 999793398831845361118 Página: 149. Somatório: 999794011778254098530 Página: 150. Somatório: 999794621064830599968 Página: 151. Somatório: 999795227452641589570 Página: 152. Somatório: 999795831104400364157 Página: 153. Somatório: 999796429339018606986 Página: 154. Somatório: 999797021954742958596 Página: 155. Somatório: 999797608899827597751
Fatal error: Maximum execution time of 120 seconds exceeded in C:\xampp\htdocs\BiaAmoung\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 560

Deu um erro :

 

Fatal error: Maximum execution time of 120 seconds exceeded in C:\xampp\htdocs\BiaAmoung\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 560

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly :)

 

Em 11/06/2021 at 19:27, biakelly disse:

Você não sabe o quão importante esta sendo aprender com suas explicações.

É muito gratificante ler isso! Fico muito feliz :D

 

Em 11/06/2021 at 19:27, biakelly disse:

Mas antes de mais nada, deixe-me agradecer muito por tanta ajuda muito muito muito obrigada mesmo, por separar seu tempo e me ajudar com tamanha gentileza. Uma pergunta você é professor?

É um prazer ajudar. Não é sempre que consigo estar mais ativo no fórum, mas é um hobby que tenho há alguns anos. A maior parte do meu conhecimento vem justamente disso. Quando ajudo alguém, constantemente me pego consultando um manual, uma referência, pensando em soluções, e isso reforça o meu próprio aprendizado. Não sou professor, mas presto consultorias. Também pretendo montar um blog futuramente, mas antes tenho outros projetos, então o blog vai demorar um pouquinho ainda.

Novamente, muito obrigado :)

 

Em 11/06/2021 at 19:27, biakelly disse:

será possível retirar da soma o saldo da carteira emissora?

Sim, seria uma operação de subtração, que você deve fazer com bcsub para manter o foco na precisão da apresentação dos cálculos.

Veja: https://www.php.net/manual/en/function.bcsub.php

 

Em 11/06/2021 at 19:27, biakelly disse:

Esse token foi emitido por esta carteira: TRX6Q82wMqWNbCCiLqejbZe43wk1h1zJHm e ela possui neste momento: 30,631.068883

Você precisa descobrir o endpoint (endereço de requisição) para coletar o saldo dessa carteira.

Daí você usa o Guzzle, extrai essa informação, depois usa o bcsub que disse acima para subtrair o valor que calculamos por esse saldo.

Você sabe o endpoint?

 

Em 11/06/2021 at 19:27, biakelly disse:

será possível salvar o resultado em um bloco de notas excluindo o saldo da carteira emissora?

Sua ideia é perfeitamente razoável, e na verdade uma sugestão minha, mas eu particularmente não faria em um arquivo, pois operações ao disco são sempre mais lentas do que em memória, então:

 

1 - Memória, com APCu (recomendado) ou Memcached. Veja:

https://www.php.net/manual/en/book.apcu.php

https://www.php.net/manual/en/book.memcached.php

O problema é que para ambas você precisa da instalação do módulo.

No xampp por exemplo é assim:

https://stackoverflow.com/questions/24448261/how-to-install-apcu-in-windows

https://www.phpflow.com/php/how-to-install-apc-cache-on-wamp-and-xampp/

 

Esse é o método mais recomendado, pois é o mais performático, mas a necessidade da instalação (tanto na sua máquina de desenvolvimento quanto no servidor, se já não tiver instalado) pode ser um problema.

 

2 - Banco de dados. Qualquer coisa rápida e prática. SQLite, mongo ou MariaDb / Mysql mesmo.

 

3 - Por fim, o método mais lento e menos confiável, mas definitivamente o mais simples: arquivo.

Para salvar e pegar o valor depois em arquivo você só precisa de 2 funções:

file_put_contents e file_get_contents.

 

Daí você faz exatamente o que você disse: Cronjob rodando a cada X minutos, se preocupando em não permitir a execução simultanea e na hora de exibir você consulta da memória, banco ou arquivo.

 

Esse processo todo demonstra um sistema de cache. Amplamente utilizado em sites com muita visitação, como portais de notícias, por ex.

 

23 horas atrás, biakelly disse:

Sobre o erro, na verdade era meu xampp

Legal. Que bom que funcionou aí. Depois de implementar o cache e a subtração vai ficar 100% :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares :D

 

 Andei estudando os links que passou e olha que felicidade: deu super certo!!!! Agora tenho um Supply total e um circulante total preciso e em tempo real :D. Estou tão feliz que daqui por diante vou usar mais o Guzzle, amei a facilidade dele!!!! Muito obrigada!

 

Sobre o Cron, estou fazendo como arquivo mesmo, achei mais fácil do que instalar os plugins, até comecei mas não deu muito certo, porém não vou desistir pois se e mais performático certamente aprender instala-los será mais uma etapa de aprendizado e vou seguir seu conselho.

 

Passei aqui só para dar o feedback e agradecer imensamente pela ajuda meu mestre hi hi !!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly

 

3 horas atrás, biakelly disse:

Agora tenho um Supply total e um circulante total preciso e em tempo real :D

Show demais! =D

 

3 horas atrás, biakelly disse:

Sobre o Cron, estou fazendo como arquivo mesmo, achei mais fácil do que instalar os plugins, até comecei mas não deu muito certo, porém não vou desistir pois se e mais performático certamente aprender instala-los será mais uma etapa de aprendizado e vou seguir seu conselho.

Sim, recomendo que você dê atenção a esse assunto, pois é realmente muito útil e não é tão difícil, mas que bom que conseguiu resolver com arquivos.

Vou marcar aqui como resolvido. Até mais :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Giovanird
      Olá a todos!
      Tenho uma api  Sala de Aula e dentro dela o id de cada aluno. Em outra api, API ALUNO,  tenho os dados de cada aluno:  nome, foto, endereço.
      Estou fazendo o foreach da api Sala de Aula e preciso também retornar os dados de cada aluno.
      Segue o código que não estou conseguindo desenvolver
      $sala = file_get_contents("https://api/sala?id=987"); $sala = json_decode($sala, true); $sala = $sala['data']; foreach ($sala as $resulsala){ $codigoaluno = $resulsala['idaluno']; $alunos = file_get_contents("https://api/alunos?id=$codigoaluno"); $alunos = json_decode($alunos, true); $alunos = $alunos['data']; foreach ($alunos as $resulalunos){ echo $resulalunos['nome']; echo $resulalunos['foto']; echo $resulalunos['rua']; } }  
    • Por Orico Chain
      Oi pessoal,
       
      Preciso de ajuda, estou tentando gerar um TXT com dados de uma API mas não estou conseguindo:
       
      <?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api.bololex.com/api/prices/TRX-USDT", CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "cache-control: no-cache" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); $response = json_decode($response, true); $value1 = $response['result'] [0] ['ask'] ['priceChange']; if (empty($value1)) { $value1 = is_file('/var/www/html/24tstar.txt') ? file_get_c> } else { $value1 = round($value1, 6); file_put_contents('/var/www/html/24tstar.txt', $value1); Preciso que o TXT grave duas informações: ASK e PRICECHANGE uma em baixo da outra
       
      estou errando alguem lugar, alguém poderia me ajudar?
    • Por Kelven
      Bom dia pessoal tudo bem?
      Então, estou trabalhando em um site em php e preciso usar a api do facebook para obter o feed do instagram, porém a chave token é um conteúdo muito sensível, então decidi fazer em php para ela não ficar disponível do lado do cliente. Alguém sabe me dizer se é possível fazer isso? Porque eu pesquisando no google só achei maneiras de fazer em javascript.
    • Por zuuzu
      Olá, estou desenvolvendo uma api para download de fotos/videos/gif, eu consegui fazer tudo certinho, mas na hora de gerar um link de download aleatório ele gera sempre o mesmo, só gera um link diferente se eu reiniciar o servidor, queria que gerasse um link diferente sempre que eu reiniciasse a página, sem precisar reiniciar o servidor. Tem como alguém me ajudar com isso? *A api está sendo desenvolvida para a automatização de download de fotos/videos/gif*

    • Por New Job
      Boa tarde, tenho um site de imobiliária e gostaria de integrar com este sistema.
       
      Documentação API: http://vistasoft.com.br/api/

      Seria para exibir os imóveis no site
      (54) 999350968 (whatsapp).
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.