2013-10-06 4 views
11

Я очищаю сайт, используя curl (через PHP), и некоторая информация, которую я хочу, представляет собой список продуктов, который по умолчанию показывает только первые. Остальное передается пользователю, когда они нажимают кнопку, чтобы получить полный список продуктов, который запускает вызов ajax для возврата этого списка.Подражание ajax-вызову с помощью Curl PHP

Вот в двух словах JS они используют:

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']); 
    } 
} 
}); 

Вот мой PHP скрипт:

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); 

Это создает страницу ошибки на сайте. Я думаю, что основные причины могут быть следующими:

  • Они проверяют, является ли это запрос Ajax (без понятия, как это исправить)

  • Маркер должен быть в заголовке, а не в почтовых переменных

Есть идеи?

EDIT: вот рабочий код:

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); 

ответ

11

Чтобы установить маркер запроса проверки в качестве заголовка, более точно имитировать запрос AJAX, и установить тип содержимого в формате JSON, использование CURLOPT_HEADER.

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

Я также заметил, что вы избыточно установка CURLOPT_POST ложь на линии 7 вашего кода, и что сообщение данных вы отправляете не в формате JSON. Вы должны иметь:

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

Спасибо - он работал с небольшим изменением (с использованием json_encode на $ postVariables как массив, так как ваше предложение по-прежнему возникают некоторые ошибки) – Davor

+0

@Davor: Не могли бы вы показать нам окончательный код, включая изменения вы сделали, пожалуйста? – pablofiumara

+1

@pablofiumara Я редактировал свой вопрос, чтобы добавить окончательный рабочий код – Davor

Смежные вопросы