web-dev-qa-db-ja.com

PHPのcURLでセッションを維持する方法は?

どのようにしてcURLでセッションを維持できますか?

私はサイトのログイン詳細を送信して正常にログインするコードを持っています。続行するには、サイトでセッションを維持する必要があります。

これは、cURLを使用してサイトにログインするために使用した私のコードです

  <?php  
        $socket = curl_init();
        curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_POST, true);
    curl_setopt($socket, CURLOPT_USERAGENT, $agent);
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX");
    curl_setopt($socket, CURLOPT_COOKIESESSION, true);
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt");
    $data = curl_exec($socket);
    curl_close($socket); 
   ?>
22

これが私がこれを行うために見つけた最良の方法です link

下のテキストは blogpost のコンテンツの「リミックス」バージョンです。

_ $useragent = $_SERVER['HTTP_USER_AGENT'];
 $strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';

session_write_close();

$ch = curl_init();
$ch = curl_init($rssFeedLink); 
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT, $useragent);
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );

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

session_write_close()は何をしますか?現在のセッションを終了し、セッションデータを保存します。どうやら、PHPは、複数のスクリプトがセッションで遊んでいるときは気に入らないので、それをロックします。session_write_closeを置くと、現在のセッションが確実に保存され、取得して使用できます。

session_write_close()を使用しない場合、現在のセッションIDを使用する代わりに、新しいセッションIDが生成されます。

また、[〜#〜] phpsessid [〜#〜]は、セッション変数の名前に置き換える必要があります。 OWSAP recommandations によると、anIdのようなより一般的なものになるはずです。

場合によっては、投稿にユーザーエージェントを送信する必要があるため、_CURLOPT_USERAGENT_パラメーターを含めました。

これは、セッションでCURLを実行する方法です

//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

私はこれをImpressPagesで見ました

14
raveren

フォルダーを参照せずにcookies.txtファイルを参照しているので、筆者は、書き込みできないフォルダー内のファイルに書き込もうとしていると思います。したがって、最初に実際にcookies.txtファイルが見つかるかどうか、また、予想されるセッションCookieが含まれているかどうかを確認してください。

2
wimvds

私はおそらくそのコードを関数に移動します。ログインに成功すると、cookie.txtファイルにあるcookieに関連付けられたセッションができます。後続のリクエストでは、そのcookieファイルを使い続けるだけで、そのサイトで有効なセッションができるはずです。

0
Sabeen Malik