Как стать автором
Обновить

Google Keep как инбокс, интеграция с Telegram

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров8.3K

Привет! В этой статье я расскажу, как решил одну, казалось бы, простую на раздражающую проблему — как быстро сохранить информацию из разных источников в одно место, чтобы ничего не терялось.

Ссылки, скриншоты, статьи, заметки на ходу, важные сообщения — всё это появляется спонтанно, быстро, в разных местах. А потом так же быстро теряется. Закладки, «Избранное» в Telegram, «Посмотреть позже» — удобны в моменте, но со временем превращаются в захламлённые корзины. И главное — всё это разбросано по разным сервисам.

Я искал инструмент, который позволял бы мне фиксировать все интересное быстро, удобно и централизованно. И таким инструментом стал Google Keep — инбокс, точка входа для всего. Расскажу, почему выбрал именного его и как сделал интеграцию с Telegram.

Почему именно Google Keep

Сразу уточню: для ведения заметок, размышлений и структурирования знаний я использую Obsidian. Google Keep в моей системе — это не про долговременное хранение, а про скорость. Это инструмент, чтобы зафиксировать что‑то на ходу, не потерять в моменте.

Полезные ссылки, статьи, видео — всё это часто отправляется в закладки браузера, избранное Telegram или «Посмотреть позже» на YouTube. Основная проблема заключается в том, что это все распылено по разным сервисам и со временем превращается в кладбище забытой информации, в которой найти что‑то уже почти нереально.

Моя цель — собрать всю важную информацию в одном месте. Google Keep отлично справляется с этой задачей: просто, быстро, универсально. Главная метрика здесь — минимальное время от появления мысли до её фиксации.

  • Увидел интересную статью — жму «Поделиться», отправляю в Keep.

  • Фрагмент из видео? Скриншот — и в Keep.

  • Отрывок из текста? Расширение для Chrome позволяет Сохранить выделенное за секунду.

Расширение Google Keep для Chrome
Расширение Google Keep для Chrome

На телефоне я настроил двойной тап по крышке на открытие Keep — можно сразу надиктовать или записать мысль.

Всё: статьи, скриншоты, идеи — собирается в одном месте. Это даёт контроль и уверенность, что ничего не ускользнёт.

Чего на хватало: интеграция с Telegram

Telegram — мой основной мессенджер. Каналы, чаты, личка — постоянно появляется что‑то, что хочется сохранить. Но «Избранное» давно превратилось в свалку: файлы, ссылки, заметки вперемешку, ничего не найти. Возвращаясь к основной мысли статьи — нужен единый инбокс для хранения такой информации. Мне нужен был способ быстро и удобно перекидывать важные сообщения из Telegram в Google Keep.

К своему удивлению, готового решения, которое устраивает меня и работает, я не нашел. Более того, у Google Keep нет публичного API — доступ дается только для корпоративных аккаунтов.

Наткнулся на неофициальную библиотеку для Python — gkeepapi, которая работает с приватным API Android‑приложения. Для ее использования нам потребуется master-токен.

  1. Переходим на страницу https://accounts.google.com/EmbeddedSetup, входим в аккаунт.

  2. При помощи любого средства для просмотра cookie ищем наш oauth_token (скриншот приведем ниже)

  3. Используя библиотеку gpsoauth получаем master token (я использовал Docker, команда приведена ниже)

Нас интересует oauth_token, который начинается с 'oauth2_4/'
Нас интересует oauth_token, который начинается с 'oauth2_4/'

Docker команда для получение master-токена (начинается с aas_et/), указываем почту, полученный раннее oauth токен, Android Id оставляем пустым:

docker run --rm -it --entrypoint /bin/sh python:3.8 -c 'pip install gpsoauth; python3 -c '\''print(__import__("gpsoauth").exchange_token(input("Email: "), input("OAuth Token: "), input("Android ID: ")))'\'

После того, как мы получили токен, можно приступать к написанию самого Telegram бота, в этом абсолютно нет ничего сложного. Бот должен сохранять обычные сообщения от пользователя, пересланные сообщения от других пользователей и каналов, чатов.

import asyncio
import logging

from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.dispatcher.middlewares.base import BaseMiddleware
from typing import Callable, Dict, Any, Awaitable
import gkeepapi

from config import *


# Настройка логов
logging.basicConfig(level=logging.INFO)

# Инициализация Google Keep
keep = gkeepapi.Keep()
success = keep.authenticate(GOOGLE_EMAIL, MASTER_TOKEN)

# Инициализация бота
bot = Bot(token=TELEGRAM_BOT_TOKEN)
dp = Dispatcher()


# Middleware, который пропускает только сообщения от владельца бота
class OnlyUserMiddleware(BaseMiddleware):
    def __init__(self, allowed_user_id: int):
        self.allowed_user_id = allowed_user_id

    async def __call__(
        self,
        handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
        event: Message,
        data: Dict[str, Any]
    ) -> Any:
        if event.from_user.id != self.allowed_user_id:
            return  # Игнорируем сообщение
        return await handler(event, data)


# Регистрируем middleware
dp.message.middleware(OnlyUserMiddleware(TELEGRAM_OWNER_ID))


# Обработка текстовых и пересланных сообщений
@dp.message()
async def save_note(message: Message):
    content = message.text or message.caption
    if not content or content.startswith("/"):
        return  # Игнорируем команды и пустые тексты

    header = "Заметка из Telegram"

    if message.forward_from:
        username = message.forward_from.username or ''
        full_name = f"{message.forward_from.first_name or ''} {message.forward_from.last_name or ''}".strip()
        sender_info = f"@{username}" if username else full_name
        header = f"Переслано от пользователя: {sender_info}"

    elif message.forward_sender_name:
        header = f"Переслано от: {message.forward_sender_name}"

    elif message.forward_from_chat:
        chat = message.forward_from_chat
        sender_info = f"@{chat.username}" if chat.username else chat.title or "Неизвестный канал"
        header = f"Переслано из канала: {sender_info}"

    note = keep.createNote(header, content)
    note.color = gkeepapi.node.ColorValue.Blue
    keep.sync()

    await message.reply("Заметка сохранена в Google Keep!")


# Запуск
async def main():
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())

Для удобства я еще создал Dockerfile, тут тоже нет ничего сложного. Исходный код опубликован в GitHub и доступен каждому.

Пример работы
Пример работы

Что дальше

Google Keep — это лишь точка входа. Заметки сами по себе ничего не решают, если они не будут осмысленны и обработаны в дальнейшем. В моем случае Google Keep — просто инбокс, который наполняется и чистится регулярно. Раз в неделю я выделяю время, просматриваю содержимое Keep, переношу важное в Obsidian, удаляю остальное.

Касаемо Obsidian — я пробовал разные решения для экспорта заметок из Google Keep, но все они основаны на разовом импорте через архив, как я понял, и это мне не подходит. В будущем обязательно хочу написать свой плагин, который упростил разбор инбокса.

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

Google Keep — не как способ постоянного хранения заметок, хотя и он тоже, это больше инструмент для фиксации и сбора информации. Он помогает не забывать важное, а дальше — все зависит от того, как работать с заметками.

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

Полезные ссылки

https://github.com/kiwiz/gkeepapi — билиотека для работы с Google Keep
https://github.com/simon‑weber/gpsoauth — библиотека для получения master‑токена
https://github.com/rukins/gpsoauth‑java/blob/b74ebca999d0f5bd38a2eafe3c0d50be552f6385/README.md#first‑way — получение oauth токена

Мой репозиторий на GitHub — буду рад предложениям по улучшению работы бота!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Сохраняешь в Google Keep?
73.44% Да47
26.56% Нет17
Проголосовали 64 пользователя. Воздержались 6 пользователей.
Теги:
Хабы:
+12
Комментарии21

Публикации

Ближайшие события