2017-09-05 13 views
0

私はこのウェブサイトhttps://www.machinemart.co.uk/をスクラップしようとしています。特定のデータを取得するためにカートに商品を追加する必要があります。サイトでは、ポストリクエストを使用してカートに商品を追加します。ここでhttps://www.machinemart.co.uk/p/clarke-amf-panel-for-kc6-and-kc10/php curl + post + multipart/form-data + ASP.NETセッション

ヘッダとボディのリクエストの例:私が追加しようとしている製品の

URL

Request Headers: 
Host: www.machinemart.co.uk 
Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate, br 
Referer: https://www.machinemart.co.uk/p/clarke-amf-panel-for-kc6-and-kc10/ 
Content-Type: multipart/form-data; boundary=---------------------------209892343219764726031397980914 
Content-Length: 1224 
Cookie: ASP.NET_SessionId=f3p1y0ib1za3vch4exbue4l3; 
DNT: 1 
Connection: keep-alive 
Upgrade-Insecure-Requests: 1 
------------------------------------- 
Request Body 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="__RequestVerificationToken" 

2MpklOgIiis94EbGlIIoF5N_bzOrFegTpV_YEHTlZysKZrGxeAwBaFg5S4xtnGi8Jth5CEGRn9ETlK_g55jb6k9DcHGO-RR-LXug2roZEQg1 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="ProductId" 

4aaad9a5-ad65-4842-a24a-5f455b263933 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="ProductSku" 

010629550 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="Quantity" 

1 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="SubmitButton" 

Home delivery 
-----------------------------209892343219764726031397980914 
Content-Disposition: form-data; name="ufprt" 

DA81438F81A7BE767B068EED46F4A4CAC24A05FC23BEAFE8B1A4B536FA6EC79AA5C17510979DB132CAC8C33C62E03A07E766C55C45DAE114A63B816F7CADEE9AB165197FBCF088E0FEBAAD9E6D8145291AB9984B8764A82C56C33D9D20394A22D1E148BF3EF97DC02EC48E5C4C491B3368B66B0A750BA6815B049A13F590BC8D6A6F05D3B96F81E0308742BD37D92E81 
-----------------------------209892343219764726031397980914-- 

私は各製品の必要なデータを取得することができています(ID 、sku、token、ufp)、セッションIDを取得しようとしました。これはコードです:ここでは

  $data = '---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"__RequestVerificationToken\"\r\n\r\n'.$request_dataToken.'\r\n---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"ProductId\"\r\n\r\n'.$request_dataProductId.'\r\n---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"ProductSku\"\r\n\r\n'.$request_dataProductSku.'\r\n---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"Quantity\"\r\n\r\n1\r\n---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"SubmitButton\"\r\n\r\nHome delivery\r\n---------------------------17064761399835087311752471201\r\nContent-Disposition: form-data; name=\"ufprt\"\r\n\r\n'.$request_dataUFPRT.'\r\n---------------------------17064761399835087311752471201'; 

//Get the session id 
     $session_id = ''; 
       $curl_handle = curl_init(); 
       curl_setopt($curl_handle, CURLOPT_URL, $request_url); 
       curl_setopt($curl_handle, CURLOPT_POST, TRUE); 
       curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data); 
       curl_setopt($curl_handle, CURLOPT_HEADER, 1); 
       curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
       curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); 
       curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1); 
       curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); 
       $response = curl_exec($curl_handle); 

       // get cookies 
       $cookies = array(); 
       preg_match_all('/Set-Cookie:(\s{0,}.*)$/im', $response, $cookies); 

       curl_close($curl_handle); 

       foreach ($cookies[1] as $cookie){ 

       if(preg_match('/Id\=([a-z0-9]+)\;/', $cookie, $out)){ 

        $session_id = $out[1]; 
       } 
      } 

    //Try to add the product with the session id 
     $curl_handle = curl_init(); 
       curl_setopt($curl_handle,CURLOPT_COOKIE,'ASP.NET_SessionId='.$session_id); 
       curl_setopt($curl_handle, CURLOPT_URL, $request_url); 
       curl_setopt($curl_handle, CURLOPT_POST, TRUE); 
       curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data); 
       // curl_setopt($curl_handle, CURLOPT_HEADER, 1); 
       curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
       curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); 
       curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1); 
       curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); 
       $response = curl_exec($curl_handle); 
       curl_close($curl_handle); 


     //Get the cart page -- Actually empty returns 
       $curl_handle = curl_init(); 
        curl_setopt($curl_handle,CURLOPT_COOKIE,'ASP.NET_SessionId='.$session_id); 
       curl_setopt($curl_handle, CURLOPT_URL, $request_urlCart); 
       //curl_setopt($curl_handle, CURLOPT_POST, TRUE); 
       //curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data); 
       //curl_setopt($curl_handle, CURLOPT_HEADER, 1); 
       curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
       curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); 
       curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1); 
       curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); 
       $response = curl_exec($curl_handle); 
       curl_close($curl_handle); 

       print $response; 

は、変数$データの出力例を示します。

-------------------- ------- 17064761399835087311752471201 \ r \ n内容 - 処理:フォームデータ。名前= \ "__ RequestVerificationToken \" \ r \ n \ r \ nx9RTuiKcC0IJR0OwNFicu6XxPXoOt5dtgaXVEdQxpwRGGv52fdv7IJ9zcjkz1HnYaLX5yaz2e0pXCZFLi_judYwQLT - vCg2_xUMzsaT5Rc1 \ r \ n --------------------------- 17064761399835087311752471201 \ r \ nContent-Disposition:フォームデータ。名前= \ "ProductId \" \ r \ n \ r \ n4aaad9a5-ad65-4842-a24a-5f455b263933 \ r \ n ----------------------- ---- 17064761399835087311752471201 \ r \ n内容 - 配置:フォームデータ。名前= \ "ProductSku \" \ r \ n \ r \ n010629550 \ r \ n --------------------------- 17064761399835087311752471201 \ r \ nContent-Disposition:フォームデータ。名前= \ "数量\" \ r \ n \ r \ n1 \ r \ n --------------------------- 17064761399835087311752471201 \ r \ nContent-Disposition:フォームデータ。名前= \ "SubmitButton \" \ r \ n \ r \ n宅配\ r \ n --------------------------- 17064761399835087311752471201 \ r \ nContent-Disposition:フォームデータ。名前= \ "ufprt \" \ rを\ nは\ rを\ nF5CA6BAC0C5C12E3B885CE69FE5E0D24480EA23E895AD3DA72BFDF6832B56CD8A70F1183BFA03F61AD353FA86DCDD71CA105A86A0274A27152E68A66449191BD8167B6E06A2982B326BBC1E47C7C9AB3984A7BB17ECB9E153496542F7DE8B00D97FEFAE8B6120A6C3B87CAA74E875E68BE894586468FD0704B11346A6E1BC902BC538D64CA23DD87068DCA52CC5AC19F \ rを\ nは--------------------------- 17064761399835087311752471201

リクエストにヘッダを追加しようとしましたが、配列としてパラメータを送信しました...しかし、まだ動作しません。何が悪いですか?

答えて

0

あなたのためのソリューション私は(任意の製品ページのURL 1.Put

(私はコード内のコメントでエラーが発生しやすい部分にマークを付ける)そのコードをより強固にするために、いくつかの余分な作業が必要と言っているが、製品リストからは解決策があるかもしれませんが、この例は製品ページを通って動作します。

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_URL,"https://www.machinemart.co.uk/p/clarke-ctj2qlp-2-tonne-quick-lift-low-profile/"); //type your url here as explained above 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13"); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch,CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/extra path here/'.$_COOKIE['PHPSESSID'].'.txt'); 
curl_setopt($ch,CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/extra path here/'.$_COOKIE['PHPSESSID'].'.txt'); 
$data = curl_exec($ch); 
curl_close($ch); 

前のフラグメントは、URLを取得し、また、我々は仕事にカート機能について順にPHP DOM library、必要なすべてのフィールドを利用して、フォームからデータを取得しますCOOKIE

2.Nextを設定しますフォーム要素内にあります。私の例では、私は2番目のフォーム要素は、実際の製品形態であることを前提としていますが、ご丁寧に正しい

libxml_use_internal_errors(true); 
$siteData = new DOMDocument(); 
$siteData->loadHTML($data); 

$forms = $siteData->getElementsByTagName("form"); 
$inputs = $forms->item(1)->getElementsByTagName("input"); 
$search = array(); 
for($i=0;$i<$inputs->length;$i++){ 
    if($inputs->item($i)->getAttribute("class")!="greyBtn"){ 
     $search[$inputs->item($i)->getAttribute("name")] = $inputs->item($i)->getAttribute("value"); 
    } 
} 

$submitURL = "https://www.machinemart.co.uk".$forms->item(1)->getAttribute("action"); 

コードは、すべての名前と値を取得し、配列の名前$検索に追加された1チェックしなければなりませんまた、$ submitURLという名前の別の変数を作成します。これは、手順3のカールが引数として使用するURLです。

3.私たちはcurlを再度呼び出して、posturlとして$ submitURL変数と$ search配列をターゲットURLとして提供します。(CSSが欠落していることから、醜いが)あなたが製品がカートにあることがわかりますあなたはそれをエコー場合

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_URL,$submitURL); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($search)); 
curl_setopt($ch,CURLOPT_POST, true); 
curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13"); 
curl_setopt($ch,CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
curl_setopt($ch,CURLOPT_HEADER, 0); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch,CURLOPT_COOKIEJAR,LOG_DIR.'/'.$_COOKIE['PHPSESSID'].'.txt'); 
curl_setopt($ch,CURLOPT_COOKIEFILE,LOG_DIR.'/'.$_COOKIE['PHPSESSID'].'.txt'); 

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

echo $data; 

$データ変数は、結果としてページを保持しています。