私は今までローカルの Dropbox フォルダ以下にブログ記事の下書きを保管していました。

MacDown というマークダウンエディタで下書きを作成、Alfred で下書きフォルダを開く、といった方法で運用していました。その辺については以下に細かく書いています。

この方法ですがそもそも Dropbox Paper を使えばローカルにファイル保存しなくていいし、マークダウン対応してるし、PC でもスマホでも関係なく使えるのでええやんと思い始め、Dropbox Paper を使ったフローに移行することにしました。

そこで引き続き Alfred でシュッと下書きを参照したり新規記事を作成出来れば嬉しいので今回そのような Alfred Workflow を作ってみました。

こんな感じです。

仕組み

Dropbox API v2 を使用して Dropbox Paper ドキュメントの一覧を取得しています。言語は Python を使用しています。

Python 向け SDK も用意されているのですが、Alfred Workflow で動かしたいのでなるべく環境依存は減らしたいので標準の HTTP クライアントで API を叩いています (といいつつ Python 3 前提なので Python 3 入れないと使えませんが…w)。

/docs/list でドキュメントの ID 一覧を取得し、/docs/download でドキュメントの内容をマークダウンで取得、タイトルのみを抜き出して一覧しています。そう、一発でタイトルを取得する API が無いのです…。

Paper API という Dropbox Paper 用の独立したアルファ版の API があるっぽいのですが、最終更新日も古く予告なく消えるかもとのことなので使ってません。この API であればタイトルとドキュメント ID を一発で取れるんですけどね…。

ドキュメントのリンクの取得方法ですが、どうやら Dropbox Paper ドキュメントのリンクは https://paper.dropbox.com/doc/<ドキュメント ID> でアクセス出来るようなので (ダメ元で試してみたら出来た) それを使っています。

取得したドキュメントのタイトルとリンクを Alfred Workflow の要求する JSON 構造に整形して出力すればほぼ完成。要求される JSON 構造の詳細は以下のドキュメントにあります。

私はとりあえず最低限の構成で以下のような JSON を返すようにしています。

{
  "items": [
    {
      "title": "タイトル 1",
      "arg": "https://paper.dropbox.com/doc/<ドキュメント ID>"
    },
    {
      "title": "タイトル 2",
      "arg": "https://paper.dropbox.com/doc/<ドキュメント ID>"
    }
  ]
}

arg がキモで、arg の値は次のフローへ引き渡すことが出来ます。今回はタイトルを一覧し、タイトルを選択したら Dropbox Paper 編集画面へ飛ばしたかったのでドキュメントの URL を arg に渡し、「Open URL」アクションで開くようにしています。

あとは API を叩くために Dropbox のアクセストークンを設定する必要があるのですが、これは Keychain Access.app に保管するようにしてします。例えば以下のコマンドで Keychain Access.app へ保管、取り出しが出来ます。

$ security add-generic-password -a $USER -s <Keychain Access.app 内の名前> -w <アクセストークン> -U

$ security find-generic-password -a $USER -s <Keychain Access.app 内の名前> -w

この方法は以前同僚に教えてもらった方法です。 😊

感想

この記事の下書きも Dropbox Paper で書いていますが良い感じです。

作成した Alfred Workflow を使ってみた感想は以下。

  • 検索も出来るようにしたい。
  • アーカイブ、削除した記事も一覧されてしまう (困る)。
  • 作成日 (もしくは変更日) でソートした方が使いやすそう。
  • 作成日や変更日といったメタデータも小さく出したい (表示自体は subtitle キーを追加すれば可能)。
  • Alfred Workflow を自動でビルドするようにしたい (手で上げるの面倒)。

使いやすいように改造していくぞ。💪