package main import ( "path/filepath" "time" "git.readonly.ch/bouzoure/lecourrier-daily/helpers" "github.com/playwright-community/playwright-go" ) func main() { urlMainPage := "https://lecourrier.ch" urlDownload := "https://lecourrier.ch/edition-du-jour/" sleepAfterLogin := 5 log := helpers.GetLogger() log.Info("Welcome!") config, err := helpers.GetConfig() if err != nil { log.Fatal(err) } installOptions := playwright.RunOptions{ Browsers: []string{"firefox"}, Verbose: false, } log.Info("Installing headless firefox (if needed)") err = playwright.Install(&installOptions) if err != nil { log.Fatal(err) } options := playwright.BrowserTypeLaunchOptions{ Headless: playwright.Bool(!config.Debug.DisableHeadless), } log.Info("Starting playwright") pw, err := playwright.Run() if err != nil { log.Fatalf("could not start playwright: %v", err) } log.Info("Starting headless firefox") browser, err := pw.Firefox.Launch(options) if err != nil { log.Fatalf("could not launch browser: %v", err) } log.Info("Creating new page") page, err := browser.NewPage() if err != nil { log.Fatalf("could not create page: %v", err) } log.Infof("Navigating to %s", urlMainPage) if _, err = page.Goto(urlMainPage); err != nil { log.Fatalf("could not goto: %v", err) } log.Info("Waiting for cookie popup") for { count, err := page.Locator(".cmplz-accept").Count() if err == nil && count > 0 { break } } log.Info("Accepting cookies") if err = page.Locator(".cmplz-accept").Click(); err != nil { log.Fatalf("could not click: %v", err) } log.Info("Opening login box") if err = page.Locator("#undefined-1 button").Click(); err != nil { log.Fatalf("could not click: %v", err) } log.Info("Waiting for login form") for { count, err := page.Locator("form input[type=text]").Count() if err == nil && count > 0 { break } } log.Info("Filling username") err = page.Locator("form input[type=text]").Fill(config.Website.Username) if err != nil { log.Fatal(err) } log.Info("Filling password") err = page.Locator("form input[type=password]").Fill(config.Website.Password) if err != nil { log.Fatal(err) } log.Info("Logging in") err = page.GetByRole(*playwright.AriaRoleButton, playwright.PageGetByRoleOptions{ Name: "Se connecter", }).Click() if err != nil { log.Fatalf("could not click: %v", err) } log.Infof("Waiting %d seconds", sleepAfterLogin) time.Sleep(time.Duration(sleepAfterLogin) * time.Second) log.Infof("Navigating to %s", urlDownload) _, err = page.Goto(urlDownload) if err != nil { log.Fatal(err) } log.Info("Waiting for download button") for { count, err := page.Locator("#download-pdf-hover").Count() if err == nil && count > 0 { break } } log.Info("Clicking download button and expecting download") download, err := page.ExpectDownload(func() error { return page.Locator("#download-pdf-hover").Click() }) if err != nil { log.Fatal(err) } location := filepath.Join(config.DownloadLocation, download.SuggestedFilename()) log.Info("Saving PDF", "location", location) err = download.SaveAs(location) if err != nil { log.Fatal(err) } log.Info("Closing browser and stopping playwright") if err = browser.Close(); err != nil { log.Fatalf("could not close browser: %v", err) } if err = pw.Stop(); err != nil { log.Fatalf("could not stop Playwright: %v", err) } log.Info("Goodbye!") }