0

Zencart で実行されているサイトのパスワードで保護された領域にログインし、html を文字列形式で取得できるようにするスクリプトを作成しようとしています。これまでのところ、HTML ページは .html ファイルとしてダウンロードされますが、ページのパブリック バージョンのみがダウンロードされます (つまり、正常にログインしていません)。これは HTTPS であり、これが機能しない理由の一部である可能性があると思います。スクリプトの何が問題なのですか?必要な CURL 設定は何ですか (残念ながら、PHP の CURL に関するドキュメントはほとんどありません :( )

<?php
$username = "xxxx@gmail.com";
$password = "xxxxx";
$securityToken = "b6afe5babdd1b6be234d1976586fb1f1";
$loginUrl =  "https://www.xxxxxxx.com.au/index.php?main_page=login&action=process";

//init curl
$ch = curl_init();

//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);

// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);

//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email_address='.$username.'&password='.$password.'&securityToken='.$securityToken);

//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie122.txt');

//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//execute the request (the login)
$store = curl_exec($ch);

//the login is now done and you can continue to get the
//protected content.

//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, 'http://www.xxxxxxx.com.au/index.php?main_page=product_info&products_id=1488');

//execute the request
$content = curl_exec($ch);

//save the data to disk
file_put_contents('test122.html', $content);

if(curl_error($ch)) {
$error = curl_error($ch);
echo $error;
}


?>
4

3 に答える 3

0

httpsサイトでログインするには、いくつかの手順に従う必要があります

証明書をエクスポートします。

ブラウザーでサイトに移動します (私の例では FF)。「カギ」アイコン > [セキュリティ] > [証明書の表示] > [詳細] > [エクスポート] をダブルクリックします。X.509 として保存します。

スクリプトが表示できる場所にアップロードします。

それから加えて

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/path/to/certificateCA.crt");
于 2013-04-15T11:05:39.057 に答える
0

別の URL とデータを試してください。http_build_query() を使用します。

$loginUrl =  "https://www.xxxxxxx.com.au/index.php";
...
$args = array(
  'main_page'     => 'login',
  'action'        => 'process',
  'email_address' => $username,
  'password'      => $password,
  'securityToken' => $securityToken
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($args));

そして、おそらく必要です:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

そして役に立つかもしれません:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
于 2013-04-15T10:48:53.660 に答える
0

完全な例の動作:

 $ch = curl_init($url);

    $headers = array();

    //post
    $post = 'a=b&d=c';
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=utf-8';
    $headers[] = 'Content-Length: ' . strlen($post);

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 

    //if get
   // $headers[] = 'Content-type: charset=utf-8';   

   $headers[] = 'Connection: Keep-Alive';

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// Follow redirects
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);// Set referer on redirect
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);// Stop after x redirects
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);// Stop after x seconds

    //username and password (if any):
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

    //https
    $https = strpos($url, "https://");
    if($https !== false){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    } 

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

    echo($response);
于 2013-04-15T10:54:44.373 に答える