Skip to content

Commit

Permalink
Merge pull request #5 from dadosjusbr/erro-de-coleta
Browse files Browse the repository at this point in the history
retornando status 4
  • Loading branch information
joellensilva authored Sep 19, 2024
2 parents acd2bb7 + 8b05665 commit 8c700b0
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 21 deletions.
31 changes: 20 additions & 11 deletions crawler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import (
"log"
"os"
"path/filepath"
"strings"
"time"

"github.com/chromedp/cdproto/browser"
"github.com/chromedp/chromedp"
"github.com/dadosjusbr/status"
)

type crawler struct {
Expand Down Expand Up @@ -48,26 +50,26 @@ func (c crawler) crawl() ([]string, error) {
// Contracheque
log.Printf("Realizando seleção (%s/%s)...", c.month, c.year)
if err := c.abreCaixaDialogo(ctx, "contra"); err != nil {
log.Fatalf("Erro no setup:%v", err)
status.ExitFromError(err)
}
log.Printf("Seleção realizada com sucesso!\n")
cqFname := c.downloadFilePath("contracheque")
log.Printf("Fazendo download do contracheque (%s)...", cqFname)
if err := c.exportaPlanilha(ctx, cqFname); err != nil {
log.Fatalf("Erro fazendo download do contracheque: %v", err)
status.ExitFromError(err)
}
log.Printf("Download realizado com sucesso!\n")

// Indenizações
log.Printf("Realizando seleção (%s/%s)...", c.month, c.year)
if err := c.abreCaixaDialogo(ctx, "inde"); err != nil {
log.Fatalf("Erro no setup:%v", err)
status.ExitFromError(err)
}
log.Printf("Seleção realizada com sucesso!\n")
iFname := c.downloadFilePath("verbas-indenizatorias")
log.Printf("Fazendo download das indenizações (%s)...", iFname)
if err := c.exportaPlanilha(ctx, iFname); err != nil {
log.Fatalf("Erro fazendo download dos indenizações: %v", err)
status.ExitFromError(err)
}
log.Printf("Download realizado com sucesso!\n")

Expand Down Expand Up @@ -97,7 +99,7 @@ func (c crawler) abreCaixaDialogo(ctx context.Context, tipo string) error {
concatenated = fmt.Sprintf("%s%s%s", baseURL, c.year, c.month)
}

return chromedp.Run(ctx,
if err := chromedp.Run(ctx,
chromedp.Navigate(concatenated),
chromedp.Sleep(c.timeBetweenSteps),

Expand All @@ -117,7 +119,14 @@ func (c crawler) abreCaixaDialogo(ctx context.Context, tipo string) error {
browser.SetDownloadBehavior(browser.SetDownloadBehaviorBehaviorAllowAndName).
WithDownloadPath(c.output).
WithEventsEnabled(true),
)
); err != nil {
if strings.Contains(err.Error(), "could not set value on node") {
return status.NewError(status.DataUnavailable, err)
} else {
return status.NewError(status.Unknown, err)
}
}
return nil
}

// exportaPlanilha clica no botão correto para exportar para excel, espera um tempo para download renomeia o arquivo.
Expand All @@ -139,10 +148,10 @@ func (c crawler) exportaPlanilha(ctx context.Context, fName string) error {
<-done

if err := nomeiaDownload(c.output, fName); err != nil {
return fmt.Errorf("erro renomeando arquivo (%s): %v", fName, err)
return status.NewError(status.SystemError, fmt.Errorf("erro renomeando arquivo (%s): %v", fName, err))
}
if _, err := os.Stat(fName); os.IsNotExist(err) {
return fmt.Errorf("download do arquivo de %s não realizado", fName)
return status.NewError(status.SystemError, fmt.Errorf("download do arquivo de %s não realizado", fName))
}
return nil
}
Expand All @@ -153,15 +162,15 @@ func nomeiaDownload(output, fName string) error {
// Identifica qual foi o ultimo arquivo
files, err := os.ReadDir(output)
if err != nil {
return fmt.Errorf("erro lendo diretório %s: %v", output, err)
return status.NewError(status.SystemError, fmt.Errorf("erro lendo diretório %s: %v", output, err))
}
var newestFPath string
var newestTime int64 = 0
for _, f := range files {
fPath := filepath.Join(output, f.Name())
fi, err := os.Stat(fPath)
if err != nil {
return fmt.Errorf("erro obtendo informações sobre arquivo %s: %v", fPath, err)
return status.NewError(status.SystemError, fmt.Errorf("erro obtendo informações sobre arquivo %s: %v", fPath, err))
}
currTime := fi.ModTime().Unix()
if currTime > newestTime {
Expand All @@ -171,7 +180,7 @@ func nomeiaDownload(output, fName string) error {
}
// Renomeia o ultimo arquivo modificado.
if err := os.Rename(newestFPath, fName); err != nil {
return fmt.Errorf("erro renomeando último arquivo modificado (%s)->(%s): %v", newestFPath, fName, err)
return status.NewError(status.SystemError, fmt.Errorf("erro renomeando último arquivo modificado (%s)->(%s): %v", newestFPath, fName, err))
}
return nil
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (

require (
github.com/chromedp/sysutil v1.0.0 // indirect
github.com/dadosjusbr/status v0.0.0-20230428151814-b605fe0e598f
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.1.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ github.com/chromedp/chromedp v0.7.6 h1:2juGaktzjwULlsn+DnvIZXFUckEp5xs+GOBroaea+
github.com/chromedp/chromedp v0.7.6/go.mod h1:ayT4YU/MGAALNfOg9gNrpGSAdnU51PMx+FCeuT1iXzo=
github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic=
github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww=
github.com/dadosjusbr/status v0.0.0-20230428151814-b605fe0e598f h1:MHtPcEeoJ4CCOvFDzvYXU2AndoqiIvZdrOjWACaImLA=
github.com/dadosjusbr/status v0.0.0-20230428151814-b605fe0e598f/go.mod h1:7M8ds2L3u+rHuiP+IImNTx7bSlIUz6hXzW0ZTBOeHzw=
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
Expand Down
21 changes: 11 additions & 10 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,31 @@ package main

import (
"fmt"
"log"
"os"
"strconv"
"strings"
"time"

"github.com/dadosjusbr/status"
)

type confSpec struct {
Month string
}

const (
defaultGeneralTimeout = 4 * time.Minute // Duração máxima total da coleta de todos os arquivos. Valor padrão calculado a partir de uma média de execuções ~4.5min
defaulTimeBetweenSteps = 15 * time.Second //Tempo de espera entre passos do coletor."
defaultGeneralTimeout = 4 * time.Minute // Duração máxima total da coleta de todos os arquivos. Valor padrão calculado a partir de uma média de execuções ~4.5min
defaulTimeBetweenSteps = 15 * time.Second //Tempo de espera entre passos do coletor."
)

func main() {
if _, err := strconv.Atoi(os.Getenv("MONTH")); err != nil {
log.Fatalf("Invalid month (\"%s\"): %q", os.Getenv("MONTH"), err)
status.ExitFromError(status.NewError(status.InvalidParameters, fmt.Errorf("invalid month (\"%s\"): %q", os.Getenv("MONTH"), err)))
}
month := os.Getenv("MONTH")

if _, err := strconv.Atoi(os.Getenv("YEAR")); err != nil {
log.Fatalf("Invalid year (\"%s\"): %q", os.Getenv("YEAR"), err)
status.ExitFromError(status.NewError(status.InvalidParameters, fmt.Errorf("invalid year (\"%s\"): %q", os.Getenv("YEAR"), err)))
}
year := os.Getenv("YEAR")

Expand All @@ -35,15 +36,15 @@ func main() {
}

if err := os.Mkdir(outputFolder, os.ModePerm); err != nil && !os.IsExist(err) {
log.Fatalf("Error creating output folder(%s): %q", outputFolder, err)
status.ExitFromError(status.NewError(status.InvalidParameters, fmt.Errorf("error creating output folder(%s): %q", outputFolder, err)))
}

generalTimeout := defaultGeneralTimeout
if os.Getenv("GENERAL_TIMEOUT") != "" {
var err error
generalTimeout, err = time.ParseDuration(os.Getenv("GENERAL_TIMEOUT"))
if err != nil {
log.Fatalf("Invalid GENERAL_TIMEOUT (\"%s\"): %q", os.Getenv("GENERAL_TIMEOUT"), err)
status.ExitFromError(status.NewError(status.InvalidParameters, fmt.Errorf("invalid GENERAL_TIMEOUT (\"%s\"): %q", os.Getenv("GENERAL_TIMEOUT"), err)))
}
}

Expand All @@ -52,7 +53,7 @@ func main() {
var err error
timeBetweenSteps, err = time.ParseDuration(os.Getenv("TIME_BETWEEN_STEPS"))
if err != nil {
log.Fatalf("Invalid TIME_BETWEEN_STEPS (\"%s\"): %q", os.Getenv("TIME_BETWEEN_STEPS"), err)
status.ExitFromError(status.NewError(status.InvalidParameters, fmt.Errorf("invalid TIME_BETWEEN_STEPS (\"%s\"): %q", os.Getenv("TIME_BETWEEN_STEPS"), err)))
}
}
c := crawler{
Expand All @@ -64,10 +65,10 @@ func main() {
}
downloads, err := c.crawl()
if err != nil {
log.Fatalf("Error crawling (%s, %s, %s): %v", year, month, outputFolder, err)
status.ExitFromError(status.NewError(status.OutputError, fmt.Errorf("error crawling (%s, %s, %s): %v", year, month, outputFolder, err)))
}

// O parser do MPRO espera os arquivos separados por \n. Mudanças aqui tem que
// refletir as expectativas lá.
fmt.Println(strings.Join(downloads, "\n"))
}
}

0 comments on commit 8c700b0

Please sign in to comment.