2017-01-30 8 views
0

私は、不動産業者がクライアントのオンラインプレゼンテーションを作成し、zillowの所有サイトであるstreeteasy.comというウェブサイトの例を使用してサイトを作成しています。閉鎖した不動産の売却価格を見るためには、ログインする必要があることを除いて、私が望むすべてを首尾よく掻き集めることができます。ログインは、私が知る限りはセキュリティが非常に低く、ログインすると10年間Cookieを設定します。投稿データと投稿URLを取得するためにChrome開発者ツールを使用しました。cURLログインStreeteasy(zillowの所有サイト)に関する問題

ページがきれいに表示されていますが、最終販売価格を確認するには「登録が約5週間前に完了したことを確認する」と表示されます。ログインすると、メッセージが異なります。私はまだこのコードを動作させることができませんし、なぜ私は考えていません。 cookie.txtファイルはアクセス許可の問題ではないので、WAMPでテストしています。私はちょうど私のブラウザのクッキーを使って自分のクッキーファイルを作成しようとしましたが、ページにアクセスするだけでもまだ運がありませんでした。

$url = "http://streeteasy.com/sale/1253471"; 
$login_url = 'https://streeteasy.com/nyc/user/sign_in'; 
$data = 'utf8=%E2%9C%93&authenticity_token=MYCz6A5PK%2B3I3N%2BgHekaNc4IuQEruBrCPBjSxm1B9dg%3D&do=login&return_to=http%3A%2F%2Fstreeteasy.com%2F&origin=&page_category=&page_type=&boundary=&label=&remember=true&return_to_save_search=&login=john%40telesh.com&password=dman4578'; 

login($login_url,$data); 
echo grab_page ($url); 

function login($url,$data){ 
    $fp = fopen("cookie.txt", "w"); 
    fclose($fp); 
    $login = curl_init(); 
    curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt"); 
    curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($login, CURLOPT_TIMEOUT, 40000); 
    curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($login, CURLOPT_URL, $url); 
    curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($login, CURLOPT_POST, TRUE); 
    curl_setopt($login, CURLOPT_POSTFIELDS, $data); 
    return curl_exec ($login); 
}     

function grab_page($site){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 40); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($ch, CURLOPT_URL, $site); 
    return curl_exec ($ch); 
} 
+0

あなたは、実際のログイン資格情報を投稿するもしかして? – scoopzilla

+0

ログインは機能しますか?出力をチェックしましたか?また、両方の関数はcurl_init()を持ち、1つしか持たず、引数としてcurlを渡すか、グローバルとして設定します。そして、各関数での復帰後に余分なコードが必要なく、決して実行されません。 – sadlyblue

+0

私はそのログイン情報を気にしません、それを保護する理由はありません、それを公開することによって何も得られませんが、見ていただきありがとうございます。 –

答えて

0

(私はダミーのアカウントであると思います...) 最初のオフ、ログインが成功を行うために、あなたはおそらく、それぞれに異なっているあなたは、ログインページに乗る有効「authenticity_token」を、必要としますあなたのコードはHARDCODEDのauthenticity_tokenを持っていますが、これはおそらく以前期限切れになっていて、ブラウザでのみ有効でした。第二に、あなたのlogin()関数は、それが作成する出力バッファが決して終了しないので、SHOULDがWAMPからスクリプトを呼び出すときに500 internal server errorという結果になることがあります。 3番目に、奇妙な理由から、ログイン要求にブラウザのようなacceptヘッダーが含まれている必要があります。たとえば、Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8ですが、カールはデフォルトではAccept: */*と言われています。

サインインページを取得し、サインインページからauthenticity_tokenを解析し(実際にはすべての「入力」タグを解析して)、新しくログインして送信してくださいAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8にログイン要求を送ります。 https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.phpからhhb_curlを使用して

は、ここで働い例です。

<?php 
declare(strict_types = 1); 
require_once ('hhb_.inc.php'); 
$hc = new hhb_curl(); 
$hc->_setComfortableOptions(); 
$hc->exec ('https://streeteasy.com/nyc/user/sign_in'); 
$html = $hc->getResponseBody(); 
$domd = @DOMDocument::loadHTML ($html); 
$inputs = array(); 
foreach ($domd->getElementsByTagName ("input") as $input) { 
    $inputs [$input->getAttribute ("name")] = $input->getAttribute ("value"); 
} 
assert (array_key_exists ('authenticity_token', $inputs)); 
$inputs ['login'] = '[email protected]'; 
$inputs ['password'] = 'dman4578'; 
var_dump ($inputs); 
$hc->setopt_array (array (
     CURLOPT_POST => true, 
     CURLOPT_POSTFIELDS => http_build_query ($inputs), 
     CURLOPT_URL => 'https://streeteasy.com/nyc/user/sign_in', 
     CURLOPT_HTTPHEADER => array (
       'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' 
     ) 
)); 
$hc->exec(); 
$html = $hc->getResponseBody(); 
if (false === strpos ($html, 'You have successfully logged in')) { 
    throw new RuntimeException ('login failed! (could not find `You have successfully logged in` in the response body!'); 
} 
hhb_var_dump ($hc->getStdErr(), $hc->getResponseBody()); 
  • それがログインしたことを証明し、最後にHTMLにログインをダンプそれもYou have successfully logged inをチェックすることによってこれを検証します。応答の文字列。

-editは:価格「のために販売されている」アウト解析するためとして、あなたはそのためのDOMDocumentを使用することができます... HTMLは、とてもその少し面倒くだらないですが、私はそれを得るための方法を発見:

$hc->exec('http://streeteasy.com/sale/1253471'); 
$html = $hc->getResponseBody(); 
$domd = @DOMDocument::loadHTML ($html); 
$sold_for=NULL; 
foreach($domd->getElementsByTagName("div") as $div){ 
    if(false!==strpos($div->getAttribute("class"),'status_sold')){ 
     $sold_for=trim($div->nextSibling->nextSibling->textContent); 
     break; 
    } 
} 
var_dump($sold_for); 

出力:

string(63) "Sold for $16,550,062 

      as of about 5 weeks ago" 
+0

優雅なソリューションをありがとう。私はすべてのアカウントにあなたのアドバイスを取って、私のバージョンを使用して、その偉大な作業をきれいにした。 –

関連する問題