← На главную

GlitchyZorua спас иконки Ibiblio, обойдя server-side imagemap

12.07.2026 19:00 · hackernews

Энтузиаст под ником GlitchyZorua решил заархивировать коллекцию иконок с Ibiblio Icon Browser — сайта 90-х, собравшего тысячи GIF-иконок. Куратором библиотеки был Gioacchino La Vecchia. Но скачать их оказалось непросто. Даже archive.org не смог сохранить полный набор.

Проблема в архитектуре сайта. Он использует серверную карту изображений (server-side imagemap). Когда ты кликаешь на иконку, браузер отправляет на сервер пиксельные координаты клика. Сервер сам решает, куда перенаправить. В HTML нет прямых ссылок на файлы — только тег <a href="/iconbin/imagemap/icon3"><img src="destic3/icons.gif" ismap></a>. Атрибут ismap как раз и заставляет браузер слать координаты. Директорий-листинг отключён, так что просто убрать имя картинки из URL не выйдет.

Исследование показало, что все иконки разложены в сетке 8×8. Каждая ячейка вместе с подписью занимает 72×89 пикселей. Судя по всему, сервер работает на Apache с модулем mod_imagemaps, который хранит файл с привязкой прямоугольников к URL. Если каждая область попадания (hit area) имеет размер 72×89, достаточно бить в центр каждой ячейки. Для верхней левой — x=36, y=44. Дальше просто прибавляешь 72 и 89.

Алгоритм получился простой: перебираешь 113 библиотек, для каждой генерируешь координаты центров из двух массивов — {36, 108, 180, 252, 324, 396, 468, 540} по X и {44, 133, 222, 311, 400, 489, 578, 667} по Y. На каждый центр отправляешь HTTP HEAD-запрос вида https://www.ibiblio.org/iconbin/imagemap/icon{library}?{x},{y}. Если приходит код 302 (редирект), в заголовке Location лежит прямая ссылка на GIF. Дальше — дело за wget.

Собрав все иконки, автор склепал новый сайт на Ruby с ERB-шаблонами — статический генератор с пагинацией и поиском на стороне клиента. Репозиторий можно склонировать целиком. Современная версия живёт на ibiblio-icon-archive.danq.dev. Выглядит она, конечно, на свой возраст, но теперь библиотека доступна для всех и защищена от забвения.

Читать оригинал →