index.php

https://個人の見解.jp

【PHP】外部サイトで使用されている画像を一括でダウンロードする

はじめに

外部サイトで使用されてる画像を一括でダウンロードしたいときってあるよね?(ない)

どうせ使い捨てだしブラウザの Console で JS で書くのが一番楽だな〜と思ってたけど HAR file viewer 使ったり、ブラウザのダウンロード上限が 10 件だったりとか考えると結局 PHP でいいや、になった

対象外の画像

hover 状態など、特定の状況にならないと読み込まれない画像

方法

  1. Chrome DevTools で Network タブを表示する
  2. 画面を reload する
  3. Filter で Img のみを適用する
  4. .har ファイルをダウンロードする

github.com での Network タブ

<?php

// .har ファイルのパス
$har = '/path/to/example.har'

$extFromMimeType = function ($mimeType) {
    return match ($mimeType) {
        'image/jpeg' => 'jpg',
        'image/png' => 'png',
        'image/gif' => 'gif',
    };
};

$src = json_decode(file_get_contents($har), true);

foreach ($src['log']['entries'] as $entry) {
    $url = $entry['request']['url'];
    $img = file_get_contents($url);
    $info = pathinfo($url);
    $ext = $info['extension'] ?? null;
    // クエリパラメータの除去
    if (!is_null($ext)) {
        $ext = explode('?', $ext)[0];
    }
    // ファイル情報に拡張子がない場合は header から取得する
    if (is_null($ext)) {
        $headers = get_headers($url, 1);
        $ext = $extFromMimeType($headers['Content-Type']);
    }
    $fileName = "{$info['filename']}.{$ext}";
    file_put_contents("./path/to/downloads/{$fileName}", $img);
}

最後に

外部サイトの画像を全部ローカルに保存したいときなんかねーーーーーーーーーーーーーーーーーーーーよ!!!!!!!!!!!!