CLI-утилита для извлечения структурированных данных из HTML-страниц Blogger. В режиме --cve парсит CVE-записи из постов Chrome Release Blog: извлекает идентификатор уязвимости, серьёзность (Critical/High/Medium/Low), CVE ID, описание и репортёра. Также умеет распаковывать JavaScript-объекты _WidgetManager в JSON. Написан на Deno/TypeScript, поставляется в виде статических бинарников для Linux/macOS/Windows.
# Скачать готовый бинарник (Linux x86_64) curl -Lo unjam https://git.sr.ht/~hrbrmstr/unjam/blob/main/unjam-linux-x86_64 chmod +x unjam && sudo mv unjam /usr/local/bin/ # macOS (Apple Silicon) curl -Lo unjam https://git.sr.ht/~hrbrmstr/unjam/blob/main/unjam-mac-arm64 chmod +x unjam && sudo mv unjam /usr/local/bin/ # Из исходников (требует Deno >= 2.0) git clone https://git.sr.ht/~hrbrmstr/unjam cd unjam deno install --global --allow-net -n unjam unjam.ts # Пример: извлечь CVE из последнего Chrome Release unjam --cve https://chromereleases.googleblog.com/... | jq '.[] | select(.severity == "Critical")'
Извлекает структурированные данные со страниц Blogger.
Два режима:
- По умолчанию — преобразует литералы объектов JavaScript из _WidgetManager._SetDataContext в правильный JSON (метаданные виджетов).
- --cve — парсит записи CVE из постов блога Chrome Release.
Преобразование JS в JSON обрабатывает строки в одинарных кавычках, шестнадцатеричные escape-последовательности \xNN и ключевые слова True/False/None.
Загрузите готовую сборку или скомпилируйте из исходников.
| Платформа | Бинарный файл |
|---|---|
| macOS arm64 (Apple Silicon) | unjam-mac-arm64 |
| macOS x86_64 (Intel) | unjam-mac-x86_64 |
| Linux x86_64 | unjam-linux-x86_64 |
| Windows x86_64 | unjam-win-x86_64.exe |
Требуется Deno ≥ 2.0.
deno install --global --allow-net -n unjam unjam.ts
# or
deno task compile
# From URL
unjam https://chromereleases.googleblog.com/2026/06/stable-channel-update-for-desktop_0175352312.html
# Minified
unjam --raw https://example.blogspot.com/page.html | jq .
# From a cached file
cat page.html | unjam
unjam --cve https://chromereleases.googleblog.com/... | jq '.[] | select(.severity == "Critical")'
unjam --cve --raw https://chromereleases.googleblog.com/... | jq 'length'
# Output fields per CVE entry:
# issueId, issueUrl, severity, cveId, description, reporter, reportedOn
Форматированный JSON-массив контекстов данных виджетов. Каждый элемент содержит поля name и data:
name |
Содержание |
|---|---|
blog |
Метаданные блога, ссылки на ленты, язык, информация о записях/страницах |
features |
Включённые возможности Blogger |
messages |
Переводы строк интерфейса |
template |
Имя шаблона и флаги адаптивности |
view |
Состояние просмотра — тип страницы, ID записи, URL, заголовок |
--cve[
{
"issueId": "506558270",
"issueUrl": "https://issues.chromium.org/issues/506558270",
"severity": "Critical",
"cveId": "CVE-2026-13774",
"description": "Use after free in Extensions.",
"reporter": "Google",
"reportedOn": "2026-04-26"
}
]
Страницы Blogger содержат встроенный скрипт вида:
_WidgetManager._SetDataContext([{'name': 'blog', 'data': {…}}]);
Аргумент — литерал массива JavaScript со строками в одинарных кавычках, шестнадцатеричными escape-последовательностями \xNN и ключевыми словами True/False/None — ничего из этого не является валидным JSON. unjam преобразует его за три прохода:
\xNN → \u00NN — преобразование шестнадцатеричных escape-последовательностей JS в escape-последовательности Unicode JSONTrue → true, False → false, None → nullУдаляет HTML-теги, находит раздел "Security Fixes and Rewards", затем извлекает каждую запись вида [N/A][ ISSUE ] Severity CVE-YYYY-NNNN: Description. Reported by... с помощью регулярного выражения. Удаляет дубликаты идентичных записей (Blogger отрисовывает тело поста дважды).
deno task compile:all