probleem downloaden file
Ik ben een programmeer leek maar heb een probleem met een scriptje waarvan ik hoop dat iemand me kan helpen.
Ik maak gebruik van een script dat inlogd op een bepaalde website en daar een bestand download en op mijn eigen server onder bepaalde naam weer opslaat.
Nu gaat dat goed zolang het een directe verwijzing is naar het bestand.
Maar nu moet ik vrijwel hetzelfde doen maar kan ik niet rechtstreeks naar het bestand verwijzen omdat deze dynamisch opgebouwd wordt en de naam dagelijks veranderd (zit een maand en datum in bestandsnaam.
Wel heb ik een vaste link die ervoor zorgt dat laatste bestand automatisch start met downloaden.
Dat werkt echter zolang ik die gewoon ind e browser open en het bestand dan naar mijn computer download.
Deze link ziet er als volgt uit:
http://domeinnaam.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3
als ik het script met deze url als locatie van file aanroep via cron-job krijg ik de volgende foutmelding:
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
het script is als volgt:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
$remotefile = 'http://domeinnaam.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3';
$localfile = '/home/wns/domains/domeinnaam.nl/public_html/feeds/bestandsnaam-test.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/naamcookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "http://domeinnaam.nl/wp-admin";
// User name and password to login the website, a separate account can be create for this.
$user = 'gebruikersnaam'; // <-- put your login here
$pw = 'wachtwoord'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $naamcookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
$remotefile = 'http://domeinnaam.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3';
$localfile = '/home/wns/domains/domeinnaam.nl/public_html/feeds/bestandsnaam-test.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/naamcookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "http://domeinnaam.nl/wp-admin";
// User name and password to login the website, a separate account can be create for this.
$user = 'gebruikersnaam'; // <-- put your login here
$pw = 'wachtwoord'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $naamcookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
Iemand enig idee hoe ik dat kan oplossen zodat hij ook met die aanroep van te downloaden bestand werkt?
Groet
Daniel
Hoe ziet je cronjob-commando er uit?
/usr/bin/wget -O /dev/null "http://domeinnaam.nl/feeds/feed-download.php
Had laatste " dus per ongeluk verwijderd....
heb nu /usr/bin/wget -O /dev/null "http://desexwinkel.nl/feeds/feed-download.php" en nu wordt bestand bestandsnaam-test.csv wel aangemaakt.
Maar dan een nieuw probleem: bestand is leeg terwijl bronbestand welke hij moet downloaden en als bestandsnaam-test.csv moet opslaan 71MB groot is.
Toevoeging op 01/09/2015 13:43:54:
Overigens ben ik vrij omslachtig bezig. bronbestand staat namelijk ook op mijn eigen server.
Maar dit bronbestand wordt via een cronjob automatisch dagelijks gegenereerd door een script wat ik gekocht heb.
maar dat script kan het gedownloade bestand (een uittreksel van bepaalde info uit mijn database) dus niet onder een vaste naam opslaan maar enkel dus met een maand en datum toevoeging.
En ik heb het bestand nodig op een vaste locatie met een vaste naam zodat een externe partij die dagelijks weer kan ophalen. vandaar dus op deze omslachtige manier.
8-31.csv (gisteren)
9-1.csv (vandaag)
etc?
Dan kan je dat prima doen.
Je kan ook met glob() kijken welke bestanden er zijn en met filemtime() kijken welke het nieuwste is...
en de naam van het bestand is als volgt: bestands-naam September 01 09_14.csv
en stuk vanaf September veranderd dus dagelijks/maandelijks.
In diezelfde directory komen nog vele honderden andere bestanden te staan, namelijk alle productfoto's van nieuwe producten.
Kunnen dus honderden/duizenden files in die map komen te staan. dus eenvoudigweg de laatste nemen is ook niet de oplossing.
Maar iemand aan de hand van script een idee waarom er een leeg bestand aangemaakt wordt?
Nu weet ik dat je de upload-map in Wordpress ook kan wijzigen...
dat zal geen verschil maken aangezien dan zowel de foto's voor nieuwe producten als de gegenereerde exports dus naar die nieuwe map gaan
En je weet hoe het bestand heet.
Want jij laat dat bestand aanmaken.
Dan is het toch gewoon copy()?
Daniel Feenstra op 01/09/2015 13:41:01:
maar dat script kan het gedownloade bestand (een uittreksel van bepaalde info uit mijn database) dus niet onder een vaste naam opslaan
Waarom niet? Script kun je toch aanpassen om dat te realiseren?!
En ja je kan het bestand aanpassen zodat het ergens anders opgeslagen wordt maar die aanpassingen gaan dan steeds verloren als het script weer geupdate wordt.
Ik moet dus echt met een script zoals bovenstaand het bestand van ene naar andere locatie copieeren.
Maar bovenstaande script werkt dus prima als de url van bronbestand echt naar bestand verwijst en eindigd op .csv of .xml maar werkt nu niet doordat de url verwijst naar een plek waarmee bestand aangemaakt wordt. Dat zou toch op te lossen moeten zijn?
Je zegt zelf dat er een patroon in het opslaan zit /2015/09/Bla september 9.csv o.i.d. Dan kan je dus ook het bestand van gisteren als je dit pad weet na te bootsen.
Ik heb een webshop waarin al mijn producten staan.
Deze producten wil ik ook op o.a. product vergelijkers zoals beslist plaatsen.
Nu heb ik een plugin die de benodigde velden naar een csv of xml bestand kan exporteren.
Die plugin slaat echter op een onhandige plek op en onder een dagelijks wisselende naam.
Wel heb ik een vaste link waarmee bij aanroepen automatisch laatste versie van bestand wordt gedownload.
Die linkt zit echter in mijn admin systeem en werkt dus enkel als ik in de admin ben ingelogd en kan ik dus niet doorgeven aan die externe partijen om de laatste csv te downloaden.
Nu heb ik een scriptje (zie openingspost) welke automatisch kan inloggen op afgeschermde pagina's met gebruikersnaam en wachtwoord en daarna een csv of xml bestand kan downloaden.
Zolang ik rechtstreeks naar een csv of xml file verwijs werkt dat prima en download hij bestand en slaat hij onder ingestelde naam op op locatie van mijn keuze.
Maar nu heb ik dus geen rechtstreekse url van bestand maar een url dat automatisch laatste versie van bestand opzoekt en download. en daar zit hem dus het probleem in.
werkt wel met script: http://domeinnaam.nl/bestanden/bestand.csv
werkt niet met script: http://domeinnaam.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3
hoe kan ik dus met bovenstaande script zorgen dat de onderste url ook werkt met downloaden?
Nu krijg ik met onderste url dus een leeg bestand.
Je moet dan dit aan het script toevoegen
Je kunt ook voor de curl_exec (regel 46) het volgende plaatsen. Misschien geeft deze nog iets aan waar je wat aan hebt
ik heb beide zinnen aan script toegevoegd.
script ziet er nu als volgt uit:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
$remotefile = 'http://url.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3';
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$localfile = '/home/wns/domains/url.nl/public_html/feeds/beslist-test.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/shopcookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "http://url.nl/wp-admin";
// User name and password to login the website, a separate account can be create for this.
$user = 'username'; // <-- put your login here
$pw = 'password'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $shopcookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
print_r(curl_getinfo($ch));
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
$remotefile = 'http://url.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3';
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$localfile = '/home/wns/domains/url.nl/public_html/feeds/beslist-test.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/shopcookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "http://url.nl/wp-admin";
// User name and password to login the website, a separate account can be create for this.
$user = 'username'; // <-- put your login here
$pw = 'password'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $shopcookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
print_r(curl_getinfo($ch));
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
bestand is echter nog steeds leeg nadat aangemaakt is.
De e-mail die ik krijg na uitvoeren van cron-job bevat het volgende:
Quote:
--2015-09-07 11:30:01-- http://url.nl/feeds/feed-download.php
Resolving url.nl... 62.84.241.117 Connecting to url.nl|62.84.241.000|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 980 [text/html]
Saving to: `/dev/null'
0K 100% 208M=0s
2015-09-07 11:30:05 (208 MB/s) - `/dev/null' saved [980/980]
Resolving url.nl... 62.84.241.117 Connecting to url.nl|62.84.241.000|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 980 [text/html]
Saving to: `/dev/null'
0K 100% 208M=0s
2015-09-07 11:30:05 (208 MB/s) - `/dev/null' saved [980/980]
Regel 5 (followlocation) moet na de curl_init() (regel 18) en voor de curl_exec
moet er maar eens wat geld aan gaan uitgeven om dit op te lossen.
bedankt voor meedenken.
Toevoeging op 07/09/2015 13:59:17:
* maak een simpel script dat de dynamische filename nabootst
* doe dat zonder het stuk http://..../ maar gebruik het echte path op de server
* php kan nu dat bestand benaderen, zonder password
* copy file naar beoogde locatie.
alternatief is bijna gelijk:
gebruik een rewrite rule om het niet gevonden bestand beslist-test.csv om te schrijven naar
leeshet.php
in leeshet.php doe je hetzelfde als ik hierboven zeg voor de bestandsnaam
ipv copy doe je
header('Content-Type: application/csv'); // of iets dergelijks
fpasstrhu($file);
zie http://php.net/fpassthru
dat heeft als voordeel dat de file ook op te halen is als jouw scriptje nog niet gekopieerd heeft
maar als nadeel, dat als de nieuwe file er een dag niet is, ook de file van gisteren niet vanzelf gegeven wordt. (op te lossen door in je script dan alsnog naar een dag eerder te kijken)
Enkel wisseld de naam en directory waar het bestand staat dus steeds en wil ik het onder een andere vaste naam opslaan.
Ik heb zelf 0,0 verstand van programmeren dus zal toch verder hulp moeten gaan inhuren om dit voor elkaar te krijgen
hoe ziet het path naar de file eruit (waar hij aangemaakt wordt door jouw plugin)?
hierboven heb je het over
http://url.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3
maar daarin herken ik geen bestandsnaam met een datum
de url http://url.nl/wp-admin/admin.php?page=pmxe-admin-manage&id=1&action=get_file&_wpnonce=9caaead0e3 is een url die als je die aanroept automatisch de laatst gecreeerde versie van die export job (cron-job) aanroept.
dat script welke ik nu probeerde te gebruiken was eigenlijk ook voor het ophalen van een feed vanaf een heel andere website welke achter een login staat.
Zo gebruik ik dat script in elkgeval op andere sites van me.