TG Notion
4 поста
В TG Notion появились напоминалки для задач. Раньше бот умел только хранить задачи и показывать чекбоксы. Теперь можно поставить дату и время — и бот пришлёт уведомление в Telegram.
Но пока я это делал, собрал пару залуп. О них и расскажу.
Первая залупа — хранение времени. Сначала я хранил напоминание строкой вида «13.08.2026 15:00» и сравнивал с текущей минутой. Работало, пока бот не перезапустился. После рестарта напоминания, которые должны были прийти в этот момент, просто терялись.
Перевёл на timestamp в миллисекундах и выборку remind_at <= now. Теперь даже если бот проспал — при следующей проверке догонит.
Вторая залупа — миграция базы. Поле remind_at не добавлялось в существующую таблицу через CREATE TABLE IF NOT EXISTS. SQLite так не умеет — нужен ALTER TABLE. А он падает, если колонка уже есть. Пришлось оборачивать в try/catch и игнорировать ошибку. Мелочь, а потратил час.
Третья залупа — форма выбора времени. Сначала сделал кривой input, который не открывал календарь. Потом сделал кнопку с нативным пикером — вроде заработало. Но при повторном открытии формы вместо сохранённого времени показывался «Invalid date». Оставил как есть — косметика, потом поправлю.
Итог:
Напоминалки работают. Ставишь задаче дату и время, бот присылает уведомление.
Привет, Пикабу. Я разработчик-одиночка, в свободное время пилю ботов для Телеграма. Недавно столкнулся с проблемой: мы с друзьями ведём несколько проектов, и идеи постоянно терялись в чатах. Гуглодоки, Notion — это всё неудобно, когда нужно быстро накидать мысль и чтобы все сразу увидели.
Так родилась идея: сделать общую доску для заметок, которая работает прямо в Телеграм-чате. Без отдельных приложений и регистраций.
Что получилось
Создаёшь доску, нажимаешь «Поделиться», выбираешь чат — и в этот чат падает карточка с названием доски и тремя кнопками: «Добавить», «Открыть доску», «Обновить». Все участники чата видят эту карточку и могут добавлять заметки. Выглядит как встроенный виджет.
Как это работает технически: бот на Node.js, база SQLite, всё крутится на европейском сервере (чтобы РКН не мешал). Самое сложное было — заставить доску появляться в чате как инлайн-сообщение с кнопками. Телеграм штука капризная: вебхук отваливался с ошибкой 502, allowed_updates сбрасывались при каждом деплое, а кнопки внутри карточки отказывались работать. Две недели ебли с дебагом, но в итоге победил.
Как это работает для пользователя
Заходите в бота, создаёте доску.
Отправляете её в любой чат или канал.
Все участники видят доску и могут добавлять заметки прямо из чата.
Кнопка «Обновить» показывает актуальный список заметок.
Кнопка «Открыть доску» открывает полный интерфейс с редактированием и удалением.
Никаких ссылок на сторонние сервисы, всё внутри Телеграма.
Что дальше
Сейчас доска работает с заметками. В планах добавить:
Права на редактирование (только автор может менять свою заметку)
Задачи с чекбоксами (отдельным слоем)
Уведомления в чат при новых заметках
Предложка
У меня на канале уже есть такая доска, она создана для того чтобы пользователи могли предлать свои идеи по улучшению или добавлению новых фич.
Переходите по ссылке, ваше мне очень важно для меня!
Ссылка на бота: Telega_notion_bot
Если есть вопросы — задавайте в комментариях. Если есть желание потестировать и поломать — велком.
Доска день 2: удаление, шаринг и стартаппарат
Вчера доска заработала. Сегодня начал её допиливать до состояния, в котором ей можно пользоваться без мата. Список задач был простой:
Удаление заметок внутри доски.
Удаление самой доски.
Кнопка «Поделиться» прямо в доске (а не только при создании).
Ссылка, которая открывает доску сразу в Mini App, а не в браузере.
Сначала запилил API для удаления:
javascript
// DELETE /api/boards/:hash/notes/:id const boardNoteDeleteMatch = pathname.match(/^\/api\/boards\/([a-f0-9]+)\/notes\/(\d+)$/); if (boardNoteDeleteMatch && req.method === 'DELETE') { const ok = boardsApi.deleteNote(boardNoteDeleteMatch[1], parseInt(boardNoteDeleteMatch[2])); res.writeHead(ok ? 200 : 404, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok })); return; } // DELETE /api/boards/:hash const boardDeleteMatch = pathname.match(/^\/api\/boards\/([a-f0-9]+)$/); if (boardDeleteMatch && req.method === 'DELETE') { const hash = boardDeleteMatch[1]; const board = db.prepare('SELECT id FROM boards WHERE hash = ?').get(hash); if (board) { db.prepare('DELETE FROM board_notes WHERE board_id = ?').run(board.id); db.prepare('DELETE FROM boards WHERE id = ?').run(board.id); } res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true })); return; }
На фронте добавил контекстное меню (троеточие) для каждой заметки и для самой доски. Чтобы удалять можно было не через API-запросы вручную, а кнопкой.
Заодно прикрутил «Поделиться» прямо в открытой доске. Теперь ссылку можно кинуть в любой чат, не выходя из доски.
И тут начался пиздец.
Ссылка вида https://tgnotion.bothost.tech/boards/<hash> открывала доску в браузере, а не в Mini App. Надо было сделать так, чтобы она открывалась прямо в Telegram, без лишних переходов.
Сначала попробовал через https://t.me/Telega_notion_bot/boards/<hash> — бот ругался, что приложение не найдено.
Потом через ?startapp=boards_<hash> — бот открывался, но показывал мои личные заметки, а не нужную доску.
Потому что startapp передаёт параметр во фронт, но я его не читал.
Надо было добавить обработку в app2.js:
javascript
const startParam = tg.initDataUnsafe?.start_param || new URLSearchParams(location.search).get('tgWebAppStartParam'); if (startParam?.startsWith('boards_')) { viewBoard(startParam.slice('boards_'.length)); }
Теперь ссылка формата https://t.me/Telega_notion_bot?startapp=boards_%3Chash%3E сразу открывает нужную доску в Mini App. Без браузера, без лишних кликов.
А ещё мы почти сделали доску прямо в чате.
Идея: бот отправляет в чат сообщение с названием доски и списком заметок. Под сообщением кнопки: «Добавить заметку», «Удалить», «Обновить». При нажатии бот обновляет это же сообщение.
Это не Mini App, но доска висит в чате как живое сообщение. Прямо там можно работать. Технически это возможно через editMessageText и инлайн-клавиатуру.
Пока оставил на потом. Но идея крутая — сделаю как-нибудь на досуге.
Итог дня:
Удаление заметок и досок — есть.
Кнопка «Поделиться» внутри доски — есть.
Ссылка открывает доску сразу в Mini App — есть.
Доска в чате — в планах.
Особая благодарность @Vijay Taitoo ☭ за свежий взгляд и помощь.
Коллективный интеллект иногда решает быстрее, чем ИИ.
Тестируй:
https://t.me/Telega_notion_bot
Сегодня я зашел в TG Notion с одной целью — прикрутить общие доски. Чтобы любой человек мог кинуть ссылку в чат, и там сразу открывалась совместная заметка. Без регистраций, без логинов, без этого ебучего «дай доступ» в Notion.
План был простой:
Сделать API для создания досок.
Сделать API для работы с заметками внутри доски.
Сделать фронт, который это все открывает.
Ага, план был простой.
Первое, что я понял: BotHost — это зло. Не потому что он плохой, а потому что у него своя логика работы с базой данных. Ты делаешь пуш, а твоя локальная SQLite сгорает нахуй вместе со всеми тестовыми досками. Потому что база лежала внутри контейнера, а при деплое контейнер пересоздается.
Я чуть не разбил монитор.
Дальше — роутинг. Ты думаешь, что если написать /boards/:hash, то сервер отдаст страницу. А он отдает JSON. Потому что сверху сработал API-роут. Ты переписываешь — он отдает 404.
И тут начинается коллективный интеллект.
В чат залетает Vijay Taitoo ☭ (в миру — Никита). И он тупо видит то, что я сам не видел, потому что уже замылил глаз.
«Ты сначала стабилизируй базу, потом уже строй этажи.»
«Там проблема не в доске, а в том, что роут страницы и роут API дерутся между собой.»
«Если ссылка открывается в браузере — у тебя фронт ищет стили как /boards/style.css, а надо /style.css.»
Он не писал за меня код. Он просто смотрел со стороны. Это называется — КИ (Коллективный Интеллект). В отличие от ИИ, который выдает идеальный код, но молчит, когда ты загоняешь себя в тупик.
Потому что ИИ — это инструмент. А живой человек видит полотно целиком.
После двух часов плясок с req.url, pathname и fs.readFile, я переписал API и фронт так, чтобы доски открывались внутри Mini App, а ссылка выглядела как:
И знаете что? Она заработала.
Когда я кинул ссылку в чат, Никита зашел, написал «Doors», сохранил — и заметка тут же появилась у меня. Это была не радость. Это было удовлетворение от того, что система не сломалась.
Сейчас доска умеет:
📋 Создавать общую доску.
✏️ Добавлять заметки (видит кто добавил).
🔗 Делиться ссылкой (при создании).
🎨 Работает внутри Telegram Mini App, а не как тупая страница.
Остались мелочи:
Кнопка удалить/редактировать.
Автообновление (чтобы видеть изменения в реальном времени).
Поиск по доске.
Предпросмотр ссылки (чтобы было видно название доски, а не хеш).
Но это уже завтра. Сейчас главное — фундамент стоит, доски работают, и я могу спать спокойно.
TG Notion — https://t.me/Telega_notion_bot
КАНАЛ
Привет Пикабу. Сижу в Telegram круглосуточно — работа, созвоны, проекты, всё там. И вечно надо что-то записать: идею, задачу, список покупок. А для этого раньше приходилось открывать Notion, искать блоки, разбираться в интерфейсе. Бесит.
Я подумал: а нахуя мне этот Notion, если я всё равно в Telegram? И просто сделал своего бота. Пока что он умеет только две вещи:
— записывать заметки;
— вести список задач.
Всё. Никаких тебе папок, тегов, иерархий, настроек. Написал — сохранил. Всё просто и быстро.
И знаете что? Я буквально вчера его задеплоил, а уже 70 человек сидят и тестируют. Ни копейки не потратил на рекламу — просто кинул пост на Хабре. Люди заходят, пробуют и пишут мне в личку: "Слушай, а добавь сюда общие доски, чтобы командой работать?" Или: "А можно будет делиться заметками с другом?".
И я реально прислушиваюсь. Потому что я не хочу делать продукт, который никому не нужен. У меня есть канал, где мы голосуем, что добавить следующим. И новые фичи я делаю только если людям это реально надо.
Дальше в планах:
— общие доски (тодолист для команды);
— шеринг заметок (делиться карточкой в чат);
— напоминалки (чтобы бот сам напоминал о дедлайнах);
— интеграция с Notion и Google Docs (чтобы можно было экспортировать);
— ну и английский язык, конечно.
Пока что примитивно, но я верю в подход "от простого к сложному". Сначала сделал базовую хуйню, теперь смотрю, что просят люди, и доращиваю.
Если тебе интересно — вот бот, попробуй:
https://t.me/Telega_notion_bot
А вот мой GitHub:
https://github.com/Elrick-from-Malnibone/tg-notion-node
Кто попробует — пиши в комменты, что добавить следующим. Я реально читаю.
ля тех, кто не в контексте: urfave/cli — это штука, на которой написаны тысячи консольных утилит. 23 тысячи звёзд на GitHub, почти 58 тысяч проектов висят на ней как на зависимости. Короче, золотой стандарт. Казалось бы, всё должно быть идеально.
Голем так не считает 👇
Что нашёл по безопасности:
Запуск подпроцессов с подстановкой переменных — потенциальная дыра для инъекций
Переполнение uintptr на 32-битных системах
Файлы с правами 0644 вместо 0600
Необработанные ошибки в скриптах сборки
И пара косяков по стилю — разнобой в именах параметров и кривые комментарии.
Каждую проблему объяснил и показал как чинить.
Бот: @Golem666bot
Request without timeout, хардкод паролей в тестах, проглатывание исключений. @Golem666bot объяснил каждую и показал как чинить.
Всем привет.
Пишу на Python несколько лет. Bandit ищет уязвимости в коде, Ruff орёт про стиль и баги, pip-audit проверяет зависимости на CVE. И каждый раз — портянка из десятков строк, в которой легко упустить важное.
Сделал Telegram-бота Голема. Он собирает всё в один читаемый отчёт и объясняет, что с этим делать.
Как работает:
Кидаете ZIP с проектом или ссылку на GitHub
Бот параллельно запускает три тулзы:
Bandit — безопасность кода
Ruff — стиль и баги
pip-audit — уязвимости в зависимостях
3. Собирает все проблемные строки с контекстом
4.Отправляет в LLM, которая формирует читаемый отчёт: где проблема, почему критично, как исправить
Что с этим делать дальше:
Жмёте /fix — Голем автоматически правит часть проблем (то, что умеет Ruff). Не всё, но работает.
Что ещё умеет:
Анализирует Go-проекты (gosec + staticcheck)
Просто общается на темы кода: спросите про asyncio, context, архитектуру — объяснит, покажет примеры
Пушить проекты в гитхаб, напишет ридми если надо
В планах:
Добавление новых языков (JavaScript/TypeScript, Rust)
Автодеплой проектов прямо из Telegram
Глубокая интеграция с GitHub (создание репозиториев, пулл-реквесты)
Бот: @Golem666bot
Кидайте свои Python-проекты Голему. Посмотрим, что он у вас найдёт. А если есть вопросы по коду — просто спросите.
