[解決済み] php POST stream_context_create および file_get_contents
2022-02-19 03:28:03
質問
以前は動作していたスクリプトがあるのですが、どうやらファイルをダウンロードするウェブサイトが、何らかの理由でそのフォーマットを変更してしまったようなのです。 POSTリクエストのコンテンツとヘッダーをあるべき姿に変更したのですが、期待したようにファイルを引っ張ってきてくれません。 以下は、この関数のスクリプトのスニピットです。
$url='http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx?';
$header= "Host: mansfield.tea.state.tx.us\r\n";
$header.= "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0\r\n";
$header.= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$header.= "Accept-Language: en-GB,en;q=0.5\r\n";
$header.= "Accept-Encoding: gzip, deflate\r\n";
$header.= "Referer: http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx\r\n";
$header.= "Content-Type: application/x-www-form-urlencoded\r\n";
$header.= "Content-Length: 14067\r\n";
$header.= "Cookie: ga=GA1.3.400055834.1504257175; ASP.NET_SessionId=cj020m45uwj5hpmwaclhvmuk\r\n";
$header.= "Connection: keep-alive\r\n";
$header.= "Upgrade-Insecure-Requests: 1\r\n";
$postdata= array(
"__VIEWSTATE" => "/wEPDwULLTE3NDczMDI1MTIPZBYCAgEPZBYEAgMPFCsABWRkZBQrAAcQFg4eBkl0ZW1JRAURX2N0bDAtbWVudUl0ZW0wMDAeCEl0ZW1UZXh0BVI8YSBpZD0iaHlwZXJsaW5rMSIgaHJlZj0iL1RFQS5Bc2tURUQuV2ViL0Zvcm1zL0hvbWUuYXNweCIgY2xhc3M9Im1lbnVOYXYiPkhvbWU8L2E+HgdJdGVtVVJMBRF+L0Zvcm1zL0hvbWUuYXNweB4PTWVudUl0ZW1Ub29sVGlwBQRIb21lHhBNZW51SXRlbUNzc0NsYXNzBRJob3Jpem9udGFsTWVudUl0ZW0eFUl0ZW1Nb3VzZU92ZXJDc3NDbGFzcwUWaG9yaXpvbnRhbE1lbnVTZWxlY3RlZB4LSXRlbVNlY3VyZWRoZGQQFgwfAAURX2N0bDAtbWVudUl0ZW0wMDEfAQVNPGEgaHJlZj0iL1RFQS5Bc2tURUQuV2ViL0Zvcm1zL1NlYXJjaE1h…m9udGFsTWVudUl0ZW0fBQUWaG9yaXpvbnRhbE1lbnVTZWxlY3RlZB8GaGRkFCsAAQUHdGVhdGVtcGQCDQ8QZA8WCWYCAQICAgMCBAIFAgYCBwIIFgkQBQ1TY2hvb2wgTnVtYmVyBQ1TY2hvb2wgTnVtYmVyZxAFC1NjaG9vbCBOYW1lBQtTY2hvb2wgTmFtZWcQBQ1EaXN0cmljdCBOYW1lBQ1EaXN0cmljdCBOYW1lZxAFC0NvdW50eSBOYW1lBQtDb3VudHkgTmFtZWcQBQZSZWdpb24FBlJlZ2lvbmcQBQtTY2hvb2wgQ2l0eQULU2Nob29sIENpdHlnEAUPU2Nob29sIFppcCBDb2RlBQ9TY2hvb2wgWmlwIENvZGVnEAUNRGlzdHJpY3QgQ2l0eQUNRGlzdHJpY3QgQ2l0eWcQBRFEaXN0cmljdCBaaXAgQ29kZQURRGlzdHJpY3QgWmlwIENvZGVnZGRke3qSSaoJbwyFyN/A1p+yD+sPADY=",
"__VIEWSTATEGENERATOR" => "44F2C40C",
"btnDownloadFile" => "Download+File",
"ddlSortOrder" => "School+Number"
);
$opts = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($postdata),
'header' => $header
)
);
$context = stream_context_create($opts);
$file = file_get_contents($url, false, $context);
これは、テキサス州の学校のリストと学校データを含むファイルを返すべきですが、そうではありません。
header ($header) セクションと content ($postdata) セクションの情報は、webdeveloper のコンソールから取り出したものです。 データを取り出したウェブサイトは http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx .
これらのヘッダーとコンテンツを修正して、phpでCLI経由でファイルをダウンロードする方法について、何かアイデアはありますか?
ありがとうございます。
解決方法は?
ViewStateは毎回変わるので、viewstateをスクラップして シンプル_html_dom を渡し、それを
以下は動作中のコードです。
<?php
include_once('simple_html_dom.php');
$url="http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx";
$html=file_get_html($url);
$viewstate = $html->find('input',0)->value;
$url='http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx?';
$header= "Host: mansfield.tea.state.tx.us\r\n";
$header.= "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0\r\n";
$header.= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$header.= "Accept-Language: en-GB,en;q=0.5\r\n";
$header.= "Accept-Encoding: gzip, deflate\r\n";
$header.= "Referer: http://mansfield.tea.state.tx.us/TEA.AskTED.Web/Forms/DownloadFile.aspx\r\n";
$header.= "Content-Type: application/x-www-form-urlencoded\r\n";
$header.= "Content-Length: 14067\r\n";
$header.= "Cookie: ga=GA1.3.400055834.1504257175; ASP.NET_SessionId=cj020m45uwj5hpmwaclhvmuk\r\n";
$header.= "Connection: keep-alive\r\n";
$header.= "Upgrade-Insecure-Requests: 1\r\n";
$postdata= array(
"__VIEWSTATE" => $viewstate,
"__VIEWSTATEGENERATOR" => "44F2C40C",
"btnDownloadFile" => "Download+File",
"ddlSortOrder" => "School+Number"
);
$opts = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($postdata),
'header' => $header
)
);
$context = stream_context_create($opts);
$file = file_get_contents($url, false, $context);
echo $file;
?>
関連
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] フォーム送信のようなJavaScriptのポストリクエスト
-
[解決済み] PHPのstartWith()関数とendsWith()関数
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] アクセスコントロールリクエストヘッダは、jQueryでAJAXリクエストのヘッダに追加されます。
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】PHPのクラスが見つからないが、インクルードされている
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて