2013-10-06 15 views
11

Ich kratze eine Website mit Curl (über PHP) und einige Informationen, die ich will, ist eine Liste von Produkten, die standardmäßig nur die ersten zeigt. Der Rest wird an den Benutzer übergeben, wenn er auf eine Schaltfläche klickt, um die vollständige Liste der Produkte zu erhalten, wodurch ein Ajax-Aufruf ausgelöst wird, der diese Liste zurückgibt.Imitieren eines Ajax Anruf mit Curl PHP

ist hier in aller Kürze die JS sie verwenden:

headers['__RequestVerificationToken'] = token; 
$.ajax({ 
type: "post", 
url: "/ajax/getProductList", 
dataType: 'html', 
data: JSON.stringify({ historyPageIndex: 1, displayPeriod: 0, productsType: All }), 
contentType: 'application/json; charset=utf-8', 
success: function (result) { 
    $(target).html(""); 
    $(target).html(result); 
}, 
beforeSend: function (XMLHttpRequest) { 
    if (headers['__RequestVerificationToken']) { 
     XMLHttpRequest.setRequestHeader("__RequestVerificationToken", headers['__RequestVerificationToken']); 
    } 
} 
}); 

Hier ist mein PHP-Skript:

curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieLocation); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieLocation); 
curl_setopt($ch, CURLOPT_POST, false); 
curl_setopt($ch, CURLOPT_URL, 'https://www.domain.com/Applications/ViewProducts'); 
curl_setopt($ch, CURLOPT_REFERER, 'https://www.domain.com/'); 
$webpage = curl_exec($ch); 
$productsType = trim(find_by_pattren($webpage, '<input id="productsType" name="productsType" type="hidden" value="(.*?)"')); 
$token = trim(find_by_pattren($webpage, '<input name="__RequestVerificationToken" type="hidden" value="(.*?)"')); 

$postVariables = 'productsType='.$productsType. 
'&historyPageIndex=1 
&displayPeriod=0 
&__RequestVerificationToken='.$token; 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postVariables); 
curl_setopt($ch, CURLOPT_URL, 'https://www.domain.com/ajax/getProductList'); 
curl_setopt($ch, CURLOPT_REFERER, 'https://www.domain.com/Applications/ViewProducts'); 
$webpage = curl_exec($ch); 

Dies erzeugt eine Fehlerseite mit der Website. Ich denke, die Hauptgründe dafür, dass sein könnten:

  • Sie prüfen, ob es eine Ajax-Anforderung (keine Ahnung, wie das beheben)

  • Das Token im Header sein muss und nicht in den POST-Variablen

Irgendeine Idee?

EDIT: Hier ist der Arbeitscode:

curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieLocation); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieLocation); 
curl_setopt($ch, CURLOPT_URL, 'https://www.domain.com/Applications/ViewProducts'); 
curl_setopt($ch, CURLOPT_REFERER, 'https://www.domain.com/'); 
$webpage = curl_exec($ch); 
$productsType = trim(find_by_pattren($webpage, '<input id="productsType" name="productsType" type="hidden" value="(.*?)"')); 
$token = trim(find_by_pattren($webpage, '<input name="__RequestVerificationToken" type="hidden" value="(.*?)"')); 

$postVariables = json_encode(array('productsType' => $productsType, 
'historyPageIndex' => 1, 
'displayPeriod' => 0)); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest", "Content-Type: application/json; charset=utf-8", "__RequestVerificationToken: $token")); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postVariables); 
curl_setopt($ch, CURLOPT_URL, 'https://www.domain.com/ajax/getProductList'); 
curl_setopt($ch, CURLOPT_REFERER, 'https://www.domain.com/Applications/ViewProducts'); 
$webpage = curl_exec($ch); 

Antwort

11

Um die Anforderung Überprüfungscode als Header gesetzt, mehr imitieren eng eine AJAX-Anforderung, und stellen Sie den Inhaltstyp zu JSON, Verwendung CURLOPT_HEADER.

curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest", "Content-Type: application/json; charset=utf-8", "__RequestVerificationToken: $token")); 

ich auch feststellen, dass Sie überflüssigerweise CURLOPT_POST auf false in Zeile 7 des Codes einstellen, und dass die Post Daten, die Sie zu senden sind nicht im JSON-Format. Sie sollten:

$postVariables = '{"historyPageIndex":1,"displayPeriod":0,"productsType":"All"}'; 
+0

Dank - es mit einer leichten Veränderung gearbeitet (json_encode auf $ postVariables als Array verwenden, wie Sie Ihren Vorschlag noch einige Fehler erhoben) – Davor

+0

@Davor: Können Sie uns zeigen den endgültigen Code inklusive der Veränderung hast du gemacht, bitte? – pablofiumara

+1

@pablofiumara Ich habe meine Frage bearbeitet, um den endgültigen Arbeitscode hinzuzufügen – Davor