Jump to content

fabiuz

Membro Inativo
  • Posts

    93
  • Joined

  • Last visited

Everything posted by fabiuz

  1. Na realidade, eu tenho um programa que criei que armazena todas as combinações da lotofacil em uma tabela em um banco de dados, simplesmente, o que faço é um select na tabela. Na tabela pra cada combinação, há um identificador, e várias estatísticas já predefinidas, por exemplo, pares x ímpares, horizontal, vertical. Em relação à contabilização das combinações é bem simples, no meu banco de dados, eu armazeno as bolas em duas formas, através dos campos 'b1', até 'b15' e através dos campos 'num_1' até 'num_25', os campos com prefixo 'num_' armazena '1' se a bola faz parte da combinação e '0' se não saiu. Então, por exemplo, se eu quero saber quantos acertou eu tive eu simplesmente, faço um select assim: Select num_1 + num_2 + num_3 + num_4 + num_5 + num_6 + num_7 + num_8 + num_9 + num_10 + num_11 + num_12 + num_13 + num_14 + num_15, count(*) as qt_vz from lotofacil.lotofacil group by num_1 + num_2 + num_3 + num_4 + num_5 + num_6 + num_7 + num_8 + num_9 + num_10 + num_11 + num_12 + num_13 + num_14 + num_15 order by ltf_qt asc, qt_vez desc;
  2. Também analiso jogos lotéricos. Tenho até um programa de uso pessoal que analisa jogos da lotofacil, entretanto, pra lotomania, ainda não fiz. Eu já cheguei a fazer um pra lotomania mas era baseado em jogos passados. Em relação ao programa achei interessante, estou pensando em criar um semelhante a este pra lotomania. Anteontem, após assistir aos videos, fiz em uma planilha, uma macro em excel, que pega cada concurso e identificar a quantidade de acertos por colunas e linhas e também exibe estes padrões exibidos no vídeo. A lógica é bem simples: Se a quantidade de acertos da coluna atual com a quantidade de acertos da coluna adjacentes for um valor entre 0 e 2, anotar estas duas colunas. No caso, pra saber qual é a combinação de 1 linha com duas colunas ou de duas linhas com duas colunas, a lógica é semelhante, a soma de acertos de linhas e das duas colunas tem que ser um valor entre '0' e '2'.
  3. Eu tenho um programa bem avançado, que criei, em freepascal/Lazarus, aqui, este "CSN", chama-se de "LTF_ID". Aqui, no meu programa, dado qualquer combinação de 15 a 18 bolas, há uma função que obtém o ltf_id, rapidamente. Todas as combinações possíveis estão armazenada em tabela do banco de dados, entretanto, eu não busco o ltf_id diretamente do banco, eu passo os números das bolas pra uma função que retorna o ltf_id. Agora, falta eu implementar um processo inverso, dado o ltf_id obter os números correspondentes. Em relação ao CSN/LTF_ID, já pensei em estudar como varia em relação ao sorteios, mas não implementei ainda.
  4. A tabela abaixa, demonstra a quantidade de combinações por quantidade de acertos e por quantidade de bolas por combinação. Vou explicar a tabela, por exemplo, na primeira linha, temos: ltf_qt|acer|qt_vz | ------|----|-------| 15| 5| 3003| Isto, quer dizer, que em uma combinação com 15 bolas, há sempre 3003 combinações com 5 acertos. ltf_qt|acer|qt_vz | ------|----|-------| 15| 5| 3003| 15| 6| 50050| 15| 7| 289575| 15| 8| 772200| 15| 9|1051050| 15| 10| 756756| 15| 11| 286650| 15| 12| 54600| 15| 13| 4725| 15| 14| 150| 15| 15| 1| 16| 6| 5005| 16| 7| 64350| 16| 8| 289575| 16| 9| 600600| 16| 10| 630630| 16| 11| 343980| 16| 12| 95550| 16| 13| 12600| 16| 14| 675| 16| 15| 10| 17| 7| 6435| 17| 8| 64350| 17| 9| 225225| 17| 10| 360360| 17| 11| 286650| 17| 12| 114660| 17| 13| 22050| 17| 14| 1800| 17| 15| 45| 18| 8| 6435| 18| 9| 50050| 18| 10| 135135| 18| 11| 163800| 18| 12| 95550| 18| 13| 26460| 18| 14| 3150| 18| 15| 120| 19| 9| 5005| 19| 10| 30030| 19| 11| 61425| 19| 12| 54600| 19| 13| 22050| 19| 14| 3780| 19| 15| 210| 20| 10| 3003| 20| 11| 13650| 20| 12| 20475| 20| 13| 12600| 20| 14| 3150| 20| 15| 252| 21| 11| 1365| 21| 12| 4550| 21| 13| 4725| 21| 14| 1800| 21| 15| 210| 22| 12| 455| 22| 13| 1050| 22| 14| 675| 22| 15| 120| 23| 13| 105| 23| 14| 150| 23| 15| 45| 24| 14| 15| 24| 15| 10| 25| 15| 1|
  5. No meu programa dia de sorte tem estas estatísticas: par x ímpar, primo x não primo, horizontal, vertical, dezena, horizontal x par, horizontal x primo, b1_b7, b2_b6, b3_b5, b1_b2_b3, b5_b6_b7, df_1, df_2, df_3, df_4, df_5, df_6, novos x repetidos.
  6. @Zangado Que legal, esta ideia de -1 + 1, existe também no meu programa, ou seja, se a bola não saiu, eu colocou -1, se ainda não saiu vou incrementando. Aqui, tem o conceito, de "novos", "repetindo", "deixou de sair", e "ainda nao saiu". No meu programa lotofacil, também tem esta ideia.
  7. Eu faço assim, eu passo a url sem indicar o número do concurso, então, o webservice retorna o último concurso sorteado, em seguida, eu pego o número deste concurso e gero vários urls somente mudando o número do concurso, ou seja, uso um for de 1 até o último concurso. Em seguida, eu comparo cada concurso com o concurso já atualizados no sistema, usando consultas sql, nesta consulta retorna somente os concursos que deve atualizar, ou seja os concursos pendentes. Em programo em vba, também, entretanto, nunca fiz este tipo de requisição usando vba.
  8. Por exemplo, acabei de utilizar meu programa, veja que ainda não inserir o último concurso 100, neste caso é só apertar um botão que o concurso será atualizado. AINDA_NAO_INSERIDO 100 15-01-2019 3 4 8 15 16 20 21 DADOS_CORRETOS 99 12-01-2019 4 14 20 27 28 29 30 DADOS_CORRETOS 98 10-01-2019 1 3 7 12 26 27 28 DADOS_CORRETOS 97 08-01-2019 1 10 12 22 23 25 28 DADOS_CORRETOS 96 05-01-2019 3 4 9 15 17 28 29 DADOS_CORRETOS 95 03-01-2019 5 7 8 18 20 23 28 DADOS_CORRETOS 94 29-12-2018 7 10 13 15 19 23 26 DADOS_CORRETOS 93 27-12-2018 1 8 9 16 21 23 30 DADOS_CORRETOS 92 22-12-2018 5 7 8 9 15 26 29 DADOS_CORRETOS 91 20-12-2018 8 10 15 16 23 28 29 DADOS_CORRETOS 90 18-12-2018 1 5 6 8 12 23 26 DADOS_CORRETOS 89 15-12-2018 3 6 16 18 19 24 31 DADOS_CORRETOS 88 13-12-2018 3 4 17 18 19 23 27 DADOS_CORRETOS 87 11-12-2018 7 9 10 15 18 21 22 DADOS_CORRETOS 86 08-12-2018 3 6 8 9 11 19 26 DADOS_CORRETOS 85 06-12-2018 3 7 21 22 23 26 31 DADOS_CORRETOS 84 04-12-2018 7 10 15 16 18 19 24 DADOS_CORRETOS 83 01-12-2018 2 9 10 13 15 21 26 DADOS_CORRETOS 82 29-11-2018 2 9 10 13 16 17 22 DADOS_CORRETOS 81 27-11-2018 6 10 12 25 26 27 29 DADOS_CORRETOS 80 24-11-2018 2 3 4 10 18 19 28 DADOS_CORRETOS 79 22-11-2018 1 8 10 12 15 21 28 DADOS_CORRETOS 78 20-11-2018 4 6 8 13 14 19 23 DADOS_CORRETOS 77 17-11-2018 6 7 11 12 14 19 21 DADOS_CORRETOS 76 13-11-2018 10 15 16 21 25 26 29 DADOS_CORRETOS 75 10-11-2018 2 3 6 14 28 30 31 DADOS_CORRETOS 74 08-11-2018 6 12 15 17 20 23 29 DADOS_CORRETOS 73 06-11-2018 8 9 10 11 14 18 23 DADOS_CORRETOS 72 03-11-2018 1 2 6 8 9 18 21 DADOS_CORRETOS 71 01-11-2018 4 6 7 8 24 27 31 DADOS_CORRETOS 70 30-10-2018 2 4 5 9 11 28 29 DADOS_CORRETOS 69 27-10-2018 1 3 5 6 8 26 29 DADOS_CORRETOS 68 25-10-2018 1 4 6 14 20 21 27 DADOS_CORRETOS 67 23-10-2018 1 4 8 14 19 22 26 DADOS_CORRETOS 66 20-10-2018 4 6 10 11 12 17 24 DADOS_CORRETOS 65 18-10-2018 7 20 21 27 28 30 31 DADOS_CORRETOS 64 16-10-2018 5 6 8 17 18 20 27 DADOS_CORRETOS 63 13-10-2018 2 3 6 9 27 28 29 DADOS_CORRETOS 62 11-10-2018 7 11 13 18 23 28 30 DADOS_CORRETOS 61 09-10-2018 5 8 10 13 19 25 28 DADOS_CORRETOS 60 06-10-2018 1 6 7 8 17 18 22 DADOS_CORRETOS 59 04-10-2018 3 4 5 8 10 24 25 DADOS_CORRETOS 58 02-10-2018 11 12 13 24 25 29 30 DADOS_CORRETOS 57 29-09-2018 3 5 10 12 18 26 28 DADOS_CORRETOS 56 27-09-2018 9 10 15 16 17 23 31 DADOS_CORRETOS 55 25-09-2018 1 8 16 18 22 25 28 DADOS_CORRETOS 54 22-09-2018 4 11 18 21 24 25 27 DADOS_CORRETOS 53 20-09-2018 3 7 16 18 19 25 30 DADOS_CORRETOS 52 18-09-2018 7 12 14 20 22 24 26 DADOS_CORRETOS 51 15-09-2018 2 8 10 14 16 24 28 DADOS_CORRETOS 50 13-09-2018 14 16 17 18 22 23 31 DADOS_CORRETOS 49 11-09-2018 4 11 16 17 20 23 31 DADOS_CORRETOS 48 08-09-2018 6 8 10 17 23 29 31 DADOS_CORRETOS 47 06-09-2018 5 7 13 15 16 20 22 DADOS_CORRETOS 46 04-09-2018 1 4 5 8 10 16 30 DADOS_CORRETOS 45 01-09-2018 2 5 7 12 15 29 30 DADOS_CORRETOS 44 30-08-2018 7 9 15 23 26 30 31 DADOS_CORRETOS 43 28-08-2018 4 7 17 18 27 28 31 DADOS_CORRETOS 42 25-08-2018 6 11 14 16 17 29 31 DADOS_CORRETOS 41 23-08-2018 7 12 23 25 27 30 31 DADOS_CORRETOS 40 21-08-2018 2 10 12 14 19 21 27 DADOS_CORRETOS 39 18-08-2018 4 5 6 9 13 25 30 DADOS_CORRETOS 38 16-08-2018 8 15 17 18 26 29 30 DADOS_CORRETOS 37 14-08-2018 2 7 12 16 18 22 23 DADOS_CORRETOS 36 11-08-2018 2 7 11 12 13 16 27 DADOS_CORRETOS 35 09-08-2018 3 7 11 12 17 22 23 DADOS_CORRETOS 34 07-08-2018 6 12 15 18 23 27 29 DADOS_CORRETOS 33 04-08-2018 3 10 12 13 23 28 31 DADOS_CORRETOS 32 02-08-2018 3 4 7 16 18 20 27 DADOS_CORRETOS 31 31-07-2018 4 6 7 9 11 24 28 DADOS_CORRETOS 30 28-07-2018 4 8 9 17 20 27 30 DADOS_CORRETOS 29 26-07-2018 3 5 13 21 22 24 27 DADOS_CORRETOS 28 24-07-2018 2 9 12 15 18 20 24 DADOS_CORRETOS 27 21-07-2018 6 12 15 17 20 23 28 DADOS_CORRETOS 26 19-07-2018 2 8 10 11 16 20 28 DADOS_CORRETOS 25 17-07-2018 1 10 13 17 21 25 29 DADOS_CORRETOS 24 14-07-2018 7 8 12 15 16 18 30 DADOS_CORRETOS 23 12-07-2018 9 10 17 19 25 27 28 DADOS_CORRETOS 22 10-07-2018 2 4 5 12 18 22 27 DADOS_CORRETOS 21 07-07-2018 2 8 10 11 12 18 31 DADOS_CORRETOS 20 05-07-2018 6 12 17 21 26 29 31 DADOS_CORRETOS 19 03-07-2018 3 4 9 12 14 28 29 DADOS_CORRETOS 18 30-06-2018 4 7 8 14 21 27 31 DADOS_CORRETOS 17 28-06-2018 9 11 13 14 19 20 22 DADOS_CORRETOS 16 26-06-2018 1 2 7 12 16 20 25 DADOS_CORRETOS 15 23-06-2018 8 11 13 16 26 28 29 DADOS_CORRETOS 14 21-06-2018 1 8 16 20 21 26 31 DADOS_CORRETOS 13 19-06-2018 1 4 7 9 20 21 26 DADOS_CORRETOS 12 16-06-2018 2 3 7 12 17 21 22 DADOS_CORRETOS 11 14-06-2018 7 13 16 19 20 27 31 DADOS_CORRETOS 10 12-06-2018 6 10 13 18 19 20 30 DADOS_CORRETOS 9 09-06-2018 3 10 13 18 19 23 24 DADOS_CORRETOS 8 07-06-2018 1 4 13 21 22 24 27 DADOS_CORRETOS 7 05-06-2018 2 5 6 14 20 24 25 DADOS_CORRETOS 6 02-06-2018 1 11 18 19 26 30 31 DADOS_CORRETOS 5 29-05-2018 2 8 9 17 19 24 28 DADOS_CORRETOS 4 26-05-2018 6 7 13 15 18 19 29 DADOS_CORRETOS 3 24-05-2018 11 12 21 24 25 28 29 DADOS_CORRETOS 2 22-05-2018 8 11 12 14 20 21 28 DADOS_CORRETOS 1 19-05-2018 3 5 8 9 19 21 30
  9. Conforme o procedimento que descrevi, se a pessoa souber um pouco de programação, conseguirá obter os dados diretamente do site da caixa. Tal qual eu fiz, eu baixo diretamente de dentro do meu programa que criei, é só apertar um botão. A caixa disponibiliza o resultado em formato json dentro do site, quando vc clica nos botões Anterior ou Próximo é enviada uma requisição Ajax pra o webservice da caixa e a requisição é retorna pra o próprio site e o site renderiza os dados na tela. Pra vc ver a requisição ajax, é só clicar em inspecionar no navegador, ir pra a guia "Network", depois, clicar em "XHR", pra filtrar somente por esta requisição, em seguida, limpe a lista, pra depois a lista "XHR", depois, clique em "Anterior" ou "Próximo", neste momento irá aparecer na lista da guia "XHR", a requisição efetuada pelo site da caixa, nesta lista há vários campos, um deles é a url padrão, no extremo direito, vc tem a guia response ou resposta, e lá vc verá um resultado em json.
  10. Ganhar na loteria é dificil, mas vc pode aumentar tuas chances, se usa estatísticas e um pouco de sorte. Se alguém disser que descobrir algo milagroso, uma esquema desconfie, ninguém pode prever o futuro. Em probabilidade, cada combinação tem a mesma chance de sair, em estatística, algumas combinações tem a tendência de sair mais que as outras.
  11. No código que postei acima, é parte de um programa que criei que baixa os resultados automaticamente do site da caixa, antes, eu baixava do arquivo zip, entretanto, no site quando saia o resultado, no arquivo zip era disponibilizado um dia depois. Meu programa é feito em freepascal/lazarus, eu geralmente, só aperto um botão, ele baixa o json, analisa-o e inseri em tabelas do banco de dados. Pra mim, é improdutivo, vc acessar um site, baixar o arquivo, em excel e depois copia pra as colunas. Eu uso software, que baixa automaticamente diretamente da caixa.
  12. Aqui, está a função que gera o sql das informações retornada pelo json: { Aqui, iremos gerar o sql do json que foi retornado. } function gerar_sql_dinamicamente(lista_de_resultado_json: TStringList): string; var json_data: TJsonData; // Há 25 bolas, o índice corresponde ao número da bola, // o índice 0 não é utilizado. lotofacil_bolas: array[0..25] of integer; // Concurso retorna somente 15 bolas. lotofacil_concurso_bolas: array[0..15] of integer; lista_de_sql: TStringList; uA, uB, indice_bolas: integer; json_value: variant; data_do_concurso: TDateTime; outra_data: TDateTime; data_concurso: array of string; data_convertida: array of string; bolas_ordenadas: TStringArray; bola_numero: longint; sql_insert: string; formato_numero_decimal: TFormatSettings; arquivo_sql: Text; begin // O sql será formado desta maneira. // Insert campo_1, campo_2 values (valor_1, valor_2), (valor_1, valor_2); lista_de_sql := TStringList.Create; lista_de_sql.Clear; for uA := 0 to Pred(lista_de_resultado_json.Count) do begin Writeln(lista_de_resultado_json.Strings[ua]); json_data := GetJSON(lista_de_resultado_json.Strings[ua]); // ============ NÚMERO DO CONCURSO. ================== json_value := TJsonObject(json_data).Get('nu_concurso'); if vartype(json_value) = varnull then begin continue; end; if uA <> 0 then begin lista_de_sql.Add(','); end; lista_de_sql.Add('('); lista_de_sql.Add(json_value); if json_value = 428 then Writeln('Erro.'); if json_value = 3 then begin writeln(''); end; // ============ DATA ====================== // Aqui, a data está em formato brasileiro, interseparados // pelo caractere '/'. json_value := TJsonObject(json_data).Get('dt_apuracaostr'); data_concurso := string(json_value).Split('/'); if Length(data_concurso) <> 3 then begin MessageDlg('', 'Erro, data: ' + json_value + ' incorreto.', mtError, [mbOK], 0); Exit; end; // O arranjo está desta forma: // dia-mes-ano. // data_concurso[0] := dia // data_concurso[1] := mes // data_concurso[2] := ano SetLength(data_convertida, 3); // Iremos organizar a data neste formato: // ano-mes-dia. data_convertida[0] := data_concurso[2]; data_convertida[1] := data_concurso[1]; data_convertida[2] := data_concurso[0]; lista_de_sql.Add(',' + QuotedStr(data_convertida[0] + '-' + data_convertida[1] + '-' + data_convertida[2])); // ============ DATA PRÓXIMO CONCURSO ====================== // Aqui, a data está em formato brasileiro, interseparados // pelo caractere '/'. json_value := TJsonObject(json_data).Get('dtproximoconcursostr'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin data_concurso := string(json_value).Split('/'); if Length(data_concurso) <> 3 then begin MessageDlg('', 'Erro, data: ' + json_value + ' incorreto.', mtError, [mbOK], 0); Exit; end; // A data está neste formato: // dia-mes-ano. // data_concurso[0] := dia // data_concurso[1] := mes // data_concurso[2] := ano SetLength(data_convertida, 3); // Irei organizar a data neste formato: // ano-mes-dia. data_convertida[0] := data_concurso[2]; data_convertida[1] := data_concurso[1]; data_convertida[2] := data_concurso[0]; lista_de_sql.Add(',' + QuotedStr(data_convertida[0] + '-' + data_convertida[1] + '-' + data_convertida[2])); end; // ================= BOLAS SORTEADAS ======================= // No json, o campo resultadoordenado, armazena as bolas interseparadas // pelo caractere '-' json_value := TJsonObject(json_data).Get('resultadoordenado'); bolas_ordenadas := string(json_value).Split('-'); if Length(bolas_ordenadas) <> 15 then begin MessageDlg('', 'Erro, nao há 15 bolas no concurso.', mtError, [mbOK], 0); Exit; end; // Não iremos confiar no webservice, sempre devemos verificar por bolas // duplicadas e foram de ordem. // As bolas correspondem os índices do vetor, por isso, devemos FillChar(lotofacil_bolas, 26 * sizeof(integer), 0); for uB := 0 to Pred(Length(bolas_ordenadas)) do begin try // Verificar se o número da bola é válida pra aquele jogo. bola_numero := StrToInt(bolas_ordenadas[uB]); if (bola_numero < 1) or (bola_numero > 25) then begin MessageDlg('', 'Erro, bola inválida: ' + IntToStr(bola_numero), mtError, [mbOK], 0); Exit; end; except On Exc: Exception do begin MessageDlg('', 'Erro: ' + Exc.Message, mtError, [mbOK], 0); Exit; end; end; // Verifica bolas duplicadas. if lotofacil_bolas[bola_numero] = 1 then begin MessageDlg('', 'Erro, bola já foi sorteada', mtError, [mbOK], 0); Exit; end; lotofacil_bolas[bola_numero] := 1; end; // Pega as bolas ordenadas. indice_bolas := 0; for uB := 1 to 25 do begin if lotofacil_bolas[uB] = 1 then begin lotofacil_concurso_bolas[indice_bolas] := uB; Inc(indice_bolas); if indice_bolas = 15 then begin break; end; end; end; // Gera o sql dinamicamente. // As bolas está armazenada de 0 a 14. for uB := 0 to Pred(Length(bolas_ordenadas)) do begin lista_de_sql.Add(', ' + IntToStr(lotofacil_concurso_bolas[uB])); end; // ============================================================ // Aqui, iremos pegar os valores dos campos: // qt_ganhador_faixa_1, que corresponde a quantidade de ganhadores de 15 números. // qt_ganhador_faixa_2, que corresponde a quantidade de ganhadores de 14 números. // qt_ganhador_faixa_3, que corresponde a quantidade de ganhadores de 13 números. // qt_ganhador_faixa_4, que corresponde a quantidade de ganhadores de 12 números. // qt_ganhador_faixa_5, que corresponde a quantidade de ganhadores de 11 números. // Tais números são números inteiros e não decimais, nenhuma conversão necessária. for uB := 1 to 5 do begin json_value := TJsonObject(json_data).Get('qt_ganhador_faixa' + IntToStr(uB)); lista_de_sql.Add(',' + IntToStr(json_value)); Writeln(FloatToStr(json_value)); end; // ============================================================ // Aqui, iremos pegar os valores dos campos: // qt_rateio_faixa_1, que corresponde ao valor que cada ganhador de 15 acertos recebeu. // qt_rateio_faixa_2, que corresponde ao valor que cada ganhador de 14 acertos recebeu. // qt_rateio_faixa_3, que corresponde ao valor que cada ganhador de 13 acertos recebeu. // qt_rateio_faixa_4, que corresponde ao valor que cada ganhador de 12 acertos recebeu. // qt_rateio_faixa_5, que corresponde ao valor que cada ganhador de 11 acertos recebeu. // Aqui, o número está no formato americano. formato_numero_decimal.DecimalSeparator := '.'; formato_numero_decimal.ThousandSeparator := ','; for uB := 1 to 5 do begin json_value := TJsonObject(json_data).Get('vr_rateio_faixa' + IntToStr(uB)); lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); end; // ================ VALOR ACUMULADO FAIXA 1 ==================== // No json, 'vracumuladofaixa1' está em formato numérico brasileiro. // Ele pode ser nulo, devemos evitar isto. json_value := TJsonObject(json_data).Get('vracumuladofaixa1'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin formato_numero_decimal.DecimalSeparator := ','; // Se fossemos converter um string numérico em formato brasileiro, sem especificar, // o formato do número, StrToFloat, espera que o número esteja em formato americano, // por isso, devemos explicitar que o string tem um formato numérico do brasil. json_value := ReplaceText(json_value, '.', ''); json_value := StrToFloat(json_value, formato_numero_decimal); // Observe agora, que json_value, está em formato americano, pois float, são números // decimais com ponto, sempre será desta forma, se quisermos converter pra o formato // brasileiro, era simplesmente informar com isto, neste caso, não precisamos mais // mais pra garantir iremos explicitar que quando converter de float pra string, // o formato seja americano pois, sql espera receber um número em formato americano. formato_numero_decimal.DecimalSeparator := '.'; formato_numero_decimal.ThousandSeparator := ','; lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); end; // ================ VALOR ACUMULADO FAIXA 2 ==================== // No json, 'vracumuladofaixa2' está em formato numérico brasileiro. json_value := TJsonObject(json_data).Get('vracumuladofaixa2'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin formato_numero_decimal.DecimalSeparator := ','; // Se fossemos converter um string numérico em formato brasileiro, sem especificar, // o formato do número, StrToFloat, espera que o número esteja em formato americano, // por isso, devemos explicitar que o string tem um formato numérico do brasil. json_value := ReplaceText(json_value, '.', ''); json_value := StrToFloat(json_value, formato_numero_decimal); // Observe agora, que json_value, está em formato americano, pois float, são números // decimais com ponto, sempre será desta forma, se quisermos converter pra o formato // brasileiro, era simplesmente informar com isto, neste caso, não precisamos mais // mais pra garantir iremos explicitar que quando converter de float pra string, // o formato seja americano pois, sql espera receber um número em formato americano. formato_numero_decimal.DecimalSeparator := '.'; lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); // ======================= Valor arrecadado ===================== // O campo 'vrarrecadado' está em formato numérico brasileiro. json_value := TJsonObject(json_data).Get('vrarrecadado'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin formato_numero_decimal.DecimalSeparator := ','; // Retirar o separador de milhar, pois o número está em formato brasileiro. // e a função StrToCurr não aceita o separador de milhar ao realizar a conversão. json_value := ReplaceText(json_value, '.', ''); json_value := StrToFloat(json_value, formato_numero_decimal); // Agora converter em formato numérico americano. formato_numero_decimal.DecimalSeparator := '.'; lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); end; end; // ======================= Valor acumulado especial ================ // O campo 'vracumuladoespecial' está em formato numérico brasileiro formato_numero_decimal.DecimalSeparator := ','; // Retirar o separador de milhar, pois o número está em formato brasileiro. // e a função StrToFloat não aceita o separador de milhar ao realizar a conversão. json_value := TJsonObject(json_data).Get('vracumuladoespecial'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin formato_numero_decimal.DecimalSeparator := ','; json_value := ReplaceText(json_value, '.', ''); json_value := StrToFloat(json_value, formato_numero_decimal); // Agora converter em formato americano. formato_numero_decimal.DecimalSeparator := '.'; lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); end; // ===================== ESTIMATIVA =========================== // O campo 'vrestimativa' está em formato numérico brasileiro. json_value := TJsonObject(json_data).Get('vrestimativa'); if vartype(json_value) = varnull then begin lista_de_sql.Add(', null'); end else begin formato_numero_decimal.DecimalSeparator := ','; json_value := ReplaceText(json_value, '.', ''); json_value := StrToFloat(json_value, formato_numero_decimal); // Agora, converter em formato americano. formato_numero_decimal.DecimalSeparator := '.'; lista_de_sql.Add(',' + FloatToStr(double(json_value), formato_numero_decimal)); Writeln(FloatToStr(double(json_value), formato_numero_decimal)); end; // ======================= é um concurso especial ====================== json_value := TJsonObject(json_data).Get('ic_concurso_especial'); if json_value = True then begin lista_de_sql.add(',true'); end else if json_value = False then begin lista_de_sql.Add(',false'); end else begin lista_de_sql.Add(',null'); end; // =================== sorteio acumulado ===================== json_value := TJsonObject(json_data).Get('sorteio_acumulado'); if json_value = True then begin lista_de_sql.add(',true'); end else if json_value = False then begin lista_de_sql.Add(',false'); end else begin lista_de_sql.Add(',null'); end; // =================== Rateio processamento ================== json_value := TJsonObject(json_data).Get('rateioprocessamento'); if json_value = True then begin lista_de_sql.add(',true'); end else if json_value = False then begin lista_de_sql.Add(',false'); end else begin lista_de_sql.Add(',null'); end; // Fecha o insert do registro atual lista_de_sql.Add(')'); end; // Gera o cabeçãlho do insert, observe que a ordem dos campos // tem que ser igual ao insert dos valores, no loop for acima, // se o usuário alterar o valor dos insert de posição, deve-se // alterar este cabeçalho. sql_insert := 'Insert into lotofacil.lotofacil_resultado_importacao('; sql_insert := sql_insert + 'concurso, data, data_proximo_concurso,'; sql_insert := sql_insert + 'b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9, b_10, b_11, b_12, b_13, b_14, b_15'; sql_insert := sql_insert + ',qt_ganhadores_15_numeros'; sql_insert := sql_insert + ',qt_ganhadores_14_numeros'; sql_insert := sql_insert + ',qt_ganhadores_13_numeros'; sql_insert := sql_insert + ',qt_ganhadores_12_numeros'; sql_insert := sql_insert + ',qt_ganhadores_11_numeros'; //sql_insert := sql_insert + ',qt_ganhadores_mes_de_sorte'; sql_insert := sql_insert + ',rateio_15_numeros'; sql_insert := sql_insert + ',rateio_14_numeros'; sql_insert := sql_insert + ',rateio_13_numeros'; sql_insert := sql_insert + ',rateio_12_numeros'; sql_insert := sql_insert + ',rateio_11_numeros'; sql_insert := sql_insert + ', acumulado_15_numeros'; sql_insert := sql_insert + ', acumulado_14_numeros'; sql_insert := sql_insert + ', valor_arrecadado'; sql_insert := sql_insert + ', valor_acumulado_especial'; sql_insert := sql_insert + ', estimativa_premio'; sql_insert := sql_insert + ', concurso_especial'; sql_insert := sql_insert + ', sorteio_acumulado'; sql_insert := sql_insert + ', rateio_processamento'; sql_insert := sql_insert + ') values'; lista_de_sql.Insert(0, sql_insert); Exit(lista_de_sql.Text); end;
  13. A variável lotofacil_url_download está definida em outro arquivo, desta forma: lotofacil_url_download = 'http://loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbz8vTxNDRy9_Y2NQ13CDA0sTIEKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wBmoxN_FydLAGAgNTKEK8DkRrACPGwpyQyMMMj0VAcySpRM!/dl5/d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0VSC0AC4GLFAD2003/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=@timestamp@&concurso=@concurso@'; Observe, que há isto na ulr @timestamp@ e @concurso@, que serve pra substituir pela data e pelo número do concurso.
  14. Eu programo em vba, freepascal, e várias outras linguagens, no caso, eu tenho uma função em freepascal que puxa os resultados, por exemplo, do jogo lotofacil, dia de sorte. { A procedure abaixo, conecta no site da caixa, em seguida, pega o último concurso sorteado, em seguida, de posse deste número, gera várias urls do último concurso ao primeiro concurso, em seguida, baixa o json de cada url, em seguida, analisa cada json e insere tais dados analisados na tabela 'd_sorte_resultado_importacao'. } procedure baixar_novos_concursos(sql_conexao: TZConnection; sgr_controle: TStringGrid); var ultimo_concurso, uA: integer; obj_http: TIdHTTP; url_lotofacil, conteudo_recebido, sql_gerado: string; request: TIdHTTPRequest; resultado_json: TJSONData; json_chave_valor: TJSONObject; json_valor: variant; lista_de_url, lista_de_resultado_json: TStringList; sql_query: TZQuery; begin // Pra obter o último concurso, deve-se enviar pra o webservice, // um concurso vazio e um timestamp da hora atual da solicitação. url_lotofacil := lotofacil_url_download; url_lotofacil := ReplaceText(url_lotofacil, '@timestamp@', IntToStr(DateTimeToUnix(Now))); url_lotofacil := ReplaceText(url_lotofacil, '@concurso@', ''); // Agora, vamos enviar a requisição obj_http := TIdHTTP.Create; obj_http.AllowCookies := True; obj_http.HandleRedirects := True; ; try conteudo_recebido := obj_http.Get(url_lotofacil, IndyTextEncoding_UTF8); conteudo_recebido := LowerCase(conteudo_recebido); except On exc: EIdHTTPProtocolException do begin MessageDlg('', 'Erro: ' + exc.Message, mtError, [mbOK], 0); Exit; end; end; // A requisição retorna um json, este json é um objeto resultado_json := GetJSON(conteudo_recebido); json_chave_valor := TJSONObject(resultado_json); if not Assigned(json_chave_valor) then begin MessageDlg('', 'Erro: Nenhum concurso localizado', mtError, [mbOK], 0); Exit; end; // Vamos obter o número do concurso. json_valor := json_chave_valor.Get('nu_concurso'); if varType(json_valor) = varnull then begin MessageDlg('', 'Erro: Nenhum concurso localizado', mtError, [mbOK], 0); Exit; end; // Aqui, obtemos o número do concurso. ultimo_concurso := json_valor; // Os concursos são sorteados sequencialmente, então, iremos gerar, a url // pra cada concurso, indo do último ao primeiro concurso. lista_de_url := TStringList.Create; lista_de_url.Clear; for uA := ultimo_concurso downto 1 do begin url_lotofacil := lotofacil_url_download; url_lotofacil := ReplaceText(url_lotofacil, '@timestamp@', IntToStr(DateTimeToUnix(Now))); url_lotofacil := ReplaceText(url_lotofacil, '@concurso@', IntToStr(uA)); lista_de_url.Add(url_lotofacil); end; // Agora, iremos fazer requisição pra o webservice pra obter o json de cada // url. lista_de_resultado_json := TStringList.Create; lista_de_resultado_json.Clear; for uA := 0 to Pred(lista_de_url.Count) do begin try url_lotofacil := lista_de_url.Strings[uA]; conteudo_recebido := obj_http.Get(url_lotofacil, IndyTextEncoding_UTF8); conteudo_recebido := LowerCase(conteudo_recebido); lista_de_resultado_json.Add(conteudo_recebido); except On exc: Exception do begin // Isto, indica um erro no servidor, neste caso, devemos descartar esta requisição. // e continuar o processamento, este erro vai ocorrer no concurso de número 1. // Depois, irei criar um sql separadamente pra o concurso de número 1. if (obj_http.ResponseCode >= 500) and (obj_http.ResponseCode <= 599) then begin continue; end; end; end; end;
  15. { "proximoConcurso":"1888", "concursoAnterior":"1887", "forward":null, "mensagens":[ ], "concurso":1888, "data":1547258400000, "dtinclusao":1547333760000, "resultado_sorteio1":"08-29-43-14-28-31", "ganhadores_sena1":0, "valor_sena1":0.00, "acumulado_sena1":"1", "valor_acumulado_sena1":9007786.34, "resultado_sorteio2":"19-38-50-35-01-05", "ganhadores_sena2":0, "valor_sena2":0.00, "ganhadores_quina2":57, "valor_quina2":2333.74, "ganhadores_quadra2":2610, "valor_quadra2":64.71, "observacao":null, "ic_conferido":"1", "de_local_sorteio1":"Espaço Loterias Caixa", "no_cidade":"SÃO PAULO", "sg_uf":"SP", "valor_estimativa":9500000.00, "data_proximo_concurso":1547517600000, "vr_arrecadado":4870846.00, "qt_ganhador_quina_faixa1":37, "vr_quina_faixa1":3994.69, "qt_ganhador_quadra_faixa1":2070, "vr_quadra_faixa1":81.60, "vr_acumulado_especial":11827119.18, "qt_ganhador_terno_faixa1":39468, "vr_terno_faixa1":2.13, "qt_ganhador_terno_faixa2":45159, "vr_terno_faixa2":1.87, "ic_concurso_especial":false, "error":false, "acumulado":true, "previaNormal":false, "previaEspecial":false, "ganhadoresPorRegiao1":[ ], "ganhadoresPorRegiao2":[ ], "resultadoOrdenadoSorteio1":"08-14-28-29-31-43", "resultadoOrdenadoSorteio2":"01-05-19-35-38-50", "data_proximo_concursoStr":"15/01/2019", "dataStr":"12/01/2019", "descricaoLocalSorteio":"Espaço Loterias Caixa" }
  16. No exemplo, acima o navegador é firefox, mas o mesmo ocorre pra Chrome, lá, o nome é "Inspecionar", ao invés de "Inspecionar elemento".
  17. Pra descobrir o json pra os outros jogos é bem fácil, faça isto: No navegador, no site do hoje, onde mostra os resultados, vc faz isto: Clique com o botão direito, e clique em "Inspecionar elemento", em seguida, clique na guia "Network", em seguida, clique na guia XHR, agora, pra vc ver a url é bem simples, clique no site da página, em um dos botões, anterior ou próximo, quando vc clica, aparecerá lá no "XHR", a url do json. Por exemplo, pra a dupla sena é: http://loterias.caixa.gov.br/wps/portal/loterias/landing/duplasena/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbwMPI0sDBxNXAOMwrzCjA2cDIAKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wNnUwNHfxcnSwBgIDUyhCvA5EawAjxsKckMjDDI9FQGgnyPS/dl5/d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0I280A4EP2VJV30N4/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=1547413528911&amp;concurso=1888 Se vc quiser pegar somente o último resultado, vc limpa o número após "concurso=", no exemplo acima, vc retiraria 1888. Quando vc faz isto, vc tem o resultado do último concurso, mas e a url dos outro concursos, bem simples, vc pega o número do último concurso retorna pelo json. Então, vc pode fazer um for de 1 ao último concurso, simplesmente, substituindo o número do concurso pelo valor da variável do for. Eu programo em VBA, freepascal, delphi e outras linguagens.
×
×
  • Create New...