0

Web ページから画像を取得しようとしていますが、これまでのところうまく機能していますが、見ているサイトの 1 つが として画像を提供しているContent-Type: text/htmlため、スクリプトが実際の画像ではないとして拒否します。

これは、コンテンツ タイプを決定するために使用しているコード スニペットです。

$accepted_mime = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png');    
$headers = get_headers($image);

// Find the Content-Type header
$num_headers = sizeOf($headers);
for($x=0;$x<$num_headers;$x++) {
    preg_match('/^Content-Type: (.+)$/', $headers[$x], $mime_type);
    if (isset($mime_type[1]) && in_array($mime_type[1], $accepted_mime)) {
        return true;
    }
}

私が試したサイトでは、適切に返されます ( 、 などの結果image/gif)image/pngが、mpaa.orgtype で画像を提供しているようtext/htmlです。これは正常ですか?

print_rget_headers によって返されるヘッダー配列を確認するために を追加しました:

Array
(
    [0] => http://www.mpaa.org/templates/images/header_mpaa_logo.gif
    [1] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Server: nginx/1.2.0
            [2] => Date: Sat, 17 Nov 2012 17:19:06 GMT
            [3] => Content-Type: text/html
            [4] => Connection: close
            [5] => P3P: CP="NON DSP COR ADMa OUR IND UNI COM NAV INT"
            [6] => Cache-Control: no-cache, no-store, must-revalidate
            [7] => Pragma: no-cache
        )

)

受け入れられたコンテンツタイプのリストに簡単に追加できますtext/htmlが、それは間違いなく理想的な解決策ではありません;) mpaa.orgがこれで画像を提供する理由を誰か知っていますContent-Typeか? そうすることは定期的に行われていますか (おそらくレガシー Web サイト/サーバーで)?

ありがとう :)

4

2 に答える 2

2

すばらしい MPAA は、ユーザー エージェント スニッフィングまたは Cookie のチェックを使用して、ブラウザが JavaScript をサポートしているかどうかを判断します。ユーザー エージェント文字列を指定していないか、Cookie を送信していないため、JavaScript がないと見なされ、元の画像ではなく、それを示すページが返されます。

これをブラウザーでロードすると、取得したことがわかります。画像image/gifは次のとおりです 。

cURL や Fiddler、またはその他の変わったユーザー エージェント文字列を使用して同じ要求を行うと、次のようになります。

このサイトでは、JavaScript と Cookie を有効にする必要があります。ブラウザの設定を変更するか、ブラウザをアップグレードしてください。

于 2012-11-17T18:58:31.583 に答える
0

ヘッダーに依存しないでください。それらは簡単に変更できますが、今遭遇したように信頼できません。

私は次のようにします:

  • 画像をダウンロードする
  • 画像が画像かどうかを確認します (getimagesize などを使用)
于 2012-11-17T18:56:58.407 に答える