rssalchemy/cmd/extractor/extractor.go
2025-01-31 15:07:15 +03:00

103 lines
2.4 KiB
Go

package main
import (
"encoding/json"
"flag"
"github.com/egor3f/rssalchemy/internal/config"
dummycookies "github.com/egor3f/rssalchemy/internal/cookiemgr/dummy"
"github.com/egor3f/rssalchemy/internal/dateparser"
"github.com/egor3f/rssalchemy/internal/extractors/pwextractor"
"github.com/egor3f/rssalchemy/internal/models"
"github.com/labstack/gommon/log"
"io"
"os"
"time"
)
func main() {
log.SetLevel(log.DEBUG)
log.SetHeader(`${time_rfc3339_nano} ${level}`)
outFile := flag.String("o", "", "Output file name")
flag.Parse()
taskFileName := "task.json"
if flag.NArg() > 0 {
taskFileName = flag.Arg(0)
}
out := os.Stdout
if len(*outFile) > 0 {
var err error
out, err = os.OpenFile(*outFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
log.Panicf("open output file: %v", err)
}
//goland:noinspection GoUnhandledErrorResult
defer out.Close()
}
taskFile, err := os.Open(taskFileName)
if err != nil {
log.Panicf("open task file: %v", err)
}
//goland:noinspection GoUnhandledErrorResult
defer taskFile.Close()
fileContents, err := io.ReadAll(taskFile)
if err != nil {
log.Panicf("read file: %v", err)
}
var task models.Task
if err := json.Unmarshal(fileContents, &task); err != nil {
log.Panicf("unmarshal task: %v", err)
}
cfg, err := config.Read()
if err != nil {
log.Panicf("read config: %v", err)
}
pwe, err := pwextractor.New(pwextractor.Config{
Proxy: cfg.Proxy,
DateParser: &dateparser.DateParser{
CurrentTimeFunc: func() time.Time {
return time.Date(2025, 01, 10, 10, 00, 00, 00, time.UTC)
},
},
CookieManager: dummycookies.New(),
})
if err != nil {
log.Panicf("create pw extractor: %v", err)
}
defer func() {
if err := pwe.Stop(); err != nil {
log.Errorf("stop pw extractor: %v", err)
}
}()
result, err := pwe.Extract(task)
if err != nil {
log.Errorf("extract: %v", err)
scrResult, err := pwe.Screenshot(task)
if err != nil {
log.Errorf("screenshot failed: %v", err)
panic(err)
}
err = os.WriteFile("screenshot.png", scrResult.Image, 0600)
if err != nil {
log.Errorf("screenshot save failed: %v", err)
}
panic(err)
}
resultStr, err := json.MarshalIndent(result, "", "\t")
if err != nil {
log.Panicf("marshal result: %v", err)
}
n, err := out.Write(resultStr)
if err != nil {
log.Panicf("write output: %v", err)
}
log.Infof("Result written (%d bytes)", n)
}