2016-10-09 7 views
2

curlを使用してPOSTリクエストを実行するといくつかの奇妙な問題が発生します。私はいくつかの情報のためにウェブサイトをかき集めようとしています。このウェブサイトはASPXを使用して書かれています。CURLOPT_POSTFIELDSは、ハードコードされた文字列でのみ動作します

現在、VIEWSTATE、VIEWSTATEGENERATOR、EVENTVALIDATIONの値を取得するGETリクエストを実行しています。このコードは正常に動作します。

$html = $this->hhb_curl_exec2($ch, $this->url, $debugHeaders, $debugCookies, $debugRequest); 
$domd = new \DOMDocument(); 
libxml_use_internal_errors(true); 
$domd->loadHTML($html); 
assert(is_object($domd)); 
$__VIEWSTATE = $domd->getElementById('__VIEWSTATE')->getAttribute('value'); 
$__VIEWSTATEGENERATOR = $domd->getElementById('__VIEWSTATEGENERATOR')->getAttribute('value'); 
$__EVENTVALIDATION = $domd->getElementById('__EVENTVALIDATION')->getAttribute('value'); 

私はCURLOPT_POSTFIELDSに渡すために私のデータをフォーマットするには、次の方法を使用してみましたがPOSTリクエスト

curl_setopt($ch, CURLOPT_TIMEOUT, 60);  
curl_setopt($ch, CURLOPT_ENCODING, ''); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Expect :', 'Content-type: application/x-www-form-urlencoded', 'Connection: keep-alive', 'Accept-Language: en-US,en;q=0.8', 'DNT: 1','Upgrade-Insecure-Requests: 1', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',)) ; 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
$html = $this->hhb_curl_exec2($ch, $this->url, $debugHeaders, $debugCookies, $debugRequest); 

を実行するための私のコード。 - http_build_query - 書式設定された文字列 とすべてが失敗します。

しかし、http_build_queryの出力をエコーし​​てその値を$ dataにハードコードすると動作します。このロジックに従おうとすると、ob_startとob_get_cleanを変数に使用しようとしましたが、それでも動作しません。私はそれがエンコードと関係があるかもしれないと思っていたので、urlencode、rawurlencodeなどで試してみましたが、まだ動作しません。

これは4日間続きました。誰にでもアイデアはありますか?


は、私は通常、何を得る は

__EVENTTARGET=&__EVENTARGUMENT=&txtID=123&Type=Check&__VIEWSTATEGENERATOR=259A63A1&__VIEWSTATE=%2FwEPDwUKLTgxMjY3NTc3OQ9kFgICAw9kFggCDA9kFgICAw8PFgIeB1Zpc2libGVoZGQCDQ9kFgICAw8PFgIfAGhkZAIOD2QWAgIDDw8WAh8AaGRkAhMPDxYCHgRUZXh0BQM2ODFkZBgBBQhDYXB0Y2hhMQ8FJGU3MWM0NWRkLTc5NTYtNDg1OS05NjBjLThkZGVlMjg5NjRkYWSfOThWHvPz4%2FTL%2BUaGirQZ5RboSnTC9dUIpDr5cInhgQ%3D%3D&__EVENTVALIDATION=%2FwEdAATzTFkZdU%2FCJ5dXkuY45iU6kpmFQIiHR062LxhkThIrE5l%2FkxSnaCiVP8n0gK4NzCOkWRDoSjN1G98r%2BI9h%2FrD7Tmr9zlIbeGS1P8q5MIlYg1K5J4JlQdGE6eaZgYCE%2BIc%3D

私は配列

 $data = []; 
     $data['__EVENTTARGET'] = ''; 
     $data['__EVENTARGUMENT'] = ''; 
     $data['txtID'] = '123'; 
     $data['Type'] = 'Check'; 
     $data['__VIEWSTATE'] = '/wEPDwUKLTgxMjY3NTc3OQ9kFgICAw9kFggCDA9kFgICAw8PFgIeB1Zpc2libGVoZGQCDQ9kFgICAw8PFgIfAGhkZAIOD2QWAgIDDw8WAh8AaGRkAhMPDxYCHgRUZXh0BQM2ODFkZBgBBQhDYXB0Y2hhMQ8FJGU3MWM0NWRkLTc5NTYtNDg1OS05NjBjLThkZGVlMjg5NjRkYWSfOThWHvPz4/TL+UaGirQZ5RboSnTC9dUIpDr5cInhgQ=='; 
     $data['__VIEWSTATEGENERATOR'] = '259A63A1'; 
     $data['__EVENTVALIDATION'] = '/wEdAATzTFkZdU/CJ5dXkuY45iU6kpmFQIiHR062LxhkThIrE5l/kxSnaCiVP8n0gK4NzCOkWRDoSjN1G98r+I9h/rD7Tmr9zlIbeGS1P8q5MIlYg1K5J4JlQdGE6eaZgYCE+Ic='; 

そして、ハードコード値に投入していたデータは$ tにhttp_build_queryを使用するだけである。この


詳しい説明はこちらハプニング。

私が投稿した文字列を構築するために、このメソッドを使用した場合、それは仕事をdoesntの、

$ev = urlencode($__EVENTVALIDATION); 
$vs = urlencode($__VIEWSTATE); 

$apc = 'Type=Check&__EVENTARGUMENT=&__EVENTTARGET='. 
     "&__EVENTVALIDATION={$ev}". 
     "&__VIEWSTATE={$vs}". 
     "&__VIEWSTATEGENERATOR={$__VIEWSTATEGENERATOR}&txtID={$id}"; 

しかし、私はいくつかの本当に奇妙な理由で、それは動作しますが、このようにそれを行うにした場合。

$ev = urlencode('/wEdAATzTFkZdU/CJ5dXkuY45iU6kpmFQIiHR062LxhkThIrE5l/kxSnaCiVP8n0gK4NzCOkWRDoSjN1G98r+I9h/rD7Tmr9zlIbeGS1P8q5MIlYg1K5J4JlQdGE6eaZgYCE+Ic='); 
$vs = urlencode('/wEPDwUKLTgxMjY3NTc3OQ9kFgICAw9kFggCDA9kFgICAw8PFgIeB1Zpc2libGVoZGQCDQ9kFgICAw8PFgIfAGhkZAIOD2QWAgIDDw8WAh8AaGRkAhMPDxYCHgRUZXh0BQM2ODFkZBgBBQhDYXB0Y2hhMQ8FJGU3MWM0NWRkLTc5NTYtNDg1OS05NjBjLThkZGVlMjg5NjRkYWSfOThWHvPz4/TL+UaGirQZ5RboSnTC9dUIpDr5cInhgQ=='); 

$apc = 'Type=Check&__EVENTARGUMENT=&__EVENTTARGET='. 
     "&__EVENTVALIDATION={$ev}". 
     "&__VIEWSTATE={$vs}". 
     "&__VIEWSTATEGENERATOR={$__VIEWSTATEGENERATOR}&txtID={$id}"; 
+1

'$ data'には実際に何が表示されますか? 「しかし、http_build_queryの出力をエコーし​​て$ dataに値をハードコードすると動作します」。 (ハードコードされたものを意味する) –

+0

@Anant、私のメインポストに追加 –

+0

$データ配列 – Cristian

答えて

0

は、最後に私の問題の本当の原因を見つけ、私は廃棄していますウェブサイトは、いくつかの余分なチェックは、サーバー側で処理し、エラーをバック投稿しないことにしましたされていました。

動作させるには3秒の遅延を設定するだけでした。

申し訳ありません。