2

簡単なユーザースクリプトを作成しました。Web
を閲覧するときに、1回のクリックで任意の画像を「ブックマーク」できます。
ユーザースクリプト

  1. imgsrcを取得します
  2. WebページのURLを取得します
  3. .jpg.png.gifをサーバーにコピーします

すべてが完全に機能しますが、場合によっては、スクリプトでファイルをコピーできません...
実際には、ファイルは作成されますが、imgデータは含まれず、エラーWebページのコンテンツのみが含まれます。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /data/x/xxx_xxx_x.jpg on this server.</p>
<p>Additionally, a 403 Forbidden
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache Server at xxxxxxxx.net Port 80</address>
</body></html>

「コピー」コード(php):

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $urlimg); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
set_time_limit(300); # 5 minutes for PHP 
curl_setopt($ch, CURLOPT_TIMEOUT, 300); # and also for CURL 
$path = $dirpix.'/'.$aa.'/'.$mm;
if ( ! is_dir($path)) {
    mkdir($path);
}
$outfile = fopen($path.'/'.$id.'.'.$ext, 'wb'); 
curl_setopt($ch, CURLOPT_FILE, $outfile); 
curl_exec($ch); 
fclose($outfile); 
curl_close($ch); 

たぶん、ウェブサイトはその種の「コピー」スクリプトをブロックしますか?ありがとう!

4

4 に答える 4

1

ここで考えられる2つのことは、

  1. ユーザーエージェントをcurlリクエストに設定します。あなたの言うことから、あなたは画像を見ることができますが、curlは403エラーを受け取っているので、それはサーバー側でのuserAgentフィルタリングである可能性が非常に高いです。

  2. カールリクエストにリファラーを追加します。ユーザースクリプトからphpスクリプトにリファラー情報を送信できます。の値を投稿または取得する必要がありwindow.location.hrefます。

于 2012-09-05T17:45:22.213 に答える
0

以下のコードを試して、サーバーで正常に動作します。テストされたコード:-

<?php

$img[]='http://i.indiafm.com/stills/celebrities/sada/thumb1.jpg';
$img[]='http://i.indiafm.com/stills/celebrities/sada/thumb5.jpg';

$path="images/";


foreach($img as $i){
    save_image($i, $path);
    if(getimagesize($path.basename($i))){
        echo '<h3 style="color: green;">Image ' . basename($i) . ' Downloaded OK</h3>';
    }else{
        echo '<h3 style="color: red;">Image ' . basename($i) . ' Download Failed</h3>';
    }
}

//Alternative Image Saving Using cURL seeing as allow_url_fopen is disabled - bummer
function save_image($img,$fullpath='basename'){
    if($fullpath!='basename'){
        $fullpath = $fullpath.basename($img);
    }
    $ch = curl_init ($img);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($fullpath)){
        unlink($fullpath);
    }
    $fp = fopen($fullpath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}
于 2012-09-05T19:42:18.587 に答える
0

正しい作業のために追加

$agent= 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11';

curl_setopt($ch, CURLOPT_USERAGENT, $agent);
于 2012-12-06T12:34:16.493 に答える
0

この方法を使用してDLinkカメラにアクセスするのに苦労しました。

しかし、ついに私は問題を見つけました:認証。

認証を忘れないでください。

これは、すべての貢献者のおかげで、私のために働いた解決策です。

    <?php

function download_image1($image_url, $image_file){
    $fp = fopen ($image_file, 'w+');              // open file handle

    $ch = curl_init($image_url);

$agent= 'Accept:image/jpeg,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11';

curl_setopt($ch, CURLOPT_USERAGENT, $agent);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_AUTOREFERER, false);
curl_setopt($ch, CURLOPT_REFERER, "http://google.com");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follows redirect responses.
curl_setopt($ch, CURLOPT_USERPWD, "user:password");

$raw=curl_exec($ch);
if ($raw === false) {
    trigger_error(curl_error($ch));
}

curl_close ($ch);
$localName = $image_file; // The file name of the source can be used locally       
if(file_exists($localName)){
    unlink($localName);
}

$fp = fopen($localName,'x'); 
fwrite($fp, $raw);
fclose($fp);

}

download_image1("http://url_here/image.jpg","/path/filename.jpg"); // to access DLink cameras
// be sure you have rights to the path
?>

上記のコードは、fopenを2回開いているため、おそらくある程度の冗長性があります。正直なところ、私は訂正しません、それが機能していると思います!

于 2015-12-27T13:30:40.810 に答える