marcusesa / loteria-api

Api da loteria (Caixa Econômica Federal).
47 stars 22 forks source link

Problema na instalação da API Loterias #3

Closed rodbit closed 10 years ago

rodbit commented 10 years ago

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" ?>

``` wget $strParams \"$url\" -O $outputFile ```

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!

rodbit commented 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;
}

}

rodbit commented 10 years ago

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!!!!

marcusesa commented 10 years ago

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.

marcusesa commented 10 years ago

@rodbit por enquanto não temos essas funcionalidades. Mas ficaríamos felizes com uma contribuição.

rodbit commented 10 years ago

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 " ". Além disso, tive que acrescentar o php nos comandos <exec command=, ficando assim, por exemplo:

rodbit commented 10 years ago

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;
}

}

rodbit commented 10 years ago

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 ???

marcusesa commented 10 years ago

Um Content negotiation seria bem vindo, mas por enquanto só entregamos json.