ГлавнаяБлогТерминальная панель статистики Dev.to своими руками
Python

Терминальная панель статистики Dev.to своими руками

Соберите дашборд статистики Dev.to в терминале: Go-скрипт + devdash. Пошаговое руководство с кодом и разбором типичных ошибок. Попробуйте прямо сейчас.

Al
Редакция Algolitalgolit.ru
9 мин чтения15 июля 2026 г.

Зачем вам свой терминальный дашборд Dev.to?

Вы когда-нибудь ловили себя на том, что обновляете страницу статистики 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 (и заслуженный респект)

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

Три таких блока — красный, зелёный, жёлтый — сидят рядом. В теории готово. В теории.

Баг #1: мой дашборд устроил DDoS самому себе

Включаю. Верхняя панель заполнилась. 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 — ключевой момент. Без него все четыре отступают на одинаковое время и снова сталкиваются. Со случайным смещением они расходятся сами. Ошибок больше не было.

Баг #2: запятая сломала таблицу

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. Иногда лучший инструмент для задачи — тот, над которым перестали работать годы назад. Он просто тихо сидит и всё ещё рад нарисовать ещё один дашборд.

Что делать прямо сейчас

  1. Сгенерируйте API-ключ Dev.to в настройках (Extensions).
  2. Склонируйте репозиторий lovestaco/devto_devdash.
  3. Положите ключ в переменную окружения DEVTO_API_KEY.
  4. Запустите make run и наслаждайтесь дашбордом.

Если хотите ещё больше автоматизации — посмотрите на git-lrc: бесплатный AI-ревьюер кода, который запускается на каждый коммит и предотвращает баги до того, как они попадут в продакшн. ⭐ Star на GitHub

#Dev.to#терминальный дашборд#Go#devdash#статистика
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →