Релиз учебной CLI-утилиты Check Links v1.0. Утилита проверяет ссылки в файле и выводит результаты проверки в консоль или CSV файл.

В релиз вошло много всяких изменений, добавлена возможность локализации и сборки уже локализованных бинарников. Также много мелких изменений. Возможно, кому-то из изучающих программирование на Zig будет полезно заглянуть в код.

О проекте

Check Links — консольная утилита (CLI) на языке Zig для проверки ссылок на веб-странице.

Утилита загружает HTML-страницу по указанному URL, собирает все ссылки (<a href>) и изображения (<img src>), а затем проверяет каждый URL на доступность. Результат выводится на экран в виде таблицы или экспортируется в CSV-файл.

Проект является переработкой ранее существовавшей PHP-реализации под моим же авторством, но на языке Zig.

Возможности

  • Загрузка страницы по схемам http://, https:// и file:// (чтение локального HTML-файла).
  • Извлечение URL из атрибутов href тегов <a> и src тегов <img>.
  • Нормализация относительных ссылок в абсолютные на основе базового домена (включая протокол-относительные //).
  • Удаление дубликатов URL.
  • Конкурентная проверка доступности каждого URL методом HEAD (по одному потоку на URL).
  • Конкурентная проверка URL партиями настраиваемого размера: количество параллельных запросов задаётся через --parallels (по умолчанию 5; внутри партии — конкурентно, между партиями — последовательно).
  • Собственный HTTP HEAD-клиент с поддержкой TLS и таймаута запроса (по умолчанию 15 секунд, настраивается через --timeout).
  • Повторяемые пользовательские HTTP-заголовки для авторизованных страниц и ссылок того же origin.
  • Группировка результатов по HTTP-коду ответа.
  • Вывод в терминал в виде таблицы с цветовой подсветкой кодов:
    • 2xx — зелёный;
    • 3xx — жёлтый;
    • 4xx/5xx — красный.
  • Экспорт результатов в CSV-файл (разделитель ;).
  • Режим «только ошибки» — показывать лишь упавшие ссылки.
  • Индикатор прогресса выполнения проверки.
  • Интернационализация интерфейса: справка CLI, сообщения об ошибках и предупреждениях, заголовки таблицы и CSV, а также шаблон прогресс-бара собираются на русском или английском языке через build-опцию -Dlocale (по умолчанию ru).

Требования

  • Zig 0.16.0 или новее.

Установка и сборка

Клонируйте репозиторий и соберите проект:

zig build

Бинарный файл появится в zig-out/bin/. Или можно скачать готовый бинарник для совей платформы со страницы релиза.

Использование

check_links [опции] <URL>

Параметры

Аргумент Описание
<URL> URL страницы, ссылки которой нужно проверить (обязательный).
-f, --fail Показывать только ошибочные ссылки.
-e, --export <файл> Экспорт результатов в CSV-файл.
-t, --timeout <секунды> Таймаут запроса в секундах (по умолчанию 15; 0 — без таймаута).
-H, --header <NAME: VALUE> Добавить HTTP-заголовок; опцию можно повторять.
-p, --parallels <количество> Количество параллельных запросов (по умолчанию 5; от 1 до 100).

Примеры

# Проверить все ссылки на странице и вывести таблицу в терминал
check_links https://example.com/

# Показать только ошибочные ссылки
check_links --fail https://example.com/

# Увеличить таймаут запроса до 60 секунд
check_links --timeout 60 https://example.com/

# Увеличить число параллельных запросов (например, до 20)
check_links --parallels 20 https://example.com/

# Экспортировать результаты в CSV-файл
check_links --export result.csv https://example.com/

# Экспортировать только ошибочные ссылки в CSV
check_links --fail --export errors.csv https://example.com/

# Проверить авторизованную страницу с несколькими заголовками
check_links -H 'Authorization: Bearer token' \
  --header 'X-Tenant-ID: 42' \
  https://example.com/private

Заголовки передаются при загрузке исходной страницы и при HEAD-проверке ссылок с тем же origin (схема, хост и эффективный порт). При переходе или проверке внешнего origin они не отправляются. Поддерживаются формы --header 'NAME: VALUE' и --header='NAME: VALUE'.

Значения заголовков, переданные в командной строке, могут сохраниться в истории shell или быть видны другим локальным процессам. Учитывайте это при передаче токенов и других секретов.

Пример вывода (таблица)

--------------------------------------------------------------------------
 №      | URL страницы            | Проверенный URL            | HTTP Код
--------------------------------------------------------------------------
     1. | https://example.com     | https://example.com/page1  |   200
     2. | https://example.com     | https://example.com/page2  |   404
     3. | https://example.com     | https://example.com/page3  |   200
--------------------------------------------------------------------------

HTTP-коды в таблице окрашиваются в зависимости от диапазона: - 2xx — зелёный; - 3xx — жёлтый; - 4xx/5xx — красный.

Типовые сценарии использования утилиты

1. Проверка битых ссылок на своём сайте после редизайна или миграции

После смены дизайна, структуры URL или переезда на новый домен необходимо убедиться, что на страницах не осталось ссылок на старые (удалённые) разделы или файлы.

check_links --fail https://мой-сайт.рф/page/

Утилита покажет только те ссылки, которые ведут на несуществующие страницы (404, 410) или серверные ошибки (500).

2. SEO-аудит: поиск ссылок на внешние ресурсы, которые перестали работать

Битые внешние ссылки ухудшают поведенческие факторы и доверие поисковых систем к сайту. Регулярная проверка внешних ссылок — обязательная часть SEO-поддержки.

check_links --export broken-links.csv https://мой-сайт.рф/

CSV-файл можно открыть в Excel/Google Sheets и передать контент-менеджеру для исправления.

3. Проверка ссылок в статье или лендинге перед публикацией

Перед публикацией материала с множеством внешних источников полезно убедиться, что все ссылки рабочие, а не ведут на 404.

check_links https://блог.рф/черновик-статьи/

Зелёные коды 200 — всё в порядке, жёлтые 3xx — редиректы (стоит обновить ссылки на актуальные), красные 4xx/5xx — битые ссылки.

4. Мониторинг ссылок в документации или базе знаний

Для сайтов с объёмной документацией (вики, базы знаний, мануалы) полезно настроить регулярную проверку ссылок, чтобы документация всегда оставалась актуальной.

# Еженедельная проверка по cron
0 6 * * 1 /usr/local/bin/check_links --fail --export /var/log/links-check/docs-errors.csv https://docs.company.ru/

5. Проверка ссылок на странице товара в интернет-магазине

В карточках товаров часто бывают ссылки на связанные товары, категории, обзоры. Если такие ссылки ведут в никуда — это прямые потери продаж.

check_links --fail https://internet-magazin.ru/catalog/tovar-123/

6. Аудит ссылочной массы перед закупкой ссылок

При SEO-продвижении перед покупкой ссылок с донорского сайта полезно проверить, не висит ли на нём битых страниц, которые могут снизить эффект от закупки.

check_links --fail https://donor-site.ru/

7. Поиск изображений, которые не загружаются

Утилита собирает не только ссылки (<a href>), но и изображения (<img src>). Это позволяет найти битые картинки на странице — частую причину ухудшения визуального восприятия сайта.

check_links --fail https://мой-сайт.рф/gallery/

8. Проверка редиректов (цепочки перенаправлений)

Хотя утилита не отслеживает цепочки редиректов пошагово, она показывает HTTP-код 3xx для URL, которые перенаправляют. Это помогает выявить лишние промежуточные редиректы, замедляющие загрузку страницы.

check_links https://example.com/

Обращайте внимание на жёлтые строки — это URL, которые возвращают 301, 302 и т.д.

9. Экспорт полной карты ссылок страницы для дальнейшего анализа

CSV-экспорт позволяет передать результаты в BI-системы, Google Sheets или Excel для построения отчётов и дашбордов.

check_links --export full-links-report.csv https://мой-сайт.рф/

10. Быстрая проверка сайта клиента перед презентацией

Агентствам и фрилансерам: перед показом сайта клиенту стоит прогнать главную страницу и типовые страницы через утилиту, чтобы исключить неловкую ситуацию с битыми ссылками на демонстрации.

check_links --fail https://сайт-клиента.рф/

Как это работает

  1. Утилита загружает HTML-содержимое страницы по указанному URL.
  2. HTML-парсер извлекает все URL из атрибутов href и src.
  3. Относительные ссылки нормализуются в абсолютные, дубликаты удаляются.
  4. Каждый URL проверяется методом HEAD конкурентно, для проверки используется собственный HTTP HEAD-клиент с таймаутом запроса.
  5. Результаты группируются по HTTP-коду ответа и выводятся в виде таблицы или CSV-файла.

Задать вопросы или высказать свои замечания вы можете в наших чатах и сообществе в ВК: