Все посты
MartyCow • Portland, OR • 8 min read

Cedar Clerk v0.7.0 (Теперь на двух языках)

Решил написать большой, длинный и необрезанный пост про прогресс со своей блог-платформой, которую я назвал Cedar Clerk.

Я ОЧЕНЬ ПОСТАРАЛСЯ написать все максимально простым языком, чтобы абсолютно любой мог понять смысл.

Несколько моих американских знакомых оказались заинтересованы моими историями и идеей проекта. Помимо этого еще пара человек сказала, что мой SaaS - это именно то, чего им не хватало. Даже бывший начальник написал и сказал, что идея - огонь! 🔥

SaaS (Software-as-a-Service, Софт-как-сервис) - это сайты (так называемые сервисы), которые разработчики вроде меня создают и размещают в Интернете , чтобы предоставить пользователям какую-либо цифровую услугу. В моем случае я предоставляю сервис по созданию "Богатых-на-контент статей".

Монетизация

Я полагаю, что Телеграм в скором времени завезет крутой редактор для каналов внутрь приложения, но друг мне сказал на днях: "Куй железо пока горячо". Вот я и решил заняться ковкой 😀

Я решил воспользоваться этим моментом и за одно освоить разные системы платежей. До этого я работал только с обработкой платежей в Google Play Store и AppStore, когда разрабатывал мобильные игры.

Сейчас же думаю прикрутить Stripe, PayPal, а также сделать возможность платить ТЕЛЕГРАМ-ЗВЕЗДОЧКАМИ ⭐⭐⭐⭐⭐

Я вообще ни разу не хочу грести деньги из воздуха, поэтому по-умолчанию, весь сервис бесплатный! Расходы на инфраструктуру я покрываю из своего кармана. Это дает любому (пока что по приглашению) возможность использовать мою платформу для постинга на сайт и телеграм и использовать редактор БЕЗ ОГРАНИЧЕНИЙ.

Но буду понемногу добавлять премиум-фичи. Наверное, для начала:

  • Ограничу количество каналов, которыми "бесплатный юзер" может управлять. А если премиум - сколько угодно каналов и чатов.

  • Думаю добавить в самого телеграм-бота какие-то фичи, тут надо хорошенько подумать что именно туда выносить. Возможно, доступ к Mini app, если буду такое делать. Возможно доступ к статистике.

  • Думаю отложенный постинг тоже сделать премиум-фичей. Обычным пользователям он не то чтобы сильно нужен.

  • ИИ-шные штуки явно в премиум идут. Даже доступ к возможности добавить API-ключ, чтобы добавить возможность авто-перевода - это преуми-фича. Обычным пользователям она тоже не сильно нужна, хоть и полезна.

  • Возможность размещать посты на сайте - это явно премиум-фича. Хостить и охранять то это все мне...

Пока что думаю, что адекватной ценой за подписку является 3$, или 3€, или 200₽.

Пишите свои мысли по этому поводу!

0
Комментарии

Локализация

Так как американцы заинтересовались моим блогом, то я принял решение добавить простенькую систему локализации в Cedar Clerk.

Грубо говоря, есть вкладка с русской версией поста, а можно добавить англоязычную версию. Так как я ленивый и все еще частенько коряво пишу с точки зрения грамматики, пунктуации и скудного словарного запаса, то я планирую добавить поддержку авто-перевода с помощью ИИ. Вероятно, нужно будет добавить в настройки поля для прокидывания туда ключей API (от Claude, ChatGPT или DeepL Write/Translate).

0
Комментарии

Связка с аккаунтом Telegram

Так как этот проект уже перестает быть сугубо личной штукой, то очевидно стоит задача сделать это все унифицировано. Одно из решений - добавить виджет для логина прямо через Телеграм.

Как же это работает!?

Пользователь нажимает на кнопку Link Telegram Account, вводит свой номер телефона, подтверждает доступ (либо СМС, либо через кнопку в самом приложении телеги), а затем дает разрешение на передачу указанной информации.

Все зашифровано-перешифровано максимально до мозга гостей, и по факту я получаю ТОЛЬКО уникальный ID, юзернейм (то что после @), имя и аватарку. Этих данных достаточно, чтобы через API получить информацию обо всех каналах, в которые добавлен Cedar Clerk Bot. Здесь же идет дополнительная проверка наличия необходимых прав для постинга. Никаких данных больше я никуда никому не передаю. Говорю как есть :)

Помимо ID, никнейма и прочего, я также получаю результирующий Hash (Хэш-сумма) созданный на основе этих данных. Это некий "слепок" - математическая сумма на основе криптографического алгоритма. И работает это в одну сторону. Их хэша восстановить изначальные данные невозможно - для этого возможно потребуются мощности всех компьютеров мира, а также несколько сотен лет времени. Хэш при этом, условно говоря, уникальный для одной и той же последовательности данных.

Пароли сравниваются друг с другом и хранятся именно в виде хэшей.

Я беру полученные данные, и собираю это все в JSON:

// Здесь я по сути создаю так называемый "словарь" - каждому имени параметра я задаю // определенное значение.

var fields = new (string Key, string? Value)[]
{
    ("auth_date", data.AuthDate.ToString()),
    ("first_name", data.FirstName),
    ("id", data.Id.ToString()),
    ("last_name", data.LastName),
    ("photo_url", data.PhotoUrl),
    ("username", data.Username),
};

// Псевдокод конвертации словаря в JSON. На выходе я получаю текстовую строку
var dataCheckString = JSON.Convert(fields);

Затем я создаю секретный ключ на основе токена бота, с помощью алгоритма SHA256. По сути я получаю "слепок" токена. А все потому что сам токен бота ВООБЩЕ НЕЛЬЗЯ НИКУДА НИКОМУ НИКОГДА ДАВАТЬ! Скомпроментированный токен должен быть как можно скорее уничтожен! Все операции с API со стороны бота проводятся именно с помощью токена.

Затем я хэширую полученный до этого JSON с данными с помощью полученного с помощью SHA256 ключа; и при помощи HMAC, я получаю набор байтов:

HMAC - это так называемый Hash-based Message Authentication Code. Он использует хэш на основе SHA256, но при этом шифрует его дополнительно, используя секретный ключ...который в данном случае является хэшем токена бота на основе SHA256.

// Токен моего бота - уникальный и им могу владеть я и только я. Он буквально на 
// уровне ОС вшит в устройство, на котором работает мой сервер. Доступ есть только у // меня
var botToken = "...1234567890qwertyasdf...";

// Здесь я получаю последовательность байтов из моего токена бота. 
// Для человека - это буквально белый шум из символов. Он не значит ровным счетом
// ничего
var secretKey = SHA256.HashData(Encoding.UTF8.GetBytes(botToken));

// Перевожу JSON-строку с пользовательскими данными в набор байт. 
// Пока что, условно говоря, этот набор человеко-читаем
var dataBytes = Encoding.UTF8.GetBytes(dataCheckString);

// По факту здесь я создаю набор байтов для того, чтобы сравнить его с набором
// байтов, который мне вернул Телеграм API вместе с никнеймом и прочим
var computedHash = HMACSHA256.HashData(secretKey, dataBytes);

А затем я просто проверяю полученный хэш с вычисленным вручную. Таким образом сервер делает 2 вещи:

  1. Удостоверяется, что переданное по интернету сообщение было передано без изменений. Что отправили - то и получили.

  2. Отправителю сообщения можно доверять

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

Список каналов/чатов

Добавил возможность добавлять/удалять каналы и чаты. Связавшись с аккаунтом юзера, я могу проверить, в каким конкретно каналам и чатам у бота есть доступ. По сути @cedar_clerk_bot должен быть добавлен в канал в качестве администратора, и у него должен быть доступ к отправке сообщений. ВСЁ! Теперь можно получать автоматически список, а не вбивать каналы вручную.

Также добавил индикатор количество подписчиков на канале. Вообще, по логике сервер раз в какое-то время стучится к API и проверяет, все ли ок. Если нет - пишет ошибку.

Подписи

Обычная возможность добавлять в конце каждого поста заданную подпись. Вероятно в бесплатную подписку добавлю неубираемую подпись "Made with Cedar Clerk" в самом-самом конце.

Система реакций и комментариев

Эта штука поддерживается ТОЛЬКО в постах, опубликованных на сайте. Все довольно просто. Можно ставить реакции (пока только Лайк и Дизлайк), а также писать комментарии. Никакой модерации, просто проверка IP пользователя, чтобы несколько раз не смог дизлайки ставить.

Изначально я хотел сделать, чтобы можно было оценивать как весь пост сразу:

Так и какие-то отдельные куски поста, которые я обрамляю в специальный тэг:

Добавил правую панель. При работе с каким-то постом, можно открыть и посмотреть список комментариев и реакций к посту. Думаю вынести это все в отдельное меню.

0
Комментарии

Панель экспорта

Просто панелька экспорта. Она существует с самого начала проекта, и немного начинает обрастать, поэтому надо ее делить и выносить куда-то еще. По сути, когда юзер закончил пост, то он может:

  1. Запостить его в Телеграм-канал или чат с помощью бота @cedar_clerk_bot

  2. Запостить его на сайт в виде статьи. Заголовок статьи транслитерируется в английский человеко-читаемый аналог, чтобы был понятная ссылка у поста.

  3. Экспортировать весь пост со всем содержимым в .cedar файл. По факту это просто .zip-архив, который содержит .json-файл с текстов моста, всеми тегами, разметкой и мета-данными. А затем можно его импортировать обратно. Зачем я это сделал? Не знаю! Но я скорее хотел оставить возможность как-то посмотреть реальное содержимое поста.

  4. Настроить отложенный постинг. Пока что работает только для Телеграм-каналов и чатов, но не для сайта. Можно вручную выбрать дату и время, или же с помощью удобных кнопок получить округленное ближайшее время. Грубо говоря 03:17 при нажатии "In 5 minutes" превращается в 03:20. Все оперируется в UTC.

UTC (Coordinated Universal Time) - это единый стандарт времени без влияния часовых поясов. Сервера и сайты обычно используют для вычислений именно это время, но пользователю обычно показывается местое время. Например, Московское время - это UTC+3 (то есть на 3 часа больше, чем UTC время), а в Портленде UTC-7 (соответственно на 7 часов меньше). Соответственно, разница во времени между Москвой и Портлендом - 12 часов.

Думаю сделать это меню в виде набора галочек и всякого такого. Потому что чекбоксы и кнопки тут явно конфликтуют друг с другом.

Система тегов

Просто сделал небольшую системку, чтобы помечать посты какими угодно тегами:

А на главной странице блога эти теги видны и можно по ним вести поиск:

Завершение (Что дальше?)

Спасибо, что дочитали статью! Я не думал, что она будет такой большой, но это по сути ПЕРВАЯ подобная статья. И я решил немножко похвастаться, чего я сделал.

У меня уже весит большой список тех-долга, обширный список багов, огромная работа по верстке и работе сервера. Но вот примерный списочек будущих фичей:

В общем, как-то так! Мне очень важно ваше мнение. Нужно ли это кому-то? В чем недостатки? В чем преимущества? Пишите, мне любое мнение интересно.

Stay Tuned!

0
Комментарии
Пост опубликован: 9 июля 2026, 16:04 PDT
Следующая запись
Dedicated to Sasha
15 июля 2026
Предыдущая запись
64 Get
9 июля 2026