Skip to content

holdude/TrumfScraper

Repository files navigation

Pris Scraper

Henter kvitteringsdata fra Trumf og bygger en varekatalog med priser fra norske dagligvarekjeder. Sammenlign priser, spor prisendringer, og del data anonymt med fellesskapet.

Funksjoner

  • Hent kvitteringer fra Trumf via automatisert innlogging (Playwright)
  • Prissammenligning mellom kjeder (Kiwi, Meny, Spar, m.fl.) med søk, filtrering og sortering
  • Prishistorikk — spor prisendringer over tid med interaktive grafer
  • Excel-eksport med filtrering og fargekoding
  • Fellesskapsdeling — del prisdata anonymt via delt database (Cloudflare D1)
  • Auto-oppdatering — appen sjekker for nye versjoner automatisk
  • Web-UI — lokal nettside som åpnes i nettleseren, ingen terminal nødvendig

Nedlasting

Last ned siste versjon fra Releases.

Ingen ekstra installasjon nødvendig — appen inkluderer Playwright-binarer og starter automatisk med tilgjengelig nettleser (Chrome → Chromium → Firefox).

Bruk

Web-modus (standard)

Dobbeltklikk TrumfScraper.exe eller kjør:

TrumfScraper.exe

Åpner en nettside på http://localhost:5123 med:

  • Dashboard — oversikt over kjeder og varer
  • Hent data — logg inn på Trumf, hent kvitteringer
  • Sammenlign — pristabell med søk, filter, sortering og grafer
  • Fellesskap — del og hent prisdata
  • Hjelp — brukerveiledning

CLI-modus

TrumfScraper.exe --cli

Interaktiv meny i terminalen:

1) Hent kvitteringer fra Trumf
2) Sammenlign priser (konsoll)
3) Sammenlign priser (Excel)
4) Del varekatalog anonymt
5) Hent fellesskapets prisdata
?) Hjelp
0) Avslutt

Utvikling

Forutsetninger

  • .NET 9 SDK
  • Ingen ekstern nettleser nødvendig — Playwright-binarer er inkludert
  • Miljøvariabler / Secrets: Alle hemmeligheter og miljøvariabler ligger lagret i vår avtalte secrets manager. For å sette opp prosjektet lokalt, opprett en .env-fil i mappen og lim inn miljøvariablene.

Kjør lokalt

git clone https://github.com/holdude/TrumfScraper.git
cd TrumfScraper
dotnet run

For CLI-modus under utvikling:

dotnet run -- --cli

Prosjektstruktur

TrumfScraper/
├── Program.cs                  # Inngangspunkt, dual mode (web/cli)
├── TrumfScraper.csproj         # Prosjektfil med versjon
├── build.ps1                   # PowerShell-byggescript (publish + zip)
├── Models/
│   ├── CatalogItem.cs          # Varekatalog med prishistorikk
│   ├── ReceiptLine.cs          # Enkelt varelinjeprodukt
│   └── Transaction.cs          # Trumf-transaksjon
├── Scraping/
│   ├── TrumfScraperRunner.cs   # Playwright-automatisering og login
│   ├── RscParser.cs            # Parser Next.js RSC-payload
│   └── ReceiptParser.cs        # Parser kvitteringstekst til varer
├── Export/
│   ├── Exporter.cs             # Lagrer varekatalog (JSON)
│   └── PriceComparer.cs        # Prissammenligning (konsoll/Excel/API)
├── Community/
│   ├── CatalogUploader.cs          # Del/hent prisdata via Cloudflare Worker (D1)
│   ├── UploadSecret.Template.cs    # Mal for delt HMAC-nøkkel (se Utvikling)
│   └── UploadSecret.cs             # Faktisk nøkkel — gitignorert, lag selv
├── Web/
│   ├── ApiEndpoints.cs         # REST API-endepunkter
│   ├── ApiModels.cs            # Request/response-modeller
│   ├── AutoUpdater.cs          # Auto-oppdatering via GitHub Releases
│   ├── ScrapeSession.cs        # Scraping-sesjon med event-buffer
│   └── WebSessionLifetime.cs   # Auto-shutdown når nettleser lukkes
├── wwwroot/
│   ├── index.html              # Web-UI (single page)
│   ├── style.css               # Styling
│   └── app.js                  # Frontend-logikk
├── worker/                     # Cloudflare Worker (delingstjeneste)
│   ├── src/index.ts            # API: /contribute, /catalog, /tilbud
│   ├── migrations/             # D1-skjema (SQL)
│   ├── scripts/seed-d1.ts      # Engangs-seeding fra legacy GitHub-data
│   ├── wrangler.toml           # Worker- og D1-konfig
│   └── README.md               # Deploy-instruksjoner
└── .github/workflows/
    └── release.yml             # CI/CD: bygg og publiser ved versjonsendring

Del-tjenestens signeringsnøkkel

POST /contribute er sikret med HMAC-SHA256. Appen signerer hver forespørsel med en delt nøkkel som valideres av Cloudflare Worker.

For å kjøre appen lokalt (uten å dele data) trenger du ikke gjøre noe. For å aktivere deling lokalt:

  1. Kopier Community/UploadSecret.Template.cs til Community/UploadSecret.cs
  2. I den nye fila: gi klassen nytt navn fra UploadSecretTemplate til UploadSecret, og bytt ut REPLACE_ME_WITH_SHARED_SECRET med den faktiske nøkkelen
  3. Aldri commit Community/UploadSecret.cs (er gitignorert)

For å deploye worker med ny nøkkel:

cd worker
wrangler secret put UPLOAD_SECRET   # lim inn nøkkel
wrangler deploy

For lokal wrangler dev, legg nøkkelen i worker/.dev.vars:

UPLOAD_SECRET=din-nøkkel-her

Publiser ny versjon

  1. Bump <Version> i TrumfScraper.csproj
  2. Commit og push til master
  3. GitHub Actions bygger og publiserer automatisk til TrumfScraper/releases

Krever: UPLOAD_SECRET må være satt som repository secret under Settings → Secrets and variables → Actions, med samme verdi som worker-nøkkelen. Workflowen genererer Community/UploadSecret.cs fra denne før build.

Bygg manuelt

Anbefalt (Windows PowerShell) er å bruke build.ps1:

Set-Location "C:\path\til\TrumfScraper"
.\build.ps1

Vanlige valg:

# Fjern "downloaded from internet"-markering fra ZIP-filer
.\build.ps1 -UnblockDownloadedFiles

# Framework-dependent build (mindre output, krever installert .NET runtime)
.\build.ps1 -FrameworkDependent

# Ikke single-file publish
.\build.ps1 -NoSingleFile

# Bygg for annen runtime
.\build.ps1 -Runtime win-arm64

Scriptet publiserer til publish/ (standard) og lager normalt publish/TrumfScraper.exe.

Du kan fortsatt bygge direkte med dotnet publish:

dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o ./publish

Genererer publish/TrumfScraper.exe (~80 MB, inkluderer .NET runtime).

Fellesskapsdeling

Når du deler, sendes kun skrapede kjøpsdata anonymt — kjedenavn, varenavn, pris og dato. Ingen personlig informasjon, kvitteringsnummer eller butikklokasjon. Du kan også hente prisdata som andre i fellesskapet har delt.

API-en er en Cloudflare Worker som leser fra og skriver til en delt D1-database:

https://trumfscraper-upload.sanan-adnan97.workers.dev

Endepunkter:

  • POST /contribute — del prisdata (catalog + tilbud) — krever signert forespørsel
  • GET /catalog — hent delte priser (standard: siste 90 dager, ?all=1 for alt)
  • GET /tilbud — hent delte tilbud (standard: siste 30 dager, ?all=1 for alt)

Sikkerhet

Skriving til databasen er beskyttet med HMAC-SHA256-signering. Appen legger til to headere på hver POST /contribute:

  • X-Timestamp — Unix-tidsstempel i sekunder
  • X-Signature — HMAC-SHA256 (hex) over {tidsstempel}.{råbody}

Workeren avviser forespørsler som mangler headere, har feil signatur, eller er mer enn 5 minutter gamle (replay-beskyttelse). Usignerte curl-kall returnerer 401 Missing signature headers.

Eksempel — hent siste 90 dagers priser:

curl https://trumfscraper-upload.sanan-adnan97.workers.dev/catalog

Personvern

  • Mobilnummer og passord lagres aldri — brukes kun for innlogging
  • Varekatalogen som deles inneholder kun kjedenavn, varenavn, priser og datoer
  • Ingen personlig informasjon sendes
  • Fellesskapsbidrag sendes direkte til en Cloudflare Worker som validerer og lagrer i D1

Lisens

Privat prosjekt.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors