Automatische download CSV-file

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
Zeagle
Starter
Starter
Berichten: 5
Lid geworden op: 22 sep 2014, 16:20
Twitter: Zeagle_
Locatie: Sint-Niklaas

Hallo,

Ik zit met het volgende probleem:
Ik ben bezig met een webshop op te zetten, en van een van mijn leveranciers heb ik een URL gekregen die een CSV-file genereerd met hun producten hier in.
Dit bestand wil ik dan uploaden naar mijn webhosting en dan laten importeren.
Het uploaden en importeren heb ik in orde gekregen, maar het automatisch downloaden niet.
Ik heb een Windows server ter beschikking, en hierop wil ik via een sheduled task de CSV automatisch laten downloaden.
De URL ik heb gekregen van mijn leverancier is geen rechtstreekse URL naar het CSV bestand, hij gaat naar een pagina die de CSV on-the-fly gaat genereren.
Op de site van mijn leverancier staat volgende melding:
Let op: Wanneer u de URL bezoekt krijgt u in eerste instantie een "202 Accepted" status terug. Dit betekent dat de connectie op dit moment wordt gegenereerd, probeer het enkele seconden later nogmaals. Herhaal dit proces tot er een "200 Ok" status terug wordt gegeven, nu krijgt u de daadwerkelijke feed terug.
Als ik rechtstreeks naar de URL navigeer, krijg ik na een second of 10 de mogelijkheid om het CSV-bestand te downloaden.

Is er een manier (script?) om op een Windows server automatisch naar de URL te gaan, het CSV-bestand laten genereren en dit dan te downloaden?
Dan zou ik dit willen automatiseren via een sheduled task (script elke morgen uitvoeren).

mvg,

Jonathan
GRTZ Z
Afbeelding
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Als je PowerShell gebruikt: gewoon

Code: Selecteer alles

Invoke-WebRequest http://example.com/file.csv -OutFile C:\Temp\Uploads\
. Je herhaalt die tot dat deze geen foutmelding meer geeft (Invoke-Webrequest throwt een error als het antwoord geen 200 - OK is).
Gebruikersavatar
Zeagle
Starter
Starter
Berichten: 5
Lid geworden op: 22 sep 2014, 16:20
Twitter: Zeagle_
Locatie: Sint-Niklaas

Met Powershell genereerd hij dan gewoon een lege CSV-file.

Code: Selecteer alles

Invoke-WebRequest "URL" -OutFile "C:\OutputFolder\file.csv"
De URL naar de CSV is niet rechtstreeks, dus eindigt ook niet op .csv.
Dus niet

Code: Selecteer alles

http://www.url.be/file.csv
maar eerder iets zoals

Code: Selecteer alles

http://www.url.be/generatecsv.html?paramter1=x&parameter2=y
GRTZ Z
Afbeelding
Gebruikersavatar
cloink
Elite Poster
Elite Poster
Berichten: 3698
Lid geworden op: 29 okt 2007, 10:29
Twitter: cloink
Uitgedeelde bedankjes: 117 keer
Bedankt: 152 keer
Contacteer:
Provider
Te Koop forum

Up *nix is wget een populaire tool. Ik zie dat er ook een Windows port is. Misschien eens proberen?
ooh. shiny.
ubremoved_539
Deel van't meubilair
Deel van't meubilair
Berichten: 29849
Lid geworden op: 28 okt 2003, 09:17
Uitgedeelde bedankjes: 434 keer
Bedankt: 1972 keer

Zeagle schreef:Met Powershell genereerd hij dan gewoon een lege CSV-file.

Code: Selecteer alles

Invoke-WebRequest "URL" -OutFile "C:\OutputFolder\file.csv"
Je moet die URL wel vervangen door je effectieve URL... dus http://www.url.be/generatecsv.html?para ... rameter2=y
Gebruikersavatar
Zeagle
Starter
Starter
Berichten: 5
Lid geworden op: 22 sep 2014, 16:20
Twitter: Zeagle_
Locatie: Sint-Niklaas

cloink schreef:Up *nix is wget een populaire tool. Ik zie dat er ook een Windows port is. Misschien eens proberen?
Ik heb het al geprobeerd met wget voor Windows, maar deze maakt een bestand aan met naam "generatecsv.html?parameter1=x&parameter2=y" van 0 bytes.
r2504 schreef:
Zeagle schreef:Met Powershell genereerd hij dan gewoon een lege CSV-file.

Code: Selecteer alles

Invoke-WebRequest "URL" -OutFile "C:\OutputFolder\file.csv"
Je moet die URL wel vervangen door je effectieve URL... dus http://www.url.be/generatecsv.html?para ... rameter2=y
Heb ik gedaan :)

Code: Selecteer alles

Invoke-WebRequest "http://www.url.be/generatecsv.html?parameter1=x&parameter2=y" -OutFile "C:\OutputFolder\file.csv"
Maakt gewoon een lege CSV file aan van 0 bytes.
GRTZ Z
Afbeelding
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

PoSh:

Code: Selecteer alles

$url = http://example.com/
$out = blah.csv
do {
    sleep -s 5
    $csv = Invoke-WebRequest $url
} until ($csv.StatusCode -eq 200)
$csv.Content > $out
Heb het niet getest, maar 't is het principe. Nu wordt er op statuscode gechecked tot zoals de documentatie zegt code 200 terugkomt.
Gebruikersavatar
Zeagle
Starter
Starter
Berichten: 5
Lid geworden op: 22 sep 2014, 16:20
Twitter: Zeagle_
Locatie: Sint-Niklaas

Als ik deze code in een PowerShell script giet, wordt er na een tijdje een inderdaad een CSV file gegenereerd, maar deze is leeg (1KB).

Ik gebruik volgende code:

Code: Selecteer alles

$url = "http://www.twindis.com/modules/connection/generateConnectionFeed.html?connectionid=2066&ckey=hB8uQ65V7%2BY1G7SlHYZ3CetilSA%3D"
$out = "productFeed.csv"
do {
    sleep -s 5
    $csv = Invoke-WebRequest $url
} until ($csv.StatusCode -eq 200)
$csv.Content > $out
Als ik de URL bezoek via mijn webbrowser, zie ik een loading-icon, de pagina refreshed een paar keer en dan krijg ik het scherm om de CSV-file te saven.
GRTZ Z
Afbeelding
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Beetje aan het debuggen gegaan met jouw voorbeeld:
Loop 1:

Code: Selecteer alles

StatusCode        : 202
StatusDescription : Accepted
Content           : <html>
                    <head></head>
                    <body style="margin:0;padding:0;">
                    <script>
                    setTimeout(function(){
                    window.location.reload();
                    document.body.removeChild(document.getElementById("loadingImg"));
                    }, 10000);
                    </script>...
Loop 2:

Code: Selecteer alles

StatusCode        : 200
StatusDescription : OK
Content           : 
RawContent        : HTTP/1.1 200 OK
                    Date: Tue, 23 Sep 2014 12:53:44 GMT
                    Set-Cookie: cfid=e96384fd-536c-4735-b908-dd6d03a66d1f;Path=/;Expires=Wed, 21-Sep-2044 20:45:14 GMT;HTTPOnly,cftoken=0;Path=/;Expires=Wed, 21-Sep-2
                    ...
Bij Status 200 is de content blijkbaar ook effectief leeg (en dus vandaar die lege CSV).
Raw headers:

Code: Selecteer alles

HTTP/1.1 200 OK
Date: Tue, 23 Sep 2014 12:53:44 GMT
Set-Cookie: cfid=e96384fd-536c-4735-b908-dd6d03a66d1f;Path=/;Expires=Wed, 21-Sep-2044 20:45:14 GMT;HTTPOnly,cftoken=0;Path=/;Expires=Wed, 21-Sep-2044 20:45:14 GMT;HTT
POnly,MMID=4AC043EB-75FA-4713-A565DBF6CF3E5813;Path=/;Expires=Wed, 21-Sep-2044 20:45:14 GMT,DEFAULTLOCALE=nl_NL;Path=/;Expires=Wed, 21-Sep-2044 20:45:14 GMT,CONDL=hB8
uQ65V7%2BY1G7SlHYZ3CetilSA%3D;Path=/;Expires=Tue, 23-Sep-2014 12:53:45 GMT
X-Frame-Options: SAMEORIGIN
Access-Control-Allow-Credentials: true
Content-Disposition: attachment; filename=productFeed.csv
Content-Type: text/csv;charset=UTF-8
Content-Length: 0
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=4, max=75
Connection: Keep-Alive
De server geeft dus een content-length: 0 terug. D'er is dus IETS dat verschillend is tussen een PoSH/WGet-situatie en in de browser...
Zijn er nog bepaalde request headers die meegestuurd moeten worden om de correcte output te krijgen?
Gebruikersavatar
Zeagle
Starter
Starter
Berichten: 5
Lid geworden op: 22 sep 2014, 16:20
Twitter: Zeagle_
Locatie: Sint-Niklaas

Eerlijk gezegd heb ik geen flauw idee :)
Als ik gewoon die URL plak in de browser krijg ik na een tijdje (2 refreshes) de popup om de file te saven...
GRTZ Z
Afbeelding
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

In theorie werkt m'n scriptje, maar het resultaat dus niet :(

Code: Selecteer alles

Run 1
Status 202
Length 282
---
Run 2
Status 202
Length 282
---
Run 3
Status 202
Length 282
---
Run 4
Status 202
Length 282
---
Run 5
Status 202
Length 282
---
Run 6
Status 200
Length 0
Gebruikersavatar
foxhound
Plus Member
Plus Member
Berichten: 198
Lid geworden op: 06 mei 2009, 16:35
Uitgedeelde bedankjes: 1 keer
Bedankt: 19 keer

Ik heb ooit iets gelijkaardig moeten maken om een CSV export van de verlofaanvragen van al onze medewerkers te downloaden van de online tool die we ervoor gebruiken (vrijedagen.nl).

Ik heb hiervoor FireFox met GreaseMonkey gebruikt om alle acties die ik normaal zelf zou uitvoeren om tot het resultaat te komen te automatiseren (bvb log in met bepaalde username en wachtwoord, klik op aanvragen, klik op rapport, klik op download). Dan ingesteld dat firefox CSV files altijd op een bepaalde locatie moet gaan saven, en tenslotte dat firefox elk uur gestart wordt met de link naar vrijedagen als parameter.

De CSV file wordt bij VrijeDagen ook pas gegenereerd wanneer er op de downloaden knop geklikt wordt, dus ik vermoed dat jouw situatie ongeveer gelijkaardig zal zijn.
Afbeelding
Plaats reactie

Terug naar “Development”