2

リモート サイトのページで URL を呼び出そうとしています。curl を使用することにしました。リモート サイトでは、URL 変数は次のように表示されます。

$_REQUEST   Array
(
    [var1] => val1
    [amp;var2] => val2
    [amp;var3] => val3
)

呼び出される URL は次のとおりです。

http://site.com/controller/action.php?var1=val1&var2=val2&var3=val3

私はURLで使用していません&が、リクエストグローバルにはそれが含まれているか、ほぼ含まれていることに注意してください。それらのいずれかが必要というわけではありません。amp;&&

curl オブジェクトがフォームにログインし、Cookie を設定し、別のページにフォームを投稿しました。これが、たどる必要がある最後のリンクです。

ここに私が使用しているphpがあります:

    curl_setopt($this->ch, CURLOPT_URL, "http://site.com/controller/action.php?var1=val1&var2=val2&var3=val3");
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($this->ch, CURLOPT_REFERER, "http://site.com/");
    curl_setopt($this->ch, CURLOPT_VERBOSE, 1);
    curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie);
    curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie);
    curl_setopt($this->ch, CURLOPT_POST, 0);
    curl_setopt($this->ch, CURLOPT_HTTPGET, 1);
    $output = curl_exec($this->ch);
    $info = curl_getinfo($this->ch);

この後、別の curl リクエストを実行しましたが、まだログインしているため、問題は Cookie ではありません。$_POST を使用した最後のリクエスト (ログイン フォーム) では、CURLOPT_POST が 0 に、CURLOPT_HTTPGET が 1 に設定されているため、$info からの出力は次のとおりです。

info    Array
(
    [url] => http://site.com/controller/action.php?var1=val1&var2=val2&var3=val3
    [content_type] => text/html; charset=utf-8
    [http_code] => 403
    [header_size] => 403
    [request_size] => 541
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.781186
    [namelookup_time] => 3.7E-5
    [connect_time] => 3.7E-5
    [pretransfer_time] => 4.2E-5
    [size_upload] => 1093
    [size_download] => 3264
    [speed_download] => 4178
    [speed_upload] => 1399
    [download_content_length] => 3264
    [upload_content_length] => 0
    [starttransfer_time] => 0.781078
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

)

$info['url'] をブラウザにコピー アンド ペーストすると機能します。完全に失われ、何時間も失われました。助けていただければ幸いです ;)

4

1 に答える 1

5

次のようにコードを変更してみてください。

$data = array('val1'=>"val1", 'val2'=>"val2", 'val3'=>"val3");
curl_setopt($this->ch, CURLOPT_URL, "http://site.com/controller/action.php");
curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->ch, CURLOPT_REFERER, "http://site.com/");
curl_setopt($this->ch, CURLOPT_VERBOSE, 1);
curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie);
curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie);
curl_setopt($this->ch, CURLOPT_POST, 0);
curl_setopt($this->ch, CURLOPT_HTTPGET, 1);
$output = curl_exec($this->ch);
$info = curl_getinfo($this->ch);

編集

Brad のコメントに従ってカスタム エンコード関数を削除しました。PHP には同じことを行う組み込み関数があるため、必要ありません。

于 2012-04-19T15:06:31.467 に答える