はじめに
hkob の雑記録の第321回目は、昨日の続きでいよいよショートカットアプリを作成します。
基礎部分の作成
写真を撮ってテキストを取得するまではこれまでのものと同じです。ギャラリービューの表示であればそれほどの解像度は必要ないので、横ピクセルサイズを640くらいにサイズ変更しています。この後のアップロードの20MB制限にかからないようにファイルサイズを小さくする目的もあります。また、実際にファイルの形式にする必要があるので、JPEG に変換しました。

FileUploadObject の作成
まずは FileUploadObject の作成です。ただし、NotionRubyMapping では multipart の処理などをライブラリ内に隠してしまったので、dry_run などで内容を確認できません。このため、テストに利用した fixtures データで確認します。 spec/fixtures/create_file_upload_image.sh は以下のようになっています。
#!/bin/sh curl --request POST \ --url 'https://api.notion.com/v1/file_uploads' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Content-Type: application/json' \ -H 'Notion-Version: 2025-09-03' \ --data '{}'
これによって返却された JSON がこちらです。ここで必要なのは、 id と upload_url です。
{ "object": "file_upload", "id": "20cd8e4e-98ab-81aa-973b-00b23083c115", "created_time": "2025-06-08T11:34:00.000Z", "created_by": { "id": "40673a87-d8ed-41e0-aa55-7f0e8ace24cd", "type": "bot" }, "last_edited_time": "2025-06-08T11:34:00.000Z", "expiry_time": "2025-06-08T12:34:00.000Z", "upload_url": "https://api.notion.com/v1/file_uploads/20cd8e4e-98ab-81aa-973b-00b23083c115/send", "archived": false, "status": "pending", "filename": null, "content_type": null, "content_length": null, "request_id": "32fdc5bc-ff34-4501-9b7c-ad2a14c5f9b5" }
ここまでをショートカットに取り入れます。まずは、NOTION_API_KEY と機能取得した DataSource の id をテキストで記録しておきます。

API アクセスの部分は以下のようになります。

返却された JSON の id と upload_url の値を辞書から取得しておきます。

ファイルアップロード
次に file_upload_object に対して、ファイルをアップロードします。スクリプトはこちらです。
curl --request POST \ --url 'https://api.notion.com/v1/file_uploads/20cd8e4e-98ab-81aa-973b-00b23083c115/send' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Notion-Version: 2025-09-03' \ -H 'Content-Type: multipart/form-data' \ -F "file=@ErSxuLeq.png-medium.png"
これをショートカットにすると以下のようになります。

ファイルの部分にはサイズ変換した後の画像を設定しています。

ページ追加
まずはページ作成のための JSON を作成します。改行が含まれるので、それを「\n」に書き換えた後で、JSON の中に埋め込みます。file_upload_object の id と data_source_id は事前に準備したものを埋め込んであります。

この JSON を使ってページを作成します。

あとは作成されたページを開くだけです。

動作確認
作成したショートカットを起動するとカメラが起動します。iPad で先日のブログ記事を表示し、iPhone で撮影してみました。ここで、「写真を使用」とすると、API 経由で写真がアップロードされ、作成したページが表示されます。

実際に作成されたページは以下のようになります。余計な情報が入っていますが、本来の名刺であればこれらはないはずなので、問題はないでしょう。名刺画像に撮影した写真も登録されているのが見えます。

おわりに
今回はショートカットでページを作成するところまでを実施しました。結局 API から展開されたテンプレートページでは AI が発行しないことがわかったので、明日は crm コマンドの作り直しをして完成とします。