Um algoritmo com IA em PHP que eu fiz para usar os resultados antigos da caixa e gerar apostas baseado no suposto princípio de que os números tendem a igualar a quantidade de ocorrências ao longo do tempo:
<?php
// http://loterias.caixa.gov.br/wps/portal/loterias/landing/megasena
ini_set('display_errors', true);
error_reporting(E_ERROR ^ E_DEPRECATED);
set_time_limit(999999);
$url = 'http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip';
$pasta = 'dat';
$file = 'configuracoes.php';
$qtd_jogos = 0;
$qtd_apostas = 1;
$numeros_por_jogo = 6;
$total = 60;
$erros = [];
$ocorrencias = [];
if (!$_GET)
{
if (file_exists($pasta . "/" . $file))
{
require($pasta . "/" . $file);
}
}
else
{
$url = $_GET['url'];
$qtd_apostas = max($_GET['qtd_apostas'], 1);
$numeros_por_jogo = max($_GET['numeros_por_jogo'], 6);
$qtd_premios_acumulados = 0;
$qtd_ganhadores = 0;
if (!is_dir($pasta))
{
if (!mkdir($pasta))
{
$erros[] = 'Falha ao criar o diretorio para guardar os arquivos da Caixa Economica';
}
}
if (is_dir($pasta))
{
$conteudo_arquivo_configuracoes =
'<?php' . PHP_EOL .
'$url = "' . $url . '";' . PHP_EOL .
'$qtd_apostas = ' . $qtd_apostas . ';' . PHP_EOL .
'$numeros_por_jogo = ' . $numeros_por_jogo . ';' . PHP_EOL .
'?>';
if (!file_put_contents($pasta . "/" . $file, $conteudo_arquivo_configuracoes))
{
$erros[] = 'Falha ao gravar as configuracoes';
}
}
$numeros_validos = [];
for ($x = 1; $x <= $total; $x++)
{
$numero = sprintf("%0" . strlen($total) . "d", $x);
$ocorrencias[$numero] = 0;
$numeros_validos[] = $numero;
}
if (function_exists('curl_init'))
{
$useragent = $_SERVER['HTTP_USER_AGENT'];
$timeout = 120;
$dir = dirname(__FILE__);
$cookie_file = $dir . '/cookies/' . md5($_SERVER['REMOTE_ADDR']) . '.txt';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/');
$content = curl_exec($ch);
if (curl_errno($ch))
{
$erros[] = 'Falha ao consultar o arquivo zip. Erro CURL: "' . curl_error($ch) . '"';
}
curl_close($ch);
}
else
{
$erros[] = 'O PHP não consegue extrair os arquivos da caixa';
}
if (isset($content))
{
file_put_contents($pasta . "/html.zip", $content);
$zip = new ZipArchive();
$ok_zip = $zip->open($pasta . "/html.zip");
if ($ok_zip)
{
$zip->extractTo($pasta . "/zip");
$entradas = scandir($pasta . "/zip");
foreach ($entradas as $entrada)
{
if ($entrada == "." || $entrada == "..")
{
continue;
}
if (is_file($pasta . "/zip/" . $entrada))
{
if (strtolower(substr($entrada, -4)) == '.htm')
{
$html = file_get_contents($pasta . "/zip/" . $entrada);
}
unlink($pasta . "/zip/" . $entrada);
}
if (is_dir($pasta . "/zip/" . $entrada))
{
rmdir($pasta . "/zip/" . $entrada);
}
}
rmdir($pasta . "/zip");
}
else
{
$erros[] = 'O arquivo ZIP é inválido';
}
$zip->close();
}
else
{
$erros[] = 'O arquivo ZIP está vazio';
}
if (isset($html))
{
$dom_html = new DOMDocument();
$dom_html->loadHTML($html);
$dom_tables = $dom_html->getElementsByTagName('table');
$tabela_invalida = false;
foreach ($dom_tables as $dom_table)
{
$dom_trs = $dom_table->getElementsByTagName('tr');
foreach ($dom_trs as $indice_linha => $dom_tr)
{
if (!$indice_linha)
{
$dom_ths = $dom_table->getElementsByTagName('th');
foreach ($dom_ths as $indice_coluna => $dom_th)
{
switch ($indice_coluna)
{
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
if ($dom_th->textContent != ($indice_coluna - 1) . 'ª Dezena')
{
$tabela_invalida = true;
}
break;
case 9:
if ($dom_th->textContent != 'Ganhadores_Sena')
{
$tabela_invalida = true;
}
}
}
}
else
{
$dom_tds = $dom_tr->getElementsByTagName('td');
if (count($dom_tds) != count($dom_ths))
{
continue;
}
$qtd_jogos++;
foreach ($dom_tds as $indice_coluna => $dom_td)
{
switch ($indice_coluna)
{
case 1:
$data_primeiro_jogo = isset($data_primeiro_jogo) ? $data_primeiro_jogo : $dom_td->textContent;
$data_ultimo_jogo = $dom_td->textContent;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
$numero_sorteado = $dom_td->textContent;
if (!in_array($numero_sorteado, $numeros_validos))
{
die('O numero sorteado ' . $numero_sorteado . ' é invalido, concurso ' . ($indice_linha + 1) . ', ' . ($indice_coluna + 1) . '° numero');
}
$ocorrencias[$numero_sorteado]++;
break;
case 9:
if ($dom_td->textContent == '0')
{
$qtd_premios_acumulados++;
}
else
{
$qtd_ganhadores += (int)$dom_td->textContent;
}
break;
}
}
}
}
if ($tabela_invalida)
{
continue;
}
}
}
else
{
$erros[] = 'O arquivo HTML não foi localizado no ZIP';
}
if (!$ocorrencias)
{
$erros[] = 'Nenhum resultado foi encontrado';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>MEGASENA</title>
<meta charset="utf-8">
<meta author="danniel.df@hotmail.com.br">
<style type="text/css">
body
{
color: #555;
font-family: verdana, sans-serif;
font-size: 10px;
text-align: center;
background: #fefffe;
width: 50em;
margin: auto;
}
label
{
padding-bottom: 1em;
display: block;
}
p
{
text-align: center;
padding: 1em;
font-style: italic;
display: flex;
justify-content: center;
}
h1
{
cursor: pointer;
color: #096;
}
ul
{
display: inline-block;
text-align: left;
}
#form
{
background-color: #096;
color: #fff;
font-style: italic;
font-weight: bold;
margin: 0 auto 1em auto;
padding: 1em;
}
#erros
{
border: solid 1px #ffa5a5;
background-color: #ffbeb8;
padding: 1em;
margin: 0 auto 1em auto;
}
#url
{
width: 30em;
}
#qtd
{
width: 3em;
}
#btn
{
border: solid 1px gray;
padding: 0.5em 5em;
margin-top: 1em;
}
#ocorrencias
{
display: flex;
flex-wrap: wrap;
justify-content: center;
background-color: #fbfbdf;
padding: 1em;
margin: 0 auto 1em auto;
}
#ocorrencias div
{
border: solid 1px #a00;
color: #a00;
background-color: #fff;
padding: .5em;
margin-right: .5em;
margin-bottom: .5em;
}
</style>
</head>
<body onload="history.pushState('', '', '', '');">
<h1 onclick="location.assign('.');" title="recarregar">
MEGASENA
</h1>
<div id="form">
<label style="display: block">
URL da Caixa com o ZIP de todos resultados:<br/>
<input type="text" id="url" value="<?php echo $url; ?>" style="text-align: center"/>
</label>
<label style="display: block">
Quantidade de Jogos:<br/>
<input type="number" id="qtd_apostas" value="<?php echo $qtd_apostas; ?>" min="1" step="1" style="width: 3em; text-align: center"/>
</label>
<label style="display: block">
Quantidade de Números por Jogo:<br/>
<input type="number" id="numeros_por_jogo" value="<?php echo $numeros_por_jogo; ?>" min="6" max="15" size="3" step="1" style="width: 3em; text-align: center"/>
</label>
<input
type="button"
id="btn"
value="Processar"
onclick="location.assign('?url=' + document.getElementById('url').value + '&qtd_apostas=' + document.getElementById('qtd_apostas').value + '&numeros_por_jogo=' + document.getElementById('numeros_por_jogo').value);"
/>
</div>
<?php
if ($erros)
{
echo '<div id="erros"><ul>';
foreach ($erros as $erro)
{
echo '<li>' . $erro . '</li>';
}
echo '</ul></div>';
}
if ($ocorrencias)
{
echo
'<p><b>qtd de ocorrências de cada número:</b></p>' .
'<div id="ocorrencias">';
$ocorrencias_ordenadas = [];
foreach ($ocorrencias as $numero => $qtd_ocorrencias)
{
if (!isset($ocorrencias_ordenadas[$qtd_ocorrencias]))
{
$ocorrencias_ordenadas[$qtd_ocorrencias] = [];
}
array_push($ocorrencias_ordenadas[$qtd_ocorrencias], $numero);
}
ksort($ocorrencias_ordenadas);
echo '<table><tr><th>Ocorrências</th><th>Números</th></tr>';
foreach ($ocorrencias_ordenadas as $qtd_ocorrencias => $numeros)
{
echo
'<tr>' .
'<td>' . $qtd_ocorrencias . '</td>' .
'<td>' .
implode(',', $numeros) .
'</td>' .
'</tr>';
}
echo '</table>';
echo
'</div>' .
'<p><b>demais estatísticas:</b></p>' .
'<ul>' .
'<li>Qtd de jogos: <b>' . $qtd_jogos . '</b></li>' .
'<li>Qtd de prêmios acumulados: <b>' . sprintf("%01.1f", $qtd_premios_acumulados * 100 / $qtd_jogos) . '%</b></li>' .
'<li>Qtd de ganhadores até hoje: <b>' . $qtd_ganhadores . '</b></li>' .
'<li>Qtd média de ganhadores por jogo: <b>' . sprintf("%01.2f", $qtd_ganhadores / $qtd_jogos) . '</b></li>' .
'<li>Data do primeiro jogo: <b>' . $data_primeiro_jogo . '</b></li>' .
'<li>Data do último jogo: <b>' . $data_ultimo_jogo . '</b></li>' .
'</ul>';
echo
'<div style="padding: 10px; background-color: #cbffaa; border: solid 1px #b9e9bb;">' .
'<strong style="display: block; text-align: center; margin-bottom: 30px;">' .
'Apostas sugeridas:' .
'</strong>';
if ($qtd_apostas && $numeros_por_jogo)
{
for ($jogo = 1; $jogo <= $qtd_apostas; $jogo++)
{
$numeros = range(1, $total);
while (count($numeros) > $numeros_por_jogo)
{
$total_ocorrencias = 0;
foreach ($ocorrencias as $numero => $ocorrencia)
{
$numero = (int)$numero;
if (in_array($numero, $numeros))
{
$total_ocorrencias += $ocorrencia;
}
}
$range_numero_eliminado = rand(1, $total_ocorrencias);
$total_ocorrencias = 0;
foreach ($ocorrencias as $numero => $ocorrencia)
{
$numero = (int)$numero;
$posicao = array_search($numero, $numeros);
if ($posicao !== false)
{
$total_ocorrencias += $ocorrencia;
if ($range_numero_eliminado <= $total_ocorrencias)
{
unset($numeros[$posicao]);
break;
}
}
}
}
echo "<div style='padding: 3px; margin-top: 5px;'> Jogo " . str_pad($jogo, strlen($qtd_apostas), "0", STR_PAD_LEFT) . ": ";
foreach ($numeros as $numero)
{
echo '<span style="padding: 3px; margin-right: 3px; background-color: white;">' . str_pad($numero, strlen($total), "0", STR_PAD_LEFT) . '</span>';
}
echo "</div>";
}
echo "<div style='text-align: center; font-weight: bold; font-family: garamound, sans-serif; font-size: 2.5em; color: #d31eac; padding: 15px;'>BOA SORTE!</div>";
}
else
{
echo '<div style="background: lightgray; color: orange; padding: 3px; text-align: center; border: solid 1px gray; font-weight: bold;">Não foram definidas as apostas</div>';
}
echo "</div><br/>";
}
?>
</body>
</html>