Ga naar inhoud

ApoAlly Insights Configuratie#

Windows 10#

Powershell Upload-Script
apoally-insights-upload.ps1
# upload_csv.ps1
#
# Dit script zoekt nu automatisch naar een optioneel schema-bestand (.json of .csvs)
# met dezelfde basisnaam als het CSV/TSV-bestand. JSON heeft prioriteit boven CSVS als beide bestaan.
# Als er geen schema-bestand wordt gevonden, wordt alleen het CSV/TSV-bestand geüpload.
#
# Omgeving:
#   $apiUrl      - Standaard: "https://api.apoally.de/insights/upload"
#   $apiKey      - Standaard: "YOUR-API-KEY"
#   $csvFolder   - Standaard: "D:\ApoAlly-Insights"
#   $waitMinutes - Standaard: 5
#
# Dit script controleert elk CSV/TSV-bestand in de $csvFolder. Als een bestand ouder is dan $waitMinutes,
# wordt het geüpload naar de API. Als er een fout optreedt, wordt een error.log aangemaakt.

# Configuratie
$apiUrl = "https://api.apoally.de/insights/upload"
$apiKey = "YOUR-API-KEY"
$csvFolder = "D:\ApoAlly-Insights"
$waitMinutes = 5

function Upload-SingleFile {
    param (
        [string]$CsvFile
    )

    # Controleer op een bestaand JSON- of CSVS-schema-bestand met dezelfde basisnaam (JSON heeft prioriteit)
    $schemaFileJson = Join-Path $CsvFile.DirectoryName ("$($CsvFile.BaseName).json")
    $schemaFileCsvs = Join-Path $CsvFile.DirectoryName ("$($CsvFile.BaseName).csvs")
    $schemaFileToUpload = $null

    if (Test-Path $schemaFileJson) {
        $schemaFileToUpload = $schemaFileJson
    }
    elseif (Test-Path $schemaFileCsvs) {
        $schemaFileToUpload = $schemaFileCsvs
    }

    Write-Host "Bestand uploaden: $($CsvFile.FullName)"
    if ($schemaFileToUpload) {
        Write-Host "Optioneel schema-bestand gevonden: $schemaFileToUpload"
    }

    # Bepaal MIME-type op basis van extensie (.csv of .tsv)
    $extension = $CsvFile.Extension.ToLower()
    $contentType = "text/csv"
    if ($extension -eq ".tsv") {
        $contentType = "text/tab-separated-values"
    }

    # Bouw de multipart/form-data body
    $boundary = "----MyBoundary$(Get-Random)"
    $LF = "`r`n"
    $bodyLines = @()

    # 1) Voeg het CSV/TSV-gedeelte toe
    $csvContent = Get-Content $CsvFile.FullName -Raw
    $bodyLines += "--$boundary"
    $bodyLines += "Content-Disposition: form-data; name=`"files`"; filename=`"$($CsvFile.Name)`""
    $bodyLines += "Content-Type: $contentType$LF"
    $bodyLines += $csvContent

    # 2) Als er een schema-bestand is, voeg dit toe als een tweede gedeelte
    if ($schemaFileToUpload) {
        $schemaContent = Get-Content $schemaFileToUpload -Raw
        $bodyLines += "--$boundary"
        $bodyLines += "Content-Disposition: form-data; name=`"files`"; filename=`"$($schemaFileToUpload)`""

        if ($schemaFileToUpload.ToLower().EndsWith(".json")) {
            $bodyLines += "Content-Type: application/json$LF"
        }
        else {
            # Voor .csvs behandelen we het als tekst
            $bodyLines += "Content-Type: text/plain$LF"
        }

        $bodyLines += $schemaContent
    }

    # Eindgrens
    $bodyLines += "--$boundary--"

    $body = $bodyLines -join $LF
    $headers = @{
        "X-API-Key" = $apiKey
        "Content-Type" = "multipart/form-data; boundary=$boundary"
    }

    try {
        $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body
        return $response
    }
    catch {
        throw $_
    }
}

function Upload-CSVFiles {
    param (
        [string]$Folder
    )

    # Haal alle CSV- en TSV-bestanden op, negeer bestanden die '_img.csv' of '_img.tsv' bevatten
    $csvFiles = Get-ChildItem -Path $Folder -Recurse -File -Include *.csv, *.tsv |
        Where-Object { $_.Name -notmatch '_img\.(csv|tsv)$' }

    foreach ($file in $csvFiles) {
        # Definieer de foutlog-bestandsnaam voor het databestand
        $errorLog = Join-Path $file.DirectoryName ("$($file.BaseName).error.log")

        # Sla over als er al een foutlog bestaat
        if (Test-Path $errorLog) {
            Write-Host "Bestand overslaan vanwege bestaande foutlog: $($file.FullName)"
            continue
        }

        # Controleer of het bestand minstens $waitMinutes oud is
        $fileAge = (Get-Date) - $file.LastWriteTime
        if ($fileAge.TotalMinutes -lt $waitMinutes) {
            Write-Host "Bestand is niet oud genoeg (Leeftijd: $([math]::Round($fileAge.TotalMinutes, 2)) minuten): $($file.FullName)"
            continue
        }

        Write-Host "Probeer uploaden van: $($file.FullName)"
        try {
            $response = Upload-SingleFile -CsvFile $file

            if ($response.status -eq "success") {
                Write-Host "Upload succesvol: $($file.FullName)"
                Remove-Item $file.FullName -Force

                # Controleer en verwijder bijbehorende _img.csv of _img.tsv bestand
                $imgCsv = Join-Path $file.DirectoryName ("$($file.BaseName)_img.csv")
                $imgTsv = Join-Path $file.DirectoryName ("$($file.BaseName)_img.tsv")
                if (Test-Path $imgCsv) {
                    Remove-Item $imgCsv -Force
                    Write-Host "Bijbehorend _img.csv bestand verwijderd: $imgCsv"
                }
                if (Test-Path $imgTsv) {
                    Remove-Item $imgTsv -Force
                    Write-Host "Bijbehorend _img.tsv bestand verwijderd: $imgTsv"
                }
            }
            else {
                Write-Host "Upload mislukt voor bestand: $($file.FullName). Foutlog wordt aangemaakt."
                $errorMessage = "Fout bij uploaden: " + ($response.error)
                $errorMessage | Out-File -FilePath $errorLog -Encoding utf8
            }
        }
        catch {
            Write-Host "Fout bij uploaden bestand $($file.FullName): $_. Foutlog wordt aangemaakt."
            $_ | Out-File -FilePath $errorLog -Encoding utf8
        }
    }
}

function Start-Watch {
    param (
        [string]$Folder,
        [int]$WaitMinutes
    )

    # Initiële verwerking bij opstarten
    Upload-CSVFiles -Folder $Folder

    # Herhaal eindeloos, wacht 1 minuut tussen controles
    while ($true) {
        Start-Sleep -Seconds 60
        Upload-CSVFiles -Folder $Folder
    }
}

# Start mapbewaking
Start-Watch -Folder $csvFolder -WaitMinutes $waitMinutes

Handleiding voor installatie en configuratie van het script#

De volgende handleiding beschrijft hoe het PowerShell-script apoally-insights-upload.ps1 op een Windows 10-systeem wordt opgeslagen, geconfigureerd en ingesteld om automatisch bij het opstarten van het systeem te worden uitgevoerd.


1. Script opslaan#

  1. Open een teksteditor (bijv. Kladblok).
  2. Kopieer de inhoud van het PowerShell-script apoally-insights-upload.ps1 in de editor.
  3. Sla het bestand op onder de naam apoally-insights-upload.ps1 in de gewenste map, bijv. C:\Scripts.

2. PowerShell-uitvoeringsbeleid aanpassen#

Om het script uit te voeren, moet het PowerShell-uitvoeringsbeleid worden aangepast:

  1. Open PowerShell als beheerder.
  2. Voer de volgende opdracht in om het uitvoeringsbeleid te wijzigen:
    Set-ExecutionPolicy RemoteSigned
    
  3. Bevestig de wijziging met Y (Ja).

3. API-sleutel en configuratie aanpassen#

  1. Open het bestand apoally-insights-upload.ps1 met een teksteditor.
  2. Vervang YOUR-API-KEY door uw daadwerkelijke API-sleutel.
  3. Pas het pad voor de map $csvFolder aan als uw CSV-bestanden in een andere map zijn opgeslagen.
  4. Sla de wijzigingen op.

4. Taak voor automatisch starten instellen#

Om het script automatisch bij het opstarten van het systeem uit te voeren, stelt u een geplande taak in:

  1. Open de Taakplanner via het Startmenu.
  2. Klik op Taak maken.
  3. Geef onder Algemeen een naam op voor de taak, bijv. ApoAlly Insights Upload.
  4. Schakel de optie Uitvoeren met hoogste bevoegdheden in.
  5. Ga naar het tabblad Triggers en klik op Nieuw: - Selecteer Bij opstarten. - Klik op OK.
  6. Ga naar het tabblad Acties en klik op Nieuw: - Selecteer Programma starten. - Voer het volgende in het veld Programma/script in:
    powershell.exe
    
    - Voer het volgende in het veld Argumenten toevoegen (optioneel) in:
    -File "C:\Scripts\apoally-insights-upload.ps1"
    
    - Klik op OK.
  7. Ga naar het tabblad Voorwaarden en schakel de optie Taak alleen starten als de computer op netstroom werkt uit als de taak ook op batterij moet worden uitgevoerd.
  8. Klik op OK om de taak te maken.

5. Testuitvoering#

  1. Voer het script handmatig uit om te controleren of het correct werkt:
    powershell.exe -File "C:\Scripts\apoally-insights-upload.ps1"
    
  2. Controleer de uitvoer en de aangemaakte logbestanden om te bevestigen dat er geen fouten optreden.

6. Monitoring en probleemoplossing#

  • Controleer regelmatig de logbestanden die in dezelfde map als de CSV-bestanden worden opgeslagen.
  • Als de geplande taak niet wordt uitgevoerd, controleer dan de instellingen in de Taakplanner en zorg ervoor dat het script correct is geconfigureerd.

Met deze stappen is het script succesvol ingesteld op uw Windows 10-systeem en wordt het automatisch uitgevoerd bij het opstarten van het systeem.