1. ホーム
  2. php

[解決済み] 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;


?>