Newsgroup: it.comp.www.php
Titolo: curl amazon.de da errore invece di http_status 200

Alcune pagine web se aperte da browser danno un http status di 200
mentre se aperte da curl danno errore oppure un 5xx.
 
Per esempio 
https://www.amazon.de/dp/3864451434
 non da 200 con il
seguente curl:
 
function httpstatus($link){
	$handle = curl_init($link);
	curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($handle, CURLOPT_NOBODY, TRUE);
	curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
	curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 4);
	curl_setopt($handle, CURLOPT_TIMEOUT, 10);
	curl_setopt($handle, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux
x86_64; rv:45.0) Gecko/20100101 Firefox/45.0");
 
	$response = curl_exec($handle);
	if ($response === false) {
		$httpCode = "error";
	}else{
		$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
	}
 
	curl_close($handle);
	return($httpCode);
}
 
Qualche idea per migliorare il codice?
 
-- 
Sandro kensan 
www.kensan.it
 & 
www.qiqi.it
 geek site
Saluto gli agenti della NSA - Hello NSA - 
www.nsa.gov
 

x86_64; rv:45.0) Gecko/20100101 Firefox/45.0");
 
Prova con un browser più aggiornato.
 
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0".
 
Leonardo <grin>
-- 
 
A terrible beauty is born.
                                     - W. B. Yeats, Easter 1916

 
 
Usa la API di amazon, per esempio attraverso la apai-io.
Sono fatte apposta.
 
Ciao!

 Leonardo <grin>
 
Il 45 è l'ultima versione ESR, quella del mio browser che è aggiornato.
La 52 è l'ultima versione del ramo consumer.



Non volevo appoggiarmi a un servizio esterno per evitare di dovere
aggiornare il codice quando cambiano le API oppure di trovarmi off line
il sito. Poi occorre sottoscrivere TOS che cambiano nel tempo, è tutto
un lavoro.



 
Pensi che i formati delle pagine o gli URLs siano più longevi delle API?
 
Ciao!

La 52 è l'ultima versione del ramo consumer.
 
...ma, provare, hai provato? :-)
 
Leonardo



Provo stasera ma non sono convinto.


 Pensi che i formati delle pagine o gli URLs siano più longevi delle API?
 
Cerco di appoggiarmi a servizi esterni il meno possibile.


 ...ma, provare, hai provato? :-)
 
Ho provato. Mi da sempre 405. Con entrambi gli user agent, sia quello
commentato che quello scommentato.
 
Codice di risposta: *405*
 
Se provo l'accesso tramite browser la pagina è regolarmente visualizzata.
 
Questo il codice:
 
<?php
$link = "
https://www.amazon.de/dp/3864451434
";
 
function httpstatus($link){
	$handle = curl_init($link);
	curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($handle, CURLOPT_NOBODY, TRUE);
	curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
	curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 4);
	curl_setopt($handle, CURLOPT_TIMEOUT, 10);
	//curl_setopt($handle, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux
x86_64; rv:45.0) Gecko/20100101 Firefox/45.0");
	curl_setopt($handle, CURLOPT_USERAGENT, "User-Agent: Mozilla/5.0
(Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0");
 
	$response = curl_exec($handle);
	if ($response === false) {
		$httpCode = "error";
	}else{
		$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
	}
 
	curl_close($handle);
	return($httpCode);
}
$code = httpstatus($link);
echo "Codice di risposta: *";
echo $code;
echo "*";
?>


Usa file_get_contents();

 Usa file_get_contents();
 
non è che curl non funzioni ma su migliaia di link alcuni non funzionano.


 Usa file_get_contents();
 
Ho provato con il solo link di Amazon.de e mi da:
 
 
array(25) {
[0]=> string(29) "HTTP/1.1 301 MovedPermanently"
[1]=> string(14) "Server: Server"
[2]=> string(35) "Date: Wed, 29 Mar 2017 18:22:11 GMT"
[3]=> string(44) "Content-Type: text/html; charset=ISO-8859-15"
[4]=> string(26) "Transfer-Encoding: chunked"
[5]=> string(22) "Connection: keep-alive"
[6]=> string(71) "Strict-Transport-Security: max-age=47474747;
includeSubDomains; preload"
[7]=> string(16) "pragma: no-cache"
[8]=> string(32) "x-amz-id-1: 5CC5Z4CJWN20VQ163X15"
[9]=> string(183) "p3p:
policyref="
https://www.amazon.de/w3c/p3p.xml
",CP="CAO DSP LAW CUR ADM
IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV
INT DEM CNT STA HEA PRE LOC GOV OTC ""
[10]=> string(37) "cache-control: no-cache, no-transform"
[11]=> string(27) "x-frame-options: SAMEORIGIN"
[12]=> string(11) "expires: -1"
[13]=> string(80) "Location:
https://www.amazon.de/Gekaufte-Journalisten-Udo-Ulfkotte/dp/3864451434
"
[14]=> string(32) "Vary: Accept-Encoding,User-Agent"
[15]=> string(32) "HTTP/1.1 503 Service Unavailable"
[16]=> string(14) "Server: Server"
[17]=> string(35) "Date: Wed, 29 Mar 2017 18:22:11 GMT"
[18]=> string(23) "Content-Type: text/html"
[19]=> string(20) "Content-Length: 2178"
[20]=> string(22) "Connection: keep-alive"
[21]=> string(50) "Vary: Content-Type,Host,Accept-Encoding,User-Agent"
[22]=> string(44) "Last-Modified: Tue, 01 Dec 2015 19:40:15 GMT"
[23]=> string(25) "ETag: "882-525db53a5e5c0""
[24]=> string(20) "Accept-Ranges: bytes" }
 
Seguendo il link mi da:
(301->
https://www.amazon.de/Gekaufte-Journalisten-Udo-Ulfkotte/dp/3864451434
)
 
array(10) {
[0]=> string(32) "HTTP/1.1 503 Service Unavailable"
[1]=> string(14) "Server: Server"
[2]=> string(35) "Date: Wed, 29 Mar 2017 18:27:24 GMT"
[3]=> string(23) "Content-Type: text/html"
[4]=> string(20) "Content-Length: 2178"
[5]=> string(22) "Connection: keep-alive"
[6]=> string(50) "Vary: Content-Type,Host,Accept-Encoding,User-Agent"
[7]=> string(44) "Last-Modified: Tue, 01 Dec 2015 19:40:15 GMT"
[8]=> string(25) "ETag: "882-525db53a5e5c0""
[9]=> string(20) "Accept-Ranges: bytes" }
 
Quindi da un 503.


 Ho provato con il solo link di Amazon.de e mi da:
 
A me scarica la pagina.
Uso php 7.0.10.

commentato che quello scommentato.
 
Strano. Perché avevo provato anche io, e con uno mi rimbalzava, ma mettendo lo
stesso user-agent di un Firefox che avevo a tiro, è andata bene.
 
Specificamente, provato ora:
 
 curl "
https://www.amazon.de/dp/3864451434
" -H "Host: 
www.amazon.de
" -H
"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
 
fallisce.
 
curl "
https://www.amazon.de/dp/3864451434
" -H "Host: 
www.amazon.de
" -H
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101
Firefox/52.0"
 
mi restituisce un putiferio di HTML.
 
Ne deduco che il mio test fosse sulla strada giusta - ma incompleto: quel sito
riconosce alcune feature della connessione, e se non gli piacciono n'arimbarza
senza esitazione.
 
Per esempio non gli piace HEAD.
 
In effetti, se metto
 
	curl_setopt($handle, CURLOPT_NOBODY, false);
 
il tuo codice mi ritorna 200.
 
Però, avere a che fare con un sito (o syto) così schizzinoso, non so se ti fa.
 
Voglio dire, che garanzie hai che domani non cambieranno qualche altra cosa?


 
 
Ci riprovo...
Ribadisco che se usavi la libreria che Amazon stessa mette a disposizione già
avevi finito...
 
Ciao!

 Voglio dire, che garanzie hai che domani non cambieranno qualche altra cosa?
 
Sono arrivato pure io alla tua stessa conclusione, ieri sera ho fatto
diverse prove. Con wget da CLI funziona mentre il mio codice non
funzionava per cui ho provato a commentare le setopt più sospette e ho
visto che togliendo il nobody mi dava uno status di 200. Quindi sono
arrivato alla tua stessa conclusione.
 
Adesso però non so più cosa fare. Le opzioni sono diverse, per esempio
se il problema è solo dei link ad amazon potrei ignorare il problema e
pensarlo come limitato.
 
Oppure potrei scaricare il body di tutti i link/siti solo per vedere lo
status con aggravio della pesantezza.
 
Oppure potrei mettere a false CURLOPT_NOBODY solo se l'URL è di amazon.
 
Consigli?


Consigli?
 
Se proprio, metti un controllo sul codice di ritorno; di norma vai di HEAD, se
fallisce [opzionalmente: ed è di Amazon], riprovi con GET, se poi non ce la fa
neanche così lo dai per stecchito.


 neanche così lo dai per stecchito.
 
È lo stesso di quello che ho pensato:
 
		      $tmp = parse_url($link);
		      if (strpos($tmp["host"], "amazon") !== false){
			curl_setopt($handle, CURLOPT_NOBODY, FALSE);
			echo "AMAZON<br>";
		      }else{
			curl_setopt($handle, CURLOPT_NOBODY, TRUE);
		      }
 
Grazie :)
