Overview

sesc.py

O sesc.py é um script em python que mostra o cardápio para o dia atual ou da semana dos restaurantes do SESC.

Ele busca um novo cardápio no site do SESC, baixa esse cardápio em PDF, processa esse arquivo e, através de expressões regulares, extrai os cardápios para cada dia. Os dados são salvos em um arquivo JSON para que novas consultas possam ser feitas instantaneamente e sem acesso a internet.

Disclaimer

Esse é um programa independente, não possuindo nenhuma relação oficial com o SESC nem tenho a permissão de uso do nome ou da marca.

Requerimentos

  • Python 2.7 (Talvez funcione com versões mais antigas, porém não funcioná com a versão 3)
  • PDFMiner

Como usar

Basta executar o script em linha de comando:

$ python sesc.py

Ou você pode dar permissões de execução ao script: $ chmod +x sesc.py $ ./sesc.py

Ou, se você colocou o script no path:

$ sesc.py

Se você utiliza Ubuntu, pode colocar o script em ~/bin, pois essa pasta também está no path do sistema.

Para ver as opções disponíveis utiliza a opção -h

$ sesc.py -h

Opções avançadas

Você pode configurar a execução do sesc.py através de opções na linha de comando:

  • -a, --all: Exibe o cardápio para todos os dias;
  • -c, --clean: Limpa o cache antes de buscar o cardápio;
  • -d, --day=day: Exibe cardápio para um dia específica;
  • -g, --gui: Exibe o cardápio em uma janela. Não é compatível com a opção "-a".
  • --guser=username: Configura o nome de usuário do gmail para o envio de e-mail.
  • --gpass=senha: Configura a senha de aplicativo do gmail para o envio de e-mail.
  • -h, --help: Exibe esta ajuda.
  • -n, --notify=lista: Lista de e-mails, separados por ponto e vírgula, a serem notificados do menu.
  • -p, --path=caminho: Caminho onde armazenar os arquivos, padrão "/home/rjfonseca/.sesc".
  • -q, --quiet: Modo silencioso. Não exibe mensagens intermediárias.
  • -u, --unit=unidade: Unidade do SESC, padrão unidade de "pinheiros". Unidades cadastradas: pinheiros
  • -v, --version: Exibe a versão do programa.

Atenção: Para que funcione o recurso de aviso por e-mail, é necessário que as três opções - guser, gpass e notify - tenham sido configuradas. Além disso, gpass não é a senha normal de usuário do e-mail mas uma senha de aplicativo criada para esse fim.

Execução automática

É possível agendar o script para exibir, em uma janela, o cardápio do dia em horários específicos. Por exemplo, para exibir o cardápio todos os dias da semana as 11 horas da manhã:

Usando o cron no Linux:

$ crontab -e

Adicione no final do arquivo a linha:

0 11 * * 1-5 export DISPLAY=:0 && /usr/bin/python /caminho/para/onde/está/o/script/sesc.py -g

No Windows também é possível agendar a execução do script utilizando o Agendador de tarefas

Testado em

  • Ubuntu 13.04 64bit
  • Windows 8 64bit

Como o pdfminer é escrito inteiramente em python (compatível com python 2.4 ou mais recente) essa solução deve funcionar em qualquer máquina com um interpretador python instalado.

Limitações

  • Somente a unidade de Pinheiros do SESC está registrada no script nesse momento;
  • Não foi testado um cardápio contenha dois anos diferentes. É possível que essa situação causará um erro no script;

Desenvolvimento

O comportamento padrão do sesc.py pode ser alterado modificando-se as variáveis no início do script:

default_unit = 'pinheiros'
default_home = join(expanduser("~"),'.sesc')
default_keep = False
cache_filename = 'cache.json'
  • default_unit: unidade padrão que será carregada se nenhuma for fornecida através da linha de comando;
  • default_home: Local padrão onde os arquivos serão armazenados;
  • default_keep: Se verdadeiro, não remove o arquivo PDF após processá-lo. A alteração desse valor muda o comportamento da opção '-k';
  • cache_filename: Nome do arquivo de cache local;

Para se adicionar novas unidades, basta colocá-las no dicionário sesc_unit.

sesc_unit = {
    'pinheiros' : {
        'url'     : 'http://www.sescsp.org.br/sesc/busca/index.cfm?unidadesdirector=57#',
        'pdf'     : r'(?i).*?card.+?pio.*?',
        'entries' : r'^.?\d\d\s•.+?(?=\n\n)',
        'day'     : r'(?P<day>\d\d?)\s',
        'menus'   : r'brasileirinho\s*?\n((?:.|\n)+?)\nfog.*?o\scultural\s*\n((?:.|\n)+)'
    }
}
  • url: Endereço web da unidade;
  • pdf: Expressão regular para extrair o endereço para download do PDF da página da unidade. Essa expressão será usada para comparar com o conteúdo da tag a, caso sejá compatível, será extraído o link dessa tag. Em caso de mais de um resultado, será sempre considerado o último;
  • entries: Expressão regular para extrair as entradas diárias no cardápio;
  • day: Expressão regular para extrair o dia específico. É obrigatória a presença de um grupo chamado day na expressão, do qual será extraído o dia;
  • menus: Expressão regular para extrair uma lista com o cardápio do dia;

Atenção: Use parênteses para capturar os grupos nas expressões regulares que contêm a informação desejada. O script usará esses grupos para extrair os dados.

Mais informações

Para mais informações, reportar erros ou obter novas versões do script acesse a página do projeto.

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.