Telegram бот, отправляющий задачи в Notion

Я уже писал ранее, что Notion выпустили свое API и я написал интеграцию с Telegram (подробнее тут) и я был несказанно рад этой новости! Писал я про это уже 4 месяца назад и я, сразу-же, сделал себе на коленке небольшого бота, который ставит мне задачи и через которого другие люди также могут ставить мне задачи.

Я очень люблю Notion – я пользуюсь им уже почти год и все больше и больше внедряю его в свои процессы. Вот уже несколько месяцев все свои личные задачи я веду через него. Я стараюсь прийти к тому, что в Notion лежали все задачи, которыми мне нужно заниматься.

Но я для себя заметил, что добавление задач отнимает много времени – зайти в notion, открыть нужную доску, дождаться пока загрузится страница, добавить задачу. Разумеется, мой ленивый разум быстро нашел в этом причину чтобы не вести задачи. Но потом появилось API и я быстро накидал себе бота, который добавляет задачу на каждое сообщение в Telegram.

В рамках данного поста я поделился своим способом достижения этого результата на Typescript.

Первая версия бота

Первое, что я сделал с его появлением – простого Telegram бота, через которого мне можно ставить задачи. Работает он простым образом:

  1. Я пишу Telegram боту любой текст
  2. В notion, в моем списке задач, создается карточка, в названии которого лежит текст сообщения
  3. В ответ бот присылает мне оповещение о том, что задача создана и передает ссылку на карточку
  4. Также боту может написать человек, которому я дал право ставить мне задачи. Это тоже приводит к созданию карточки задачи с пометкой автора задачи.

Дальше этого бота расширять можно сколь угодно много. Но сегодня мы с вами сделаем простую базовую версию.

Подключение к Notion API

Для начала нужно получить token для работы. Сделать это можно по инструкции здесь. Также опишу этот процесс здесь:

  • Придумываем название интеграции
  • Попадаем на страницу с вашим токеном

Дальше этот токен можно скопировать кнопкой Copy и использовать его в своем приложении.

Создаем базу данных задач

Дальше нужно в любом удобном вам месте в Notion создать базу данных с Kan Ban представлением, добавить поля статуса и источника задачи. Или можете просто скопировать мой тестовый список задач и использовать его как шаблон.

Кнопка для дублирования в качестве шаблона

Отлично! Теперь у нас есть база задач, которую вы можете наполнять руками через Notion! Но мы здесь с вами не для этого. Теперь нам необходимо настроить интеграцию между notion и telegram ботом.

Заготовка Telegram бота на typescript

Я подготовил проект, в котором реализовал базовую логику интеграции. Вы можете посмотреть его код на GitHub (версия 0.0.1). Внутри есть readme.md, в котором описано как запускать бота, а я пройдусь по основным моментам работы интеграции.

Базовая инициализация бота

const bot = new Telegraf(process.env!.TELEGRAM_BOT_TOKEN)
const telegramownerid = Number(process.env!.TELEGRAM_OWNER_ID) 
const allowTelegramIds = process.env!.TELEGRAM_ALLOW_IDS.split(',').map(e => Number(e))
console.log({
    allowTelegramIds,
    telegramownerid
})
bot.start((ctx) => ctx.reply('Welcome'))
bot.on('message', async function (ctx: Context) {

В рамках данной инициализации мы используем следующие переменные:

  • TELEGRAM_BOT_TOKEN – токен, который мы получили через @BotFather
  • TELEGRAM_OWNER_ID – Мой личный Telegram Id, чтобы можно было идентифицировать меня, как администратора
  • TELEGRAM_ALLOW_IDS – строка, где, через запятую, перечислены Telegram ID людей, которым доступна постановка мне задач.

Обработка входящего сообщения

Сообщение, которое мы отправляем боту, приходит на наш сервер в виде объекта Context, у которого есть поле message с полями:

  • id сообщения
  • текст сообщения
  • информация об отправителе: имя, username и, самое главное, id

Разумеется есть много чего еще, но нам достаточно этого набора полей.

Подготовка объекта на отправку в notion

Для отправки задачи в Notion мы создаем объект

На 3 строчке есть переменная taskDb, туда нам необходимо разместить ID вашей базы данных. Получить её можно из ссылки. Где её взять можете увидеть из скрина ниже.

Расположение ID базы данных

На 23 строчке в примере в переменную tgAuthor, в моем примере, подставляется username пользователя, чтобы потом можно было сообразить. Также можно увидеть другие поля в этом объекте:

  • Name – название задачи,
  • TGAuthor – автор задачи,
  • Status – статус, в который мы отправляем задачу. В нашем примере это Backlog,
  • Source – источник задачи. Проставляем Telegram.

После подготовки объекта мы отправляем POST запрос на метод создания страницы (документация тут). Поскольку мой пример написан на Typescript, я использую NPM пакет @notionhq/client.

После отправки запроса, в Notion, создается карточка задачи, с которой уже можно работать как вам угодно.

Обработка сообщений от других пользователей

В первой же версии я захотел сделать так, чтобы мне могли ставить задачи другие люди. Для решения этой задачи я добавил в env переменные значение TELEGRAM_ALLOW_IDS, где, через запятую, перечислил идентификаторы Telegram пользователей, которые могут ставить мне задачи.

Когда они ставят мне задачу бот также создает задачу в Notion и оповещает меня о том, что кто то осчастливил меня новой задачей.

Вместо заключения

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

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

До связи!