Pagina 1 van 1

Automatische download CSV-file

Geplaatst: 22 sep 2014, 16:30
door Zeagle
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

Re: Automatische download CSV-file

Geplaatst: 22 sep 2014, 16:47
door meon
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).

Re: Automatische download CSV-file

Geplaatst: 22 sep 2014, 17:07
door Zeagle
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

Re: Automatische download CSV-file

Geplaatst: 22 sep 2014, 18:50
door cloink
Up *nix is wget een populaire tool. Ik zie dat er ook een Windows port is. Misschien eens proberen?

Re: Automatische download CSV-file

Geplaatst: 22 sep 2014, 19:59
door ubremoved_539
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

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 09:39
door Zeagle
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.

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 10:02
door meon
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.

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 14:03
door Zeagle
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.

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 14:58
door meon
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?

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 15:24
door Zeagle
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...

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 15:37
door meon
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

Re: Automatische download CSV-file

Geplaatst: 23 sep 2014, 15:46
door foxhound
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.