4

PHPでcURL経由でPOSTDATAを送信しようとしていますが、投稿が送信されていないと思います

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$t = curl_exec($ch);

理由はわかりませんが、ページにログインしようとしていますが、$t をダンプすると、フォームが常に表示されます。curl_error は空です。これをデバッグするにはどうすればよいですか? ログインしようとしているページは私のものではありません!


私はcURLとそのOKをエミュレートするローカルフォームを持っています:

<form action="$url" method="POST">
  <input type="hidden" name="username" value="$uspw" />
  <input type="hidden" name="password" value="$uspw" />
  <input type="submit" value="Send" />
</form>

$urlでログイン!これは、cURL で POSTFIELDS に送信する $data です。

$data = array('username' => $uspw,
              'password' => $uspw);

はい..ユーザーとパスワードは同じです


受信したヘッダー:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Sun, 25 Nov 2012 05:23:19 GMT
Server: Apache
Cache-Control: no-cache="set-cookie"
Content-Length: 4822
Set-Cookie: SESSIONID_portalApp=xxxxxx!-xxx!xxx; path=/
Content-Language: en
X-Powered-By: Servlet/2.4 JSP/2.0
Content-Type: text/html; charset=ISO-8859-1

この後、私は再びすべてのフォームを受け取ります...


$data = array('username' => $uspw,
    'password' => $uspw);


$header = array('Origin: xxx',
        'Content-Type: application/x-www-form-urlencoded',
        'Connection: keep-alive',
        'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Cache-Control: max-age=0',
        'Except:',
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Accept-Encoding:gzip,deflate,sdch',
        'Accept-Language:es-ES,es;q=0.8',
        );

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
curl_setopt($ch, CURLOPT_COOKIEJAR, 'xxx.txt');
curl_setopt($ch, CURLOPT_REFERER, 'xxxx');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$t = curl_exec($ch);

ありがとう!

4

2 に答える 2

1

ブラウザなしでサードパーティのシステムにログインしようとしているようです。

これが機能しない可能性が非常に高いのは、セッション Cookie を確立するという、期待どおりのことをしていないためです。正しくログインしている可能性がありますが、リダイレクト時に別の操作を行うように Cookie に指示していないため、リモート サイトがフォームを再度表示している可能性があります。ヘッダーはこれを説明しています:

セット Cookie: SESSIONID_portalApp=xxxxxx!-xxx!xxx; パス=/

使用する cURL 用の Cookie ファイルを作成し (のようなものを使用)、ディレクティブtempnam()を使用してその場所を cURL に伝えます。CURLOPT_COOKIEJARトラブルシューティングの追加の方法として、ブラウザーから既存の Cookie を取得して試すこともできます。

cURL を初期化する前にこれを追加します。

$cookieFile = tempnam('/dev/shm', 'curlCookie_'); 

次に、それを使用するように cURL に指示します。

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);

/dev/shm再起動すると消去されるため、作成できる場所ならどこにでも作成できると提案しました。不要になったら削除するように注意してください。プレフィックスを変更して、個々のファイルを個々のリクエスト (タイムスタンプ、PID など) に関連付けやすくすることもでき、デバッグに便利です。

また、ユーザー エージェント文字列を、リモート サイトで受け入れられることがわかっているものに設定してください。ブラウザが必要であることを忘れないでください。そのため、ブラウザのように動作することを確認する必要があります。コメントで示唆されているように、true を設定するCURLOPT_FOLLOWLOCATIONことはおそらく良い考えです。

それでもうまくいかない場合は、ブラウザで通常どおりにアクションを実行し、ページをよく見てください。セッションを適切に構築するには JS が必要である可能性があります..その時点で、cURL を使用するだけでは不運です。

于 2012-11-25T09:16:10.513 に答える
0

フォーム ページにアクセスし、同じcurl リソースでポスト リクエストを実行します。また、次の設定を追加します。

curl_setopt($ch, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "valid user agent");
于 2012-11-25T13:28:54.493 に答える