🔎

Notion へ保存した画像に API を使って OCR をかけて検索性を高める

2021/08/27に公開

モチベーション

Web ブラウジングしながら、気になったページを Notion へ放り込んでいる。それも毎日のように。

最近は Twitter 用として OGP 画像が増えてきてるが、字数の問題からか OGP 画像だけにとどまらずちょっと込み入った内容は画像をアップするケースが多くなってきてる感じがする。
もちろん Twitter だけに限らず、Web では上手に図解されて説明された有意義な資料も多い。

また、スマートフォンにおいてはテキストをコピペして保存するより、画面のスクリーンショットを撮ってその画像をそのまま保存するほうが手っ取り早い。

それら Notion に溜まった画像を OCR 処理して検索対象にできると、検索性が高まり一層 Notion の活用の幅が広がってくる。

想定読者

想定している読者は、下記の想定です。

  • Notion API に興味がある
  • Notion に画像がたくさん溜まってる

Notion API のアップデート

5月に待望の API 開放が発表されました。
そのタイミングで Notion と Google Calendar を連携できるようになったのがすごく嬉しかったので、舞い上がった勢いのまま以下の本を書いてます(ここで一旦コマーシャルです)。

https://zenn.dev/nobu/books/215bd245509974

ですが、このタイミングでは、まだ画像が取得出来ないという制限がありました。

そこから3ヶ月経過し、先日のアップデートでようやく念願の画像の取得がサポートされました。Good Job 🎉。

https://developers.notion.com/changelog/page-icons-cover-images-new-block-types-and-improved-page-file-properties

API 公開前からずーっと「Notion の画像に OCR をかけたいなー」と思っていましたので、早速試してみてうまくいったので手順を公開します。

image

仕様

仕様というほど大げさなものではないのですが、処理的には GAS を利用して以下の感じにしてみました。

  1. OCR Text が未入力の Page を検索
  2. 検索された Page から全 Block を取得
  3. 画像の Block から URL を抽出
  4. 抽出した URL で画像を GoogleDrive へダウンロード
  5. GoogleDrive で OCR をかける
  6. Page に OCR Text を入力

OCR Text は Page の Property に仕込んでます。

準備

GAS でコードを書く前に、Notion API を利用するには Token が必要です。事前に設定しておいてください。また、当然ながら対象となるデータベースの ID も必要です。

詳細

下記のページを参考にして notionTokennotionDbId を準備してください。

https://zenn.dev/nobu/books/215bd245509974/viewer/65485b

準備が出来ましたら、新しい GAS ファイルを作成します。

詳細

ここからは下記ページを参考にしてください。

https://zenn.dev/nobu/books/215bd245509974/viewer/d2abc2

実際のコードは以下になります。

取得済みの notionTokennotionDbId を反映させてください。

また、ocrProperty も必要に応じて変更してください。OCR Text が入る Property ですが、使ってないようであればこのままで構いません。

最後に、今回のコードでは標準機能以外の DriveAPI を利用していますので追加してください。

詳細

DriveAPI は下記画面のように追加してください。サービスの「+」をクリックすると選択できます。

image

運用

これで準備は完了しましたので、いよいよ実行してみます。
エディタの 実行 ボタンをクリックすると、OCR 処理されていない最新の 50 件を対象に OCR 処理が走るはずです。なお、1 回目だけは承認画面が出てくるはずですので、理解した上で実行してください。

毎回エディタから 実行 させても良いですが、 GAS のトリガー機能を利用して定期的に実行すると良いでしょう。

詳細

下記ページを参考に、 時間主導型 のトリガーを作成します。
https://tonari-it.com/gas-timed-driven-trigger/

これで任意のタイミングで自動的に OCR 化されるはずです。
毎回 50 件毎の処理になってますが、これは GAS の実行時間制限に引っかからないようするためです。50 件以上でも問題ないはずですが、50 件づつでもいつかは処理が終わる仕様になってます。

注意

Notion 純正の WebClipper はちょっと気が利いていないので、 Save to Notion を利用している人も多いでしょう。僕もその一人です。
https://chrome.google.com/webstore/detail/save-to-notion/ldmmifpegigmeammaeckplhnjbbpccmm

ですが、この拡張機能は公式の API が発表されてないときからのもので、まだ非公式 API を使ってるところが多そうです。

ページを開いて画像を移動させるだけで公式 API からも取得できるようになりますので、拡張機能が公式 API をサポートするまではなんとかやりくりする必要があります。

一度すべてに対して OCR 処理を実施し、ギャラリー表示で画像が表示されるのに no-image になってるものを手動で調整という感じが良さそうです。

コンクルージョン

最初の API 公開から3ヶ月、ようやく実用的になってきた感じ。

一時はみんながあんなに API API 言ってたのに、最近は Google 含めてあまり面白い API 公開がなくなってきた気がする。

そんな中、一般ユーザー向けサービスであろう Notion が着実に API を進化させてるのは、実用的な面でも意気込み的な面でも大変素晴らしい。
ほんと、こんなに良いものを無料で使い続けて良いのかと、逆に申し訳なくなるレベル。
(Zenn で売上が上がったら課金したいですね✨)

今後もウォッチ続けて面白い使い方を考えていきたいところ。

とりあえず、Notion の公式 API だけを使った WebClipper を作りたい欲が高まってきた。

GitHubで編集を提案

Discussion