2013-10-06 10 views
11

curl(PHP経由)を使用してサイトを削り取っています。私が必要とする情報は、デフォルトでは最初の数個だけを表示する製品のリストです。残りは、ユーザーがボタンをクリックして製品の完全なリストを取得すると、ユーザーに渡され、ajax呼び出しによってそのリストが返されます。ここでCurlでajax呼び出しを模倣する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")); 

私はまた、あなたが過剰に自分のコードの行7にfalseにCURLOPT_POSTを設定し、あなたが送信しているポストデータをJSON形式になっていないことをしていることに気づきます。あなたは持っている必要があります。

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

感謝 - (あなたの提案がまだいくつかのエラーが発生したとして、配列として$ postVariablesのjson_encodeを使用して)、それはわずかな変化で働いていた – Davor

+0

@Davor:あなたは私たちに変化を含めた最終的なコードを示してもらえあなたは作った? – pablofiumara

+1

@pablofiumara私は最終的な作業コードを追加するために私の質問を編集しました – Davor