9

私はこのタスクにほぼ 3 日間取り組んできましたが、基本的な cURL スキルが欠けているようです。

私はから始めます:

IE の F12 では、最初のページに 2 つの POST が表示されます: (最初のページがリダイレクトであるはずの 302 を取得していることに気付き、cURL では 200 しか取得しません)

キャプチャを埋める:

2 ページ目 (キャプチャ後):

トラフィック:

これは私のコードです(初期段階では機能しないため、先に進むことはできません):

GETWeb サイトにアクセスしている (cURL を使用して)自分のページに送信する特別なフォームを作成しました。

$id=$_GET['id']; // getting the biznumber
$humanCode=$_GET['nobot'];

$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***");


// setting some https to be able to access the website from my local computer.
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, "c:/xampp/htdocs/CAcerts/curl-ca-bundle.crt");

// I know the values for the ASPX vars like __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE are arbitrary now. I need to take care of that but I don't yet know how.

$postarr= array (
                "__EVENTTARGET"=>"",
                "__VIEWSTATE=" =>"%2FwEPDwULLTEzMzI2OTg4NDYPZBYCZg9kFgQCBA8PZBYCHgdvbmNsaWNrBQxnb1RvTWl2emFrKClkAgYPD2QWAh8ABQxnb1RvTWl2emFrKClkZM6iZZ0Qaf2CpfXoJJdZ0IqaWsDO",
                "__EVENTARGUMENT=" =>"",
                "__EVENTVALIDATION" =>"%2FwEWBQKgysLGCwL2r7SGDQLh4ri%2BAwLWws7NDwLWwpLPD%2F1HuCAFYzs2seaziWbYEXjDfigP",
                "hidUrlFileIshurim"=>"https%3A%2F,
"cod"=>"3322"
                    );

$fields_string='';
foreach($postarr as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');

curl_setopt($curl, CURLOPT_POST      ,1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);

curl_setopt($curl, CURLOPT_TIMEOUT, 10);

curl_setopt ($curl, CURLOPT_USERAGENT, "User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)");

// I made a cookie file and it seems to work
$cookiefile = "d:/cookie.txt";
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);

curl_setopt($curl, CURLOPT_FRESH_CONNECT , 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION  ,1);

curl_setopt($curl, CURLOPT_HEADER      ,1);  // DO NOT RETURN HTTP HEADERS
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$temp=curl_exec($curl);
$info = curl_getinfo($curl);

$html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8'); 
echo "ERRCODE: ".curl_error($curl);
echo '<br /><br />';
echo "INFO : ";
print_r($info);
echo '<br /><br />';
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
echo "CODE: ".$httpcode;
echo '<br /><br />';
echo "CODE: ".$httpcode;
echo '<br /><br />';
echo "VARS: ".$vars;
echo '<br /><br />';
//echo $html;

curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***");
curl_setopt($curl, CURLOPT_FRESH_CONNECT , 0);

echo "<br /><br /><b>2nd</b><br /><br />";
$temp=curl_exec($curl);
$info = curl_getinfo($curl);

$html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8'); 
echo "ERRCODE: ".curl_error($curl);
echo '<br /><br />';
echo "INFO : ";
print_r($info);
echo '<br /><br />';
echo $html;

それを機能させることさえできません。302 ではなく 200 OK を返すことから始まり、500 を返すこともあります。

ASPX変数が実際に重要である可能性があることは知っていますが、ブラウザがこれらの変数を作成してサーバーに送信できる場合、cURLは同じことができませんか?

助けてくれてありがとう!!

4

4 に答える 4

5

問題が解決しました。
正しいヘッダーを使用することが問題でした。ブラウザからのレポートに従って、すべての手順を実行したところ、結果が表示されました。

以下を使用して各ステップを実行しました。

curl_init
curl_setopt()
..
curl_setopt()
curl_exec()
curl_close()

このようにして、各リクエストを手動で設定し、設定を行う必要がありました。コードは長くなりましたが、理解しやすくなりました。

サイトを機能させるために JavaScript の特別なコードを使用しているサイトについて考えていたので、余分な JavaScript コードが不要であることがわかり、非常に苦労しました。

より整理され、正しいヘッダー設定に従うことがすべてでした。

しかも、サイトなので毎回最後のページのandASPXを読んで覚える必要がありました。これが、500 内部エラー サーバー メッセージが頻繁に表示される最初の理由です。VIEWSTATEVALIDATION

Firebug と LiveHttpHeaders を使用して各ステップをまとめました。

于 2012-04-26T13:37:44.727 に答える
1

「うまくいきません。302 ではなく 200 OK を返すことから始まり、500 を返すこともあります。」

curl_setopt($curl, CURLOPT_FOLLOWLOCATION  ,1);

302 リダイレクトに従うように Curl を設定しました。これらは Curl の内部で追跡され、PHP からは見えません。

また:

curl_setopt($curl, CURLOPT_HEADER      ,1);  // DO NOT RETURN HTTP HEADERS

コメントは、コードが行うこととは正反対のことを行います....これは間違っているようです。

于 2012-04-24T02:51:34.217 に答える
0

私はこれを使用しました:

curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);

ブラウザ名とバージョンがあるように、カールをシミュレートします。

于 2016-12-06T19:51:03.170 に答える
0

cURL を作成する前に、使用されている requeste フィールドを確認する必要があります。通常、aspx からの HTTP 500 は送信フィールドに見つかりません。

foreach($postarr as $key=>$value) { 
  $fields_string .= $key.'='.$value.'&'; 
  echo" $fields_string <br> ";
}

リクエストを送信するときは、そのフィールドが動的でないことを確認してください..これが役立つことを願っています..

于 2012-12-07T00:37:02.823 に答える