はじめに
外部サイトで使用されてる画像を一括でダウンロードしたいときってあるよね?(ない)
どうせ使い捨てだしブラウザの Console で JS で書くのが一番楽だな〜と思ってたけど HAR file viewer 使ったり、ブラウザのダウンロード上限が 10 件だったりとか考えると結局 PHP でいいや、になった
対象外の画像
hover 状態など、特定の状況にならないと読み込まれない画像
方法
- Chrome DevTools で
Network
タブを表示する - 画面を reload する
- Filter で
Img
のみを適用する .har
ファイルをダウンロードする
<?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); }
最後に
外部サイトの画像を全部ローカルに保存したいときなんかねーーーーーーーーーーーーーーーーーーーーよ!!!!!!!!!!!!