---
title: 'Notion Electron inżynieria odwrotna: Schowek-REA'
url: https://rea.tools/pl/showcase/notion/
---

[Spis treści](https://rea.tools/pl/) / [Gabloty](https://rea.tools/pl/showcase/) / Notion

Studium przypadku \* Electron

# Jak kopie Notion tekst i HTML.

Śledź wywołanie schowka z interfejsu API strony Notion, poprzez wstępne i główny proces, do programu do zapisywania schowka Electron.

Notion Desktop 7.6.1 \* JavaScript \* REA

Mostek wewnątrz pakietu biurkowego Notion

1. 01 \* API skierowane do strony

   `clipboard.write(data)`

   Wstępne obciążenie ujawnia wywołalną metodę.
2. 02 \* opakowanie wstępne

   `ipcRenderer.invoke`

   Opakowanie wysyła kanał i argumenty.
3. 03 \* główny proces obsługi

   `ipcMain.handle`

   Odbiorca sprawdza, która strona Go wysłała.
4. 04 \* Schowek systemowy

   `clipboard.write(data)`

   Electron zapisuje dostarczony tekst i HTML.

Jeden kanał łączy dwie strony: `notion:clipboard:write`

Spakowany kod używa tego samego kanału w procesie ładowania wstępnego i głównego. Rozwiązanie opakowań ujawnia wywołania Electron za tymi nazwami.

## Gdzie idzie operacja kopiowania?

Strona widzi metodę o nazwie `clipboard.write`. Jego implementacja w preload jest opakowaniem. Przydatne pytanie brzmi, co wysyła to opakowanie i który Kod je odbiera.

Twój agent kodowania

Użyj REA, aby prześledzić, w jaki sposób Notion kopiuje tekst i HTML do schowka systemowego. Pokaż kod na każdym kroku.

Przykładowy monit z lokalnym pakietem aplikacji Notion Dostępny dla agenta kodującego.

### REA znajduje, gdzie zacząć czytać

Analiza wstępnego ładowania karty za pomocą REA lokalizuje interfejs API wystawiony na stronę i wywołanie, które wysyła żądanie IPC. Oba ustalenia pochodzą z zakresów źródłowych w minified bundle:

REA → dwa miejsca do otwarcia

Exposed page API

```
api_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
```

Renderer IPC call

```
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
```

Wybrane pola ze świeżych `analyze_javascript_application` wynik na karcie Notion preload, nagrany z REA 4.1.0. Pozycje używają wiersza oryginalnego pakietu i kolumny zerowej.

Agent otwiera te lokalizacje, znajduje element schowka w zmontowanym interfejsie API i czyta `invokerInMain`. Jej Call site supplies `notion:clipboard:write`. Ta nazwa daje agentowi coś precyzyjnego, czego można szukać w głównym pakiecie. Cztery fragmenty poniżej pokazują trasę, którą łączy.

### Cztery krótkie fragmenty kodu

Uproszczony z pakowanego JavaScript, z czytelnymi nazwami zmiennych. Niepowiązani członkowie są pomijani.

1. #### Zacznij od interfejsu API wyświetlanego na stronie

   tab_browser_view / preload.js \* członek API

   ```
   const clipboardApi = {
     write: invokerInMain("notion:clipboard:write")
   };

   // Included in the API exposed through contextBridge:
   // window.__electronApi.clipboard
   ```

   Ten członek podaje nazwę kanału. Realizacja `invokerInMain` informuje nas, w jaki sposób żądanie opuszcza proces strony.
2. #### Rozwiąż opakowanie wstępnego obciążenia

   tab_browser_view / preload.js \* IPC helper

   ```
   function invokerInMain(channel) {
     return (...args) => invokeInMainAndReturnResult(channel, ...args);
   }

   function invokeInMainAndReturnResult(channel, ...args) {
     return ipcRenderer.invoke(channel, ...args);
   }
   ```

   Zwrócona funkcja przekazuje argumenty za pośrednictwem IPC żądania i odpowiedzi Electron. Możemy teraz szukać `notion:clipboard:write` po stronie głównej-proces.
3. #### Sprawdź, jak zarejestrowany jest odbiorca

   główna/index.js \* Pomocnik obsługi

   ```
   const handleRequestFromRenderer = {
     addListener(channel, handler) {
       ipcMain.handle(channel, handler);
     }
   };
   ```

   Główny proces wykorzystuje inne opakowanie. Jego `addListener` metoda rejestruje `ipcMain.handle` odbiornik dla tego kanału.
4. #### Znajdź zapis i sprawdzenie jego nadawcy

   główna/index.js \* odbiornik schowka

   ```
   handleRequestFromRenderer.addListener(
     "notion:clipboard:write",
     (event, data) =>
       isNotionWebContents(event.sender)
         ? clipboard.write(data)
         : undefined
   );
   ```

   To jest cel podróży. Po sprawdzeniu nadawcy program obsługi przekazuje dostarczone dane do interfejsu API schowka Electron. Kanał i dwa rozwiązane opakowania łączą odsłoniętą metodę z tym wywołaniem.

## Jak skopiowany blok zachowuje swoją strukturę?

Edytor internetowy Notion wysyła tekst i HTML poprzez `electronApi.clipboard.write`. Przechowuje dane bloku lokalnie i umieszcza identyfikator w skopiowanym kodzie HTML, aby je połączyć.

Linki HTML do zapisanych danych blokowych

Wysłane do schowka systemowego

```
text: "Project notes"
html: "<p>Project notes</p>"
    + "<!-- notionvc: <copy-id> -->"
```

Zapisane lokalnie przez Notion

```
id: <copy-id>
mimeTypes:
  text/_notion-blocks-v3-production
    → structured block data
```

1. Przeczytaj identyfikator HTML
2. Znajdź ten sam lokalny identyfikator
3. Przywróć dane bloku Notion

Tekst ilustracyjny i ID. Nagrany test modułu przywraca dane bloku, gdy identyfikatory są zgodne; Nieaktualny wpis zwraca tylko tekst i HTML.

Po wklejeniu Notion szuka identyfikatora HTML i sprawdza go z zapisaną kopią. Pasujące identyfikatory przywracają dane bloku.

Format schowka nagrany z zasobów internetowych buforowanych 13 lipca 2026 r.

## Więcej przykładów i źródeł

Inny przykład: tabele przeceny

Notion analizuje Markdown na dane blokowe. Ten przykład pokazuje, jak tabela staje się nagłówkiem i wierszami danych.

Tabela za pośrednictwem parsera Markdown Notion

Wejście Markdown

```
| A | B |
| - | - |
| 1 | 2 |
```

Ustrukturyzowane wyjście parsera \* fragment

```
table · headerRow: true
  table_row
    cells: ["A"], ["B"]
  table_row
    cells: ["1"], ["2"]
```

Nagrane wyjście z wyodrębnionego parsera przeceny. Tabela staje się wierszami i komórkami.


Inna ścieżka: połączenie offline SQLite

Żądania renderowania Notion `getSqliteMeta` przez IPC. Główny proces tworzy kanał wiadomości i daje jeden port rendererowi, a drugi procesowi narzędziowemu SQLite. Kolejne partie wyciągów i wyniki przemieszczają się przez ten port.

Po tym przekazaniu wyjaśniono, gdzie działa baza danych i dlaczego śledzenie tylko początkowego żądania IPC pomija późniejszą rozmowę.


Źródła i jak czytać fragmenty

Mostek schowka pochodzi z Notion Desktop 7.6.1 `app.asar`: zakładka preload i `main/index.js`. Fragmenty rozszerzają minifikowane nazwy zmiennych i pomijają niepowiązany kod; Pomocnik sender-check jest wyświetlany wraz z jego podstawą `isNotionWebContents` zadzwoń.

Przykłady Wirtualnego schowka i Markdown pochodzą z zasobów internetowych buforowanych 13 lipca 2026 r., w tym modułów `747001`, `58169`, `736810` oraz `422457`. Te aktywa mają swoją własną wersję. Zapisane sondy wykonywały wyodrębnione moduły i małe wiązki; ich wyjścia opisują te sondy, a nie przechwyconą sesję interfejsu użytkownika pulpitu.

Pokazany tutaj wynik REA jest skoncentrowaną analizą zapisanego obciążenia wstępnego karty, zarejestrowanego z opublikowanym pakietem REA 4.1.0. Lokalizuje API i wywołuje operację. Element składowy schowka i pasujący odbiornik są połączone poprzez odczytanie ich implementacji opakowania w pakiecie.

Przykład Markdown wykorzystuje moduł parsera `422457`. Zapisane testy modułów pokazują, że zarówno filtry strony, jak i czatu zachowują tę tabelę. Parsery paste/import, structured Markdown i AI/chat mają oddzielne punkty wejścia i formaty pośrednie.

- [JavaScript Przewodnik aplikacji](https://rea.tools/guides/javascript/)Postępuj zgodnie z funkcją eksportu małej aplikacji Electron.
- [DX-Ball](https://rea.tools/pl/showcase/dx-ball/)Postępuj zgodnie z natywnymi instrukcjami sprawdzonej funkcji C.

[Analizuj własną aplikację](https://rea.tools/get-started/)
