Соберите дашборд статистики Dev.to в терминале: Go-скрипт + devdash. Пошаговое руководство с кодом и разбором типичных ошибок. Попробуйте прямо сейчас.
Вы когда-нибудь ловили себя на том, что обновляете страницу статистики Dev.to каждые пять минут? Клики, вкладки, ожидание загрузки — знакомая боль. А что если все ваши статьи — с лайками, просмотрами и комментариями — будут отображаться в одном окне терминала, обновляясь сами? Звучит как мечта ленивого разработчика. Сегодня мы её реализуем: напишем маленькую программу на Go, настроим готовый инструмент devdash и получим красивый дашборд без единого открытого браузера.
Идея до смешного проста. Во-первых, Dev.to сам отдаёт ваши данные через эндпоинт GET /api/articles/me. Достаточно передать API-ключ в заголовке api-key, и вы получите массив статей с полями positive_reactions_count, page_views_count и comments_count. Никакого парсинга HTML, никаких слёз. Ключ генерируется в настройках Dev.to (раздел Extensions).
Во-вторых, строить полноценный TUI (terminal user interface) с нуля — дело долгое. Сетки, цвета, границы, обработка клавиш, циклы обновления… Жизнь коротка, как говорится.
В-третьих, нам нужен инструмент, который уже умеет рисовать красивые терминальные панели и с радостью покажет наши цифры, если их правильно скормить. Этот инструмент существует — он называется devdash.
devdash — это высококонфигурируемый терминальный дашборд от Matthieu Cneude (Phantas0s). Он умеет отображать виджеты для GitHub, Google Analytics, Search Console, Travis и других сервисов. Вся конфигурация — один YAML-файл. Строки, колонки, размеры, цвета — всё декларативно. Прекрасный кусок Go-кода.
Две маленькие загвоздки: проект архивирован с 2023 года, и он ничего не знает о Dev.to. Можно было бы форкнуть, добавить сервис Forem, написать тесты, открыть PR в репозиторий, который уже закрыт для изменений. Но я пошёл лёгким путём.
У devdash есть виджет lh.table — таблица из локальной команды. Вы даёте shell-команду, он её выполняет и выводит результат в виде таблицы с границами. Строки разбиваются по пробелам на колонки. Вот и весь контракт.
devdash не нужно знать о Dev.to. Ему нужна просто команда, которая печатает строки. Этой командой могу быть я.
Спасибо Matthieu за инструмент, достаточно гибкий, чтобы его можно было так изящно использовать не по назначению. Зайдите к нему в X (Twitter) и скажите, что его архивированный проект до сих пор работает.
Единственное, что пришлось написать — это маленькая Go-программа. Я назвал её devto-stats. Она загружает все мои статьи (пагинация по 100 штук, пока Dev.to не закончатся), оставляет только опубликованные, сортирует по нужной метрике и печатает аккуратные строки.
req, _ := http.NewRequest("GET", "https://dev.to/api/articles/me?per_page=100&page="+strconv.Itoa(page), nil)
req.Header.Set("api-key", apiKey)
resp, _ := client.Do(req)А конфиг devdash просто указывает три табличных виджета на три варианта этой команды:
- name: lh.table
options:
title: "MOST VIEWED"
command: "./bin/devto-stats -mode=table -sort=views -limit=10"
headers: "#,Article,Views"
border_color: greenТри таких блока — красный, зелёный, жёлтый — сидят рядом. В теории готово. В теории.
Включаю. Верхняя панель заполнилась. Most Liked — отлично. Most Commented — есть. Most Viewed — ярко-красный ERROR.
Команда отлично работала вручную. Падала только внутри devdash. Разгадка в том, как devdash обновляет виджеты: он запускает каждый в своей горутине одновременно. Четыре виджета — четыре копии devto-stats, несущихся к API Dev.to в один момент. Dev.to отвечал 429 Too Many Requests. Один из четырёх всегда проигрывал гонку.
Фикс — скучный и правильный: при 429 ждать и повторять с backoff и jitter.
if resp.StatusCode == http.StatusTooManyRequests {
backoff := time.Duration(attempt-1) * 700 * time.Millisecond
jitter := time.Duration(rand.Intn(500)) * time.Millisecond
time.Sleep(backoff + jitter)
continue // попробовать снова
}Jitter — ключевой момент. Без него все четыре отступают на одинаковое время и снова сталкиваются. Со случайным смещением они расходятся сами. Ошибок больше не было.
Most Viewed наконец отобразился. Но криво. Первая строка нормально, а каждая следующая съезжала на одну колонку вправо. Заголовки в колонке чисел, числа непонятно где.
Я узнал статью, с которой начинался сдвиг. Мой топовый пост называется «Good Bye CRUD APIs, Hello Sync». Обратите внимание на пунктуацию.
Вот что делает devdash под капотом: он разбивает каждую строку по пробелам на ячейки, соединяет их обратно запятыми, а потом разбивает всё скопом по запятым на строки по N колонок. Запятая внутри заголовка неотличима от запятой, которую devdash добавил сам. Один заголовок становится двумя ячейками, строка получает четыре куска вместо трёх, и все последующие строки сдвигаются навсегда.
Настоящий фикс должен быть в исходном коде devdash, но репозиторий закрыт. Поэтому я починил на своей стороне — там, где контролирую вывод. Моя программа уже превращала заголовки в slug (заменяла пробелы на дефисы), чтобы пережить разбиение по пробелам. Я просто добавил удаление запятых.
s := strings.Join(strings.Fields(title), "-")
s = strings.ReplaceAll(s, ",", "") // devdash переразбивает таблицу по запятымОдна строка. Таблица встала на место.
Вот как выглядит сырой вывод одной панели (реальные цифры моего аккаунта):
devdash берёт три таких потока и превращает их в цветные таблицы с границами, которые обновляются сами: Most Liked — красный, Most Viewed — зелёный, Most Commented — жёлтый, а сверху — сводная строка. Ctrl+R принудительно обновляет, Ctrl+C выходит. По умолчанию перерисовка каждые пять минут. 444 статьи учтены. Ни браузера, ни кликов. Просто тихий терминал, говорящий правду о том, какие посты люди действительно читают.
Лучшая интеграция — часто никакая интеграция. devdash так и не узнал о Dev.to. Я заставил Dev.to говорить на языке devdash, и инструмент, переставший обновляться в 2023 году, без единого изменения в исходниках отображал данные 2026 года.
Весь проект — Go-помощник, YAML и Makefile — доступен на GitHub: lovestaco/devto_devdash. Принесите свой API-ключ.
И ещё раз спасибо Matthieu Cneude за devdash. Иногда лучший инструмент для задачи — тот, над которым перестали работать годы назад. Он просто тихо сидит и всё ещё рад нарисовать ещё один дашборд.
DEVTO_API_KEY.make run и наслаждайтесь дашбордом.Если хотите ещё больше автоматизации — посмотрите на git-lrc: бесплатный AI-ревьюер кода, который запускается на каждый коммит и предотвращает баги до того, как они попадут в продакшн. ⭐ Star на GitHub
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →