2017-05-26 3 views
-1

ウェブスクレイプRubiesをしようとすると、ログインできなくなります。私はなぜ私ができないのか全く分かりませんが、ここでは私が使用しているcURLオプションがあります。誰かが問題を見たら、私は大いに感謝します!ウェブスクレイプでウェブサイトにアクセスする

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://www.rubies.com/customer/account/loginPost/", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HEADER => true, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_POST => 1, 
    CURLOPT_POSTFIELDS => array('form_key' => "****", "login[username]" => "****", "login[password]" => "****", "persistent_remember_me" => 'on', "send" => ''), 
    CURLOPT_FOLLOWLOCATION => 1, 
    CURLOPT_COOKIEFILE => 'cookie.txt', 
    CURLOPT_COOKIEJAR => 'cookie.txt', 
    CURLOPT_HTTPHEADER => array(
     'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
     'Host: www.rubies.com', 
     'Content-Type: application/x-www-form-urlencoded', 
     'Origin: https://www.rubies.com', 
     'Referer: https://www.rubies.com/customer/account/', 
     'Connection: keep-alive', 
     'Cache-Control: no-cache', 
     'Upgrade-Insecure-Requests: 1' 
    ), 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLINFO_HEADER_OUT => true 
)); 

私は現在、ハードエンコード形式のキーを持っているが、私は、ログインに応じて、フォームのキーを変更する必要があるかどうかわかりません。投稿からの返信は空ですが、私は2回リダイレクトされます。アカウントページに移動したら、ログインに戻ります。誰かが私に何が起こっているか教えてもらえれば、私はそれを感謝するでしょう。私は彼らが何らかの基本認証システムを使っていると思う。

答えて

1

fiddler2または別のパケットスニファを使用して、cURLトラフィックを要求と応答の両方で調べます。それをブラウザを使ってトラフィックと比較する。

おそらく、フィールドを入力しなかったかミスタイプしたか、またはCookieの設定や追加データの投稿などのフォローアップの手順を忘れた可能性があります。

ログイン用のコードでは、ログインページの取得、ワンタイムトークンのスクラップ(ページリクエストごとの変更)、その後の最初のステップとしての投稿が必要になることがよくあります。これにより、スクリプトコードがCookieを設定したり、自動的に他のデータを送信したりする可能性があります。

+1

実際には、私の経験では、99%の時間で、クロムの開発ツールのネットワークタブで十分です:)(そして、そうでない場合、あなたが言うように、Fiddler) – hanshenrik

+0

合意して、私は主にChromeのF12最初はブラウザトラフィックのため、読むのがはるかに簡単です。しかしそれはトラフィックのcURLバージョンを表示しません。 –

1

あなたはいくつかの間違いをしています。あなたはPOST本体がapplication/x-www-form-urlencodedエンコードされているサーバーに言うが、あなたはCURLOPT_POSTFIELDSに配列を与える

は、そう、あなた実際にをサーバーに送信するもの、エンコードmultipart/form-dataです。 curlに投稿データをapplication/x-www-form-urlencodedとして送信し、CURLOPT_POSTFIELDSのデータをurlencodeする - 特に配列を使用すると、http_build_queryがこれを行います。さらに、multipart/form-dataまたはapplication/x-www-form-urlencodedをPOSTする場合は、コンテンツタイプのヘッダーをまったく設定しないでください。カールは、使用されているエンコーディングに応じて自動的に自動的に行います。そのメモでは、手動でUser-Agentヘッダーを設定しないでください。ただし、CURLOPT_USERAGENTを使用してください。 Hostヘッダーのいずれかを設定しないでください。curlは自動的にそれを生成し、あなたは間違いを起こす可能性があります。 また、ここで偽のRefererヘッダーを送信すると、リファラーが偽造されたときに検出できるWebサイトがいくつかありますが、実際にはCURLOPT_AUTOREFERERを設定して実際のリクエストを行う方が安全です。実際にhttps://www.rubies.com/customer/account/loginPost/にログインするには、クッキーセッションとform_keyのコードが必要ですが、form_keyはおそらくあなたのクッキーセッション、おそらくはCSRFトークンのフォームに結び付けられていますが、どちらのコードも取得する必要はありません。また、実際にはrefererが必要な場合があります。

<?php 
declare(strict_types = 1); 
require_once ('hhb_.inc.php'); 
$hc = new hhb_curl(); 

$hc->_setComfortableOptions(); 
$hc->exec ('https://www.rubies.com/customer/account/login/'); // << getting a referer, form_key (csrf token?), and a session. 
$domd = @DOMDocument::loadHTML ($hc->getResponseBody()); 
$csrf = NULL; 

// extract the form_key 
foreach ($domd->getElementsByTagName ("form") as $form) { 
    if ($form->getAttribute ("class") !== 'form form-login') { 
     continue; 
    } 
    foreach ($form->getElementsByTagName ("input") as $input) { 
     if ($input->getAttribute ("name") !== 'form_key') { 
      continue; 
     } 
     $csrf = $input->getAttribute ("value"); 
     break; 
    } 
    break; 
} 
if ($csrf === NULL) { 
    throw new \RuntimeException ('failed to extract the form_key token!'); 
} 

$hc->setopt_array (array (
     CURLOPT_POST => true, 
     CURLOPT_POSTFIELDS => http_build_query (array (
       'form_key' => $csrf, 
       'login' => array (
         'username' => '???', 
         'password' => '???' 
       ), 
       'persistent_remember_me' => 'on', 
       'send' => '' // ?? 
     )) 
)); 

$hc->exec ('https://www.rubies.com/customer/account/login/'); 
hhb_var_dump ($hc->getStdErr(), $hc->getResponseBody()); 

EDIT:https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.phpからhhb_curlを使用して

、 は、ここで私は iは上記のミスのどれをやっていない、実際のユーザ名/パスワードで、ログインすることができるだろうと思うサンプルコードです: URLを修正しましたが、元のコードは間違いなく動作しませんでしたが、今はそれが必要です。

関連する問題