Как перенести заметки из базы знаний Weeek в Obsidian: экспорт через API

Скрипт в моем телеграм канале лежит бесплатно, без подписки

Официального экспорта у базы знаний Weeek нет: ни кнопки в интерфейсе, ни эндпоинтов в Public API. Но перенести заметки всё равно можно автоматически, и я это сделал: выгрузил рабочую базу из 139 статей и 63 вложений в Obsidian готовыми Markdown-файлами. Секрет в том, что веб-клиент Weeek сам получает страницы через внутренний API, и этот канал доступен любому залогиненному пользователю.

Немного о себе: меня зовут Андрей, я занимаюсь SEO и контент-маркетингом, довёл один сайт до 700 тысяч посетителей в месяц и полтора года руководил редакцией, которая вручную написала больше двух тысяч статей. С базами знаний и переездами между ними я на «ты», так что дальше будет не теория, а разбор живой выгрузки. По поисковой выдаче на 30.09.2026 это единственная инструкция полного переноса базы знаний из Weeek на русском языке: других вариантов официально не существует, а неофициальный никто до меня не расписал. План такой: достать куку сессии, скачать дерево и контент статей, запустить скрипт сборки и получить vault с деревом папок, вики-ссылками и вложениями. Отдельно честно расскажу, что не переносится.

Коротко

Официальных дорог из базы знаний Weeek нет: справка знает только печать в PDF, в Public API нет эндпоинтов документов, бэкапа воркспейса тоже нет (проверено 30.09.2026).

Рабочий способ один: внутренний API веб-клиента, те же запросы, которыми браузер рисует базу знаний.

Скрипт из статьи собирает vault: дерево становится папками, вложения складываются в «Вложения», ссылки Weeek превращаются в [[вики-ссылки]], у каждой заметки остаётся ссылка на оригинал.

Кука сессии живёт около 2 часов и равнозначна доступу к аккаунту: получайте прямо перед выгрузкой, файл с ней удаляйте после.

Не переносятся: история версий, комментарии, права доступа. Таблицы, формулы и фреймы доводятся руками.

Других официальных вариантов нет: что говорит сам Weeek

Короткий ответ на вопрос «где кнопка экспорта»: её не существует. Я проверил все три официальных канала, и ни один не отдаёт базу знаний целиком.

Первый канал, справка. Статья «Печать и экспорт» описывает единственный официальный способ забрать документ: иконка печати в правом верхнем углу, затем «Сохранить как PDF» в системном окне (официальная справка Weeek, проверено 30.09.2026). Каждая страница сохраняется отдельным файлом, вручную.

Второй канал, Public API V1 (developers.weeek.net, правки в документации 11.09.2026). Он открывает воркспейс, задачи и CRM, но страниц базы знаний в нём нет: это видно и из документации, и из OpenAPI-спецификации. Скрипт переноса поверх Public API написать невозможно: API просто не отдаст тексты.

Третий канал, бэкап всего воркспейса: его тоже нет, ни в интерфейсе, ни в справке. При этом импорт в Weeek существует: сервис принимает данные из Notion, Trello, Asana, Jira и ClickUp. Дорога в сервис официально односторонняя: принимать гостей умеет, провожать не торопится.

Для контекста: Weeek позиционируется как «виртуальный офис» и складывает задачи, базу знаний, CRM и аналитику в одно окно; на сайте заявлено 150 000+ пользователей (weeek.net, проверено 30.09.2026). База знаний здесь полноценный модуль: древовидные документы, блочный редактор, таблицы, вложения, совместное редактирование (страница возможностей). Задачи, в отличие от заметок, выгружаются: сторонние обзоры упоминают экспорт в XLSX, CSV и JSON, но в официальной справке этой функции я не нашёл, так что считайте её неподтверждённой.

Остаётся ровно один канал, по которому страницы вообще покидают сервис: внутренний API, которым браузер рисует вам базу знаний. Тот же самый, только вызываем его не из браузера, а из скрипта. Если вы только выбираете, куда переезжать, держите ориентир: Obsidian удобен тем, что после переезда ваши заметки перестают зависеть от решения вендора вообще.

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

Смотреть: «Как работать с документами в WEEEK» (официальный канал WEEEK на YouTube).

Как устроен рабочий способ

Внутри Weeek документ хранится не как текст, а как блочный JSON: абзацы, заголовки, списки, картинки, файлы. Веб-клиент получает три вещи: дерево статей, полный список статей и контент каждой статьи по отдельности. Мой конвейер повторяет те же запросы к тем же адресам (эндпоинтам — просто «адресам, по которым программа ходит за данными») и на выходе собирает готовое хранилище. Vault, если вы привыкли к этому слову, это обычная папка на диске, в которой Obsidian держит все заметки.

Конвейер выгрузки базы знаний из Weeek в Obsidian: кука сессии, дерево и список статей, контент, скрипт сборки vault
Конвейер выгрузки базы знаний из Weeek в Obsidian: кука сессии, дерево и список статей, контент, скрипт сборки vault

Из моего опыта: дерево из /kb/hierarchy показало только 49 статей из 139. У части папок дочерние статьи видны только через /kb/articles/search. Поэтому конвейер качает оба списка и объединяет их: без этого шага вы потеряете девять страниц из десяти и даже не заметите.

Скрипт сборки (файл export_weeek.py приложен к статье) делает следующее:

  • раскладывает статьи по папкам зеркально дереву: статья с дочерними разделами становится папкой, её текст лежит одноимённым файлом внутри;
  • пишет в шапку каждой заметки служебные поля: источник, ID статьи, ссылку на оригинал в Weeek, дату обновления и викиссылку на родителя;
  • переводит внутренние ссылки Weeek в [[вики-ссылки]], картинки в ![[файлы]] из папки вложений;
  • скачивает вложения в папку «Вложения» и подставляет их в текст заметок;
  • статьи с удалённым родителем кладёт в корень vault, чтобы ничего не потерялось.

Два честных предупреждения. Первое: API неофициальный, эндпоинты подсмотрены в коде веб-приложения, и Weeek может поменять их без предупреждения. Второе: выгрузка работает только на чтение, в самой базе ничего не меняется.

Что понадобится

  • Git Bash: команды из статьи написаны под него (в Windows он ставится вместе с Git).
  • Python 3: скрипт сборки написан на чистом Python, без сторонних зависимостей.
  • Ваш аккаунт Weeek с доступом к нужному воркспейсу.
  • Свежая кука сессии: живёт около 2 часов, получайте прямо перед выгрузкой.
  • Файл export_weeek.py из этой статьи, положите рядом с рабочими файлами.
  • Уровень: уверенная работа с командной строкой. Время: первый прогон с настройкой укладывается в час, повторные занимают минуты, окно куки (~2 часа) с запасом хватает на базу в сотни статей.

Шаг 1. Получите куку сессии

К концу шага в файле weeek-cookie.txt будет лежать строка с вашей сессией: это пропуск к API.

  1. Откройте app.weeek.net и убедитесь, что залогинены.
  2. Нажмите F12 и перейдите на вкладку Network (Сеть).
  3. Обновите страницу (F5) и в списке запросов кликните любой к домену api.weeek.net.
  4. В Request Headers найдите заголовок cookie и скопируйте значение целиком, от cid=... до конца строки.
  5. Создайте рядом файл weeek-cookie.txt, вставьте скопированное одной строкой без переносов и сохраните.

Кука сессии работает как гостевая карта в отеле: сервер выдаёт её браузеру при входе и узнаёт вас по ней без пароля. Кука — это действующий ключ доступа к вашему аккаунту на ближайшие два часа. Не пересылайте её в чатах, не показывайте на скриншотах и удалите файл сразу после выгрузки. Если запросы начнут отвечать кодом 401, кука протухла: получите свежую по этой же схеме.

Проверка: файл существует, содержит одну длинную строку и ничего больше.

Шаг 2. Скачайте дерево и полный список статей

К концу шага на диске будут hierarchy.json и пачка search-*.json: два взгляда на одну базу, каждый по-своему неполный.

WS=123456 # ваш ID: он в URL, app.weeek.net/ws/123456/... COOKIE=$(head -c -1 weeek-cookie.txt) UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36" curl -s "https://api.weeek.net/ws/$WS/kb/hierarchy" \ -H "Cookie: $COOKIE" -H "Accept: application/json" \ -H "Origin: https://app.weeek.net" -H "Referer: https://app.weeek.net/" \ -H "User-Agent: $UA" -o hierarchy.json for off in 0 100 200 300; do curl -s "https://api.weeek.net/ws/$WS/kb/articles/search?offset=$off&limit=100" \ -H "Cookie: $COOKIE" -H "Accept: application/json" \ -H "Origin: https://app.weeek.net" -H "Referer: https://app.weeek.net/" \ -H "User-Agent: $UA" -o "search-$off.json" sleep 0.2 done

Заголовки Origin, Referer и User-Agent делают запрос похожим на вызов из веб-клиента. Пауза 0,2 секунды держит нагрузку на сервер вежливой. Для баз больше 400 статей понадобится продолжить ряд offset: 400, 500 и дальше, по 100 за шаг.

Проверка: в папке лежат hierarchy.json и четыре search-*.json, и каждый открывается как JSON, а не как HTML с ошибкой. Переменные WS, COOKIE и UA живут до закрытия терминала: следующие шаги выполняйте в том же окне или задайте их заново.

Шаг 3. Соберите полное дерево статей

К концу шага появятся hierarchy-full.json, объединённый список всех статей, и all-ids.txt, их ID построчно.

python -c " import json, glob search = {} for f in glob.glob('search-[0-9]*.json'): for a in json.load(open(f, encoding='utf-8')).get('articles', []): search[str(a['id'])] = a hier = json.load(open('hierarchy.json', encoding='utf-8'))['data']['articles'] union = dict(hier) for k, v in search.items(): union.setdefault(str(k), v) json.dump({'data': {'articles': union}}, open('hierarchy-full.json', 'w', encoding='utf-8'), ensure_ascii=False) open('all-ids.txt', 'w').write('\n'.join(union) + '\n') print('Статей всего:', len(union)) "

Команда складывает оба источника в один словарь: дерево служит основой, поиск добавляет то, чего в дереве не нашлось. У меня на этом шаге список вырос с 49 до 139 статей: это и есть те страницы, которые дерево молча скрывало.

Проверка: команда напечатала «Статей всего: N», и N совпадает с примерным числом страниц в базе. Сверьте с деревом в интерфейсе Weeek: сильное расхождение в меньшую сторону значит, что не все страницы search отдал (проверьте, до какого offset дошли).

Шаг 4. Скачайте контент всех статей

К концу шага в папке contents будет лежать по одному JSON-файлу на каждую статью: полный блочный контент.

mkdir -p contents while read id; do code=$(curl -s -w '%{http_code}' -o "contents/article-$id.json" \ "https://api.weeek.net/ws/$WS/kb/articles/$id/content" \ -H "Cookie: $COOKIE" -H "Accept: application/json" \ -H "Origin: https://app.weeek.net" -H "Referer: https://app.weeek.net/" \ -H "User-Agent: $UA") [ "$code" != "200" ] && echo "ОШИБКА: статья $id (HTTP $code)" sleep 0.25 done < all-ids.txt

Пауза 0,25 секунды между запросами нужна, чтобы не долбить сервер: при моих 139 статьях на одни паузы уходит около 35 секунд, вся выгрузка контента занимает считанные минуты. Строка «ОШИБКА … 401» означает протухшую куку: вернитесь к шагу 1, получите свежую и запустите цикл заново, уже скачанные файлы просто перезапишутся. Если выгружаетесь частями, добавьте в начало цикла строку [ -f "contents/article-$id.json" ] && continue: тогда скачанное не перекачивается (моя доработка, необязательная).

Проверка: число файлов в contents равно числу строк в all-ids.txt, сообщений «ОШИБКА» в выводе нет.

Шаг 5. Соберите vault в Obsidian

К концу шага вся база лежит в хранилище Obsidian: Markdown-файлы по дереву, вложения, ссылки.

python export_weeek.py \ --ws $WS \ --cookie weeek-cookie.txt \ --data . \ --vault "C:\путь\к\хранилищу\Weeek"

Чтобы вы понимали, что скрипт делает с данными, два ключевых фрагмента (полный код в приложенном файле). Шапка каждой заметки:

fm = ["---", "source: weeek", f"weeek_id: {art['id']}", f"url: https://app.weeek.net/ws/{args.ws}/kb/{art['id']}"] if updated: fm.append(f"updated: {updated}") parent = art.get("parentId") if parent and parent in names: fm.append(f'parent: "[[{names[parent]}]]"')

И превращение ссылок Weeek между статьями в викиссылки Obsidian:

text = re.sub(r"\x00LINK:(\d+)\x00", lambda m: f"[[{names.get(m.group(1), 'статья ' + m.group(1))}]]", text)

Вложения скачиваются с именами вида weeek-<id>-<номер>-<название>: уникальные имена гарантируют, что файлы не перезапишут друг друга. Скрипт перезаписывает .md-файлы, но папку vault не чистит: статьи, удалённые в Weeek, останутся в хранилище от прошлого прогона. Если нужна точная копия текущего состояния базы, удалите папку перед запуском:

rm -rf "C:\путь\к\хранилищу\Weeek"

Осторожно: rm -rf удаляет без вопросов и корзины. Проверьте путь дважды.

Проверка: скрипт напечатал «Готово. Статей: …, корневых разделов: …, вложений: …» (у меня 139 и 63), и папка открывается в Obsidian через «Открыть папку как хранилище».

Как выглядит результат в Obsidian

Каждая статья превратилась в заметку .md с понятной шапкой:

--- source: weeek weeek_id: 1234567 url: https://app.weeek.net/ws/123456/kb/1234567 updated: 2026-09-29T18:40:11.123456Z parent: "[[Регламенты]]" ---

Дальше идёт текст статьи: заголовки, списки, чек-листы, выделение, код и картинки сохраняются. Статьи с дочерними разделами стали папками, так что структура дерева читается прямо в проводнике Obsidian. Внутренние ссылки кликаются, картинки открываются из «Вложений», а глобальный поиск (Ctrl+Shift+F) находит любое слово во всей базе. После Weeek это ощущается как переезд из съёмной квартиры в свою: ремонт делаешь когда хочешь и ничего не спрашиваешь.

Чистый блокнот и ручка на столе: база знаний из Weeek теперь живёт в Obsidian обычными Markdown-файлами, которые принадлежат вам
Чистый блокнот и ручка на столе: база знаний из Weeek теперь живёт в Obsidian обычными Markdown-файлами, которые принадлежат вам

Что не переносится

Короткая таблица того, что остаётся в Weeek даже после выгрузки:

  • Элемент - Что с ним происходит - Что делать
  • История версий - Не выгружается: API отдаёт только текущее состояние страницы (в Weeek версии хранятся от 10 дней до года, справка) - PDF-слепок критичных страниц, Weeek в режиме чтения
  • Комментарии и права доступа - API их не отдаёт, скрипт их не получает - Скопировать важные комментарии руками до удаления воркспейса
  • Таблицы, формулы, фреймы - В текущей версии скрипта блоки этих типов пропускаются - Пересобрать в Markdown руками, для сложных страниц держать PDF-слепок (печать по справке)
  • Публичные ссылки - Не переносятся - Настроить заново, если делились страницами наружу
Диаграмма: что выгружается из Weeek в Obsidian автоматически, что правится руками, что не переносится совсем
Диаграмма: что выгружается из Weeek в Obsidian автоматически, что правится руками, что не переносится совсем

Моя рекомендация по критичным страницам с историей правок: не удаляйте воркспейс сразу после выгрузки. Оставьте Weeek в режиме чтения на месяц-другой и убедитесь, что в Obsidian всё на месте.

Типичные ошибки при выгрузке из Weeek

  1. Искать официальную кнопку экспорта. Её нет и в ближайших планах не видно: не тратьте вечер на поиски, все три официальных канала разобраны выше.
  2. Доверять дереву иерархии как полному списку. У меня дерево показало 49 статей из 139. Объединяйте с результатами поиска, шаг 3, иначе потеряете целые ветки.
  3. Оставлять weeek-cookie.txt на диске. Это живой ключ доступа к аккаунту. Выгрузились, проверили результат, удалили файл.
  4. Долбить API без пауз. Паузы 0,2–0,25 секунды в командах стоят не для красоты: сотни запросов подряд без них выглядят как атака.
  5. Править сгенерированные заметки руками до финальной выгрузки. Скрипт перезаписывает .md при каждом прогоне: сначала добейтесь чистовой выгрузки, потом наводите красоту в Obsidian.

Часто задаваемые вопросы

Это же неофициальный API. Насколько это надёжно?

Эндпоинты подсмотрены в веб-клиенте и нигде не документированы: Weeek может поменять их в любом обновлении, и скрипт перестанет работать. Смягчающие обстоятельства: канал работает только на чтение, под вашим аккаунтом и с вашими данными, вы выгружаете ровно то, что видите в интерфейсе. Худший сценарий не страшен: выгрузка сломается, и вы докончите её PDF-печатью или дождётесь фикса конвейера.

Сколько времени занимает выгрузка?

Окно ограничено сроком жизни куки, около 2 часов, и этого хватает с запасом. Первый прогон с настройкой занимает около часа, повторные укладываются в несколько минут. Выгрузка контента базы из 139 статей с паузой 0,25 секунды занимает считанные минуты, вложения добавляют время в зависимости от размера. Это мой опыт одной рабочей базы, официальной статистики нет.

Переносятся ли таблицы и формулы?

В текущей версии скрипта нет: блоки этих типов пропускаются. Таблицы пересобираются в Markdown-синтаксис руками, формулы переписываются в формате $...$. Если таблица — основа страницы, держите рядом PDF-слепок из Weeek.

Что будет с задачами и CRM?

Они живут в других модулях Weeek и этой выгрузкой не затрагиваются. По данным сторонних обзоров, задачи выгружаются в XLSX, CSV и JSON, но официальной справки о такой функции нет. В Obsidian задачи обычно ведут чек-боксами в заметках или Kanban-плагином.

У меня всего десять страниц. Оно мне надо?

Наверное, нет: десять коротких страниц быстрее перенести руками, чем настраивать конвейер. Скрипт окупается, когда статей десятки и сотни: у меня на конвейере было 139 статей и 63 вложения, руками это заняло бы не один день.

Вывод: база знаний должна быть вашими файлами

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

Мой совет: начните с полного прогона по всей базе. Выгрузка дешевле ревизии: сначала заберите всё, потом решайте, что оставлять. И если постоянный экспорт вам действительно нужен, продублируйте запрос в поддержку Weeek: чем больше таких голосов, тем быстрее у сервиса появится честная кнопка.

11