php cURL request error 301 via code, niet via browser

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

J D

J D

09/06/2020 23:23:52
Quote Anchor link
Ik heb een script om gegevens van een site te halen.
Wanneer ik manueel naar test.php krijg ik deze gegevens te zien als json, maar wanneer ik dit via javascript doe geeft de cURL request een error 301.

Dit is test.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
header('Content-Type: application/json');

$url = $_GET['url'];

$result = array();

$pagina = loadFile($url);

$info = false;
if(strpos($pagina, 'Op voorraad')!==false){
$info = true;
}


$pos2 = strpos($pagina,"a-size-medium a-color-price");

$price = substr($pagina,$pos2+30,100);
$price = str_replace(' ', '', $price);
$price = substr($price,5,10);
$price = strtok($price, '<');
$price = str_replace(",",".",$price);
$price = str_replace("\n","",$price);

$result = array('available'=>$info,'price'=>$price);

echo json_encode($result);

function
loadFile($url) {
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);

  $data = curl_exec($ch);
  curl_close($ch);

  return $data;
}

?>

via de browser toont dit
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{"available":true,"price":"161.67"}



En met deze javascript code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
$("[data-product]").each(function( index ) {
    var url= $( this ).data('url');

    $.post("test.php?url="+url+"/", {}, function(data, status){
        console.log(data);
    });    

  });

Geeft de cUrl request enkel dit terug
Quote:
<html>\r\n<head><title>301 Moved Permanently<\/title><\/head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently<\/h1><\/center>\r\n<hr><center>Server<\/center>\r\n<\/body>\r\n<\/html>\r\n



Een enkele request in plaats van loopen geeft hetzelfde resultaat.
Vanuit een php-script de json opvragen geeft ook 301.
Follow redirects in curl heeft geen effect.

De json laden in een iframe geeft ook 301, maar met file_get_contents ipv curl werkt dit wel.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php
echo '<iframe src="[MIJNSITE]/test.php?url='.$product['url'].'/"></iframe>';?>

file_get_contents met jquery post lukt dan weer niet.

Iemand die me hierbij kan helpen?
Gewijzigd op 10/06/2020 00:00:00 door - Ariën -
 
PHP hulp

PHP hulp

04/10/2024 07:03:26
 
Thomas van den Heuvel

Thomas van den Heuvel

09/06/2020 23:35:41
Quote Anchor link
Komt de URL wel goed over? Dien je die niet te URL-encoden? En waarom doe je een $.post()? Waarom geen $.ajax() met methode GET, waarbij je de URL als parameter meegeeft (die dan automatische ge-URL-encode wordt waarschijnlijk)? En $_GET URL-decode alles automatisch voor je. Wat zeggen de console_log()s? Wachten alle functies wel op resultaten?

Maak je code wat "modinger" zodat je dit alles wat beter kunt debuggen, begin hierbij wellicht met de URL.
 
J D

J D

09/06/2020 23:48:19
Quote Anchor link
De url is zeker goed.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[MIJNSITE]test.php?url=https://www.amazon.nl/dp/B07XRR7N5V


Ajax heb ik ook geprobeerd, onder andere om async uit te zetten, dit gaf ook geen verschil.
De logs tonen niets.
Ik krijg hetzelfde resultaat als ik om de 10 seconden de post verstuur in javascript.

Wanneer de test werkt zal ik alle code opschonen, nu ben ik vanalles aan het proberen maar geraak er niet aan uit.

Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht. Quote-tags zijn bedoeld voor citeren van reacties.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 10/06/2020 00:00:27 door - Ariën -
 
Jan R

Jan R

10/06/2020 10:26:59
Quote Anchor link
Quote:
"test.php?url="+url+"/"


Waarom een slash op het einde van je url
 
J D

J D

10/06/2020 10:32:13
Quote Anchor link
Ik had het eerst zonder maar had ergens gelezen dat ik misschien daardoor de permanently moved error kreeg.
Hielp niet.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/06/2020 13:33:40
Quote Anchor link
Okay, je probeert Amazon te scrapen. Waarschijnlijk zijn er elegantere manieren om dat te doen (webservice?).

Wanneer ik dit in een dummy-bestand zet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="url-test" data-url="https://www.amazon.nl/dp/B07XRR7N5V">whatever</div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
    $('div.url-test').each(function() {
        var url = $(this).data('url');
        $.post("test.php?url="+url+"/", {}, function(data, status) {
            console.log(data);
        });
    });
});
//]]>
</script>

Krijg ik het volgende terug:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{available: true, price: "ockBuyingP"}

Dus geen idee wat jij anders doet.

Weet je zeker dat cURL goed werkt in combinatie met HTTPS, want het uitvoeren van een cURL-request op een niet-beveiligde site en een site met HTTPS zijn twee compleet verschillende dingen.

Misschien ben je ondertussen deels geblacklist omdat je op meerdere pagina's aan het hameren bent?
 
J D

J D

10/06/2020 13:50:49
Quote Anchor link
Inderdaad, ik heb twee manieren om de prijs te krijgen, dit zou ik moeten hebben en krijg ik ook wanneer ik het script oproep in mijn browser of via iframe.
Wanneer ik in code het script raadpleeg met een post (of als functie in php) krijg ik die 301 error.

Ik weet dat ze een product advertising api hebben, maar daarvoor moet je voldoen aan bepaalde voorwaarden.
Daarbij wil ik ook gewoon wat bijleren.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/06/2020 14:06:28
Quote Anchor link
Dan zou ik toch de JavaScript variabele url eens inspecteren (wat zegt console.log?) en ook $_GET['url'] eens dumpen, mogelijk gaat daar iets mis dan, maar zou niet weten wat.

Het zou niet uit moeten maken hoe je "test.php" aanroept.
Gewijzigd op 10/06/2020 14:07:03 door Thomas van den Heuvel
 
J D

J D

10/06/2020 14:17:19
Quote Anchor link
Nu lazy load ik iframes in een verborgen div en in hun onload haal ik de json string op.
Dit is behoorlijk omslachtig, maar werkt voorlopig.

Aan de url ligt het niet.
Ik dacht misschien nog dat amazon controlleerde als je de site effectief via je browser bezoekt, maar na dit te volgen ook geen resultaat:
https://stackoverflow.com/questions/2440729/php-curl-how-can-i-emulate-a-get-request-exactly-like-a-web-browser
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.