lecourrier-daily/main.go
2025-11-29 21:42:30 +01:00

152 lines
3.4 KiB
Go

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!")
}