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

<?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
{"available":true,"price":"161.67"}



En met deze javascript code:

$("[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
<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.

<?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?
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.
De url is zeker goed.
[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.


"test.php?url="+url+"/"


Waarom een slash op het einde van je url

Ik had het eerst zonder maar had ergens gelezen dat ik misschien daardoor de permanently moved error kreeg.
Hielp niet.
Okay, je probeert Amazon te scrapen. Waarschijnlijk zijn er elegantere manieren om dat te doen (webservice?).

Wanneer ik dit in een dummy-bestand zet:
<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:
{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?
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.
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.

Reageren