1

基本的に、私はWebサイトにログインし、ファイルをダウンロードするスクリプトを持っています。かなり簡単です。残念ながら、コードに何かが欠けていて、正しく機能していません。

実行すると、ファイルに出力されたhtmlページが返されます。これは、ログオンせずにファイルリンクにアクセスしようとした場合に、ブラウザーに表示されるものとまったく同じです。アクセスが拒否されました。ログインする必要があります。

ただし、ファイルのダウンロード要求をコメントアウトしてスクリプトの最初の部分を単独で実行してから、スクリプト全体を再実行すると、ファイルを適切にダウンロードできるので、ファイルがで機能していることがわかります。検出。スクリプト全体を実行すると、ログインしたくないようです。

// Log me in

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url);
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location);
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

// Grab the file

curl_setopt($handle, CURLOPT_URL, $csv_loc);
curl_setopt($handle, CURLOPT_FILE, $csv_handle); 

echo $response = curl_exec($handle);

curl_close($handle);

そのため、ログインしてからスクリプトを再実行してファイルをダウンロードすることはできますが、両方を同時に実行することはできません。COOKIEJARやCOOKIEFILE、FOLLOWLOCATIONやREFERERなど、さまざまな種類の追加のカールオプションを試しました。これらは、コードが機能しなかった理由についての唯一の勘でした。「ファイルを取得」コードの何かが、ログインを中断しているか、ログインしていないように動作しています。

編集:解決済み。

他の人が私がしたのと同じ間違いを避けるように、私は解決策を含めることにしました。

私がする必要があるのは、そのように私の要求を分離することだけでした。

// Log me in

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url);
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location);
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

echo $response = curl_exec($handle);

// Grab the file

curl_setopt($handle, CURLOPT_URL, $csv_loc);
curl_setopt($handle, CURLOPT_FILE, $csv_handle);

curl_exec($handle);

curl_close($handle);

最初にcurl_execがサイトにログインし、2番目のcurl_execがファイルを取得してダウンロードします。次に、ハンドルを閉じます。

4

1 に答える 1

3

これがまさに使用しているコードである場合は、次のようにします。

// Log me in
curl_setopt($handle, CURLOPT_URL, $login_url); 

// Grab the file
curl_setopt($handle, CURLOPT_URL, $csv_loc);

echo $response = curl_exec($handle);
curl_close($handle);

URLを再定義しています。1つのリクエストで1つのURL(ログイン)とGET(ファイルを取得)にPOSTを送信することはできません。そのために2つの別々のリクエストを送信する必要があります。

ログインフォームからすぐに返信としてファイルが返される場合を除きます。

于 2013-01-01T18:25:35.930 に答える