Closed rodbit closed 10 years ago
Consegui fazer funcionar, com a alteração do arquivo Downloader.php:
<?php namespace Kodify\DownloaderBundle\Service;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
class Downloader { public function downloadFile($url, $path, $destinationFileName, $params = array(), $escapeShellCmd = true) { if (empty($path) || empty($url) || empty($destinationFileName)) { throw new \InvalidArgumentException('Wrong arguments'); }
if ($this->pathShouldBeCreated($path)) {
if ($this->pathCanBeCreated($path)) {
mkdir($path, 0777, true);
} else {
throw new FileException('Path can not be created');
}
}
if (is_writable(dirname($path))) {
$outputFile = $path . $destinationFileName;
if ($escapeShellCmd) {
$url = escapeshellcmd($url);
$outputFile = escapeshellcmd($outputFile);
}
$strParams = '';
if (is_array($params) && !empty($params)) {
foreach ($params as $value) {
$strParams .= $value . ' ';
}
}
$cmd = "wget $strParams \"$url\" -O $outputFile";
exec($cmd);
//Windows and OS without wget
if(!file_exists($outputFile)) {
//file_put_contents($outputFile, fopen($url, 'r'));
}
//if (0 == filesize($outputFile)) {
//throw new FileException('Void file downloaded');
//}
} else {
throw new FileException('Path is not writable');
}
}
public function pathShouldBeCreated($path)
{
return !is_dir($path);
}
public function pathCanBeCreated($path)
{
if (is_dir(dirname($path)) && is_writable(dirname($path))) {
return true;
} else {
if (!is_dir(dirname($path)) && $path != '/') {
return $this->pathCanBeCreated(dirname($path));
}
}
return false;
}
}
Marcus, como faço para acrescentar as outras loterias, tais como dupla sena, timemania, loteca e lotogol?
E para acrescentar uma coluna na mega sena, com o acumulado para a "Mega da Virada"?
Muito obrigado!!!!
Ola @rodbit, obrigado por contribuir com o projeto.
Com relação ao build.xml oque você precisou alterar?
Sobre o erro que esta acontecendo me parece que é em uma biblioteca terceira que esta no vendor kodify/downloader
. Na linha 41 ele cai na condição ao verificar que o wget
não funcionou e em seguida da erro ao usar a função fopen.
Como nós não podemos alterar as bibliotecas do vendor de imediato, podemos tentar algumas estratégias provisorias. Instalar o wget no Windows, ou usar outro SO com wget.
Posteriormente temos que enviar um pull request para eles ou usar outra lib.
@rodbit por enquanto não temos essas funcionalidades. Mas ficaríamos felizes com uma contribuição.
Hummm... legal, vou ver se consigo contribuir então, para acrescentar estas e outras funcionalidades. Depois envio para você. Quanto ao build.xml, eu tive que alterar o comando do wget para "
E alterei o arquivo Downloader.php contido no endereço LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service para o seguinte, daí aqueles erros pararam de acontecer:
<?php namespace Kodify\DownloaderBundle\Service;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
class Downloader { public function downloadFile($url, $path, $destinationFileName, $params = array(), $escapeShellCmd = true) { if (empty($path) || empty($url) || empty($destinationFileName)) { throw new \InvalidArgumentException('Wrong arguments'); }
if ($this->pathShouldBeCreated($path)) {
if ($this->pathCanBeCreated($path)) {
mkdir($path, 0777, true);
} else {
throw new FileException('Path can not be created');
}
}
if (is_writable(dirname($path))) {
$outputFile = $path . $destinationFileName;
if ($escapeShellCmd) {
$url = escapeshellcmd($url);
$outputFile = escapeshellcmd($outputFile);
}
$strParams = '';
if (is_array($params) && !empty($params)) {
foreach ($params as $value) {
$strParams .= $value . ' ';
}
}
$cmd = "wget $strParams \"$url\" -O $outputFile";
exec($cmd);
//Windows and OS without wget
if(!file_exists($outputFile)) {
//file_put_contents($outputFile, fopen($url, 'r'));
}
//if (0 == filesize($outputFile)) {
//throw new FileException('Void file downloaded');
//}
} else {
throw new FileException('Path is not writable');
}
}
public function pathShouldBeCreated($path)
{
return !is_dir($path);
}
public function pathCanBeCreated($path)
{
if (is_dir(dirname($path)) && is_writable(dirname($path))) {
return true;
} else {
if (!is_dir(dirname($path)) && $path != '/') {
return $this->pathCanBeCreated(dirname($path));
}
}
return false;
}
}
Agora, uma última pergunta: como faço para que a API me entregue um resultado em xml e não json quando usar o ?loteria=megasena ???
Um Content negotiation seria bem vindo, mas por enquanto só entregamos json.
Marcus, tudo bem? Primeiramente, gostaria de agradecer pela API, apesar de ainda não conseguir fazê-la funcionar. Mas, se Deus quiser, logo consigo, rs... (não sou familiarizado a programação nenhuma, principalmente em PHP, Github etc, mas estou estudando pela internet autodidaticamente).
Eu consegui instar o WAMP. Além disso, instalei também o PHP 5.514 (php-5.5.14-Win32-VC11-x64), o Apache (httpd-2.4.10-win64-VC11) e o MySQL.
Consegui alguns progressos ao tentar instalar a sua API (em C:\LoteriaApi). Porém, tive que modificar o build.xml, pois, caso contrário, não funcionava (veja abaixo o arquivo com minhas modificações):
<?xml version="1.0" encoding="UTF-8" ?>
Entretanto, quando executo o php bin/consumer, dá o seguinte erro na última tarefa (Load Datasources):
[22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Warning: fopen(http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip): failed to open stream: Redirection limit reached, aborting in C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php on line 42 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Stack trace: [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 1. {main}() C:\LoteriaApi\bin\consumer:0 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 2. LoteriaApi\Consumer\Download->run() C:\LoteriaApi\bin\consumer:30 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 3. Kodify\DownloaderBundle\Service\Downloader->downloadFile() C:\LoteriaApi\src\LoteriaApi\Consumer\Download.php:38 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 4. fopen() C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php:42 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Warning: file_put_contents(C:^\LoteriaApi^\var^\zip^\megasena.zip): failed to open stream: No such file or directory in C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php on line 42 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Stack trace: [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 1. {main}() C:\LoteriaApi\bin\consumer:0 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 2. LoteriaApi\Consumer\Download->run() C:\LoteriaApi\bin\consumer:30 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 3. Kodify\DownloaderBundle\Service\Downloader->downloadFile() C:\LoteriaApi\src\LoteriaApi\Consumer\Download.php:38 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 4. file_put_contents() C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php:42 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Warning: filesize(): stat failed for C:^\LoteriaApi^\var^\zip^\megasena.zip in C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php on line 45 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Stack trace: [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 1. {main}() C:\LoteriaApi\bin\consumer:0 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 2. LoteriaApi\Consumer\Download->run() C:\LoteriaApi\bin\consumer:30 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 3. Kodify\DownloaderBundle\Service\Downloader->downloadFile() C:\LoteriaApi\src\LoteriaApi\Consumer\Download.php:38 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP 4. filesize() C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php:45 [22-Jul-2014 12:33:31 America/Sao_Paulo] PHP Fatal error: Uncaught exception 'Symfony\Component\HttpFoundation\File\Exception\FileException' with message 'Void file downloaded' in C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php:46 Stack trace:
0 C:\LoteriaApi\src\LoteriaApi\Consumer\Download.php(38): Kodify\DownloaderBundle\Service\Downloader->downloadFile('http://www1.cai...', 'C:\LoteriaApi\v...', 'megasena.zip')
1 C:\LoteriaApi\bin\consumer(30): LoteriaApi\Consumer\Download->run()
2 {main}
thrown in C:\LoteriaApi\vendor\kodify\downloader\Kodify\DownloaderBundle\Service\Downloader.php on line 46
Você tem alguma ideia de como resolver o problema do fopen?
Obrigado!