はじめに
hkob の雑記録の第575回目(連続148日目)は、はてなブログの投稿をXにポストするショートカットの作成したことを記録しておきます。
(追伸) なぜか私の iPhone や iPad だとアラートまで表示されるのですが、X のポストアクションで落ちてしまいました。これも有料化に絡む部分で使えなくなってしまったのでしょうかね。
はてなブログの投稿自動化機能の削除
以前は、はてなブログは予約投稿時に X にポストする機能が存在していました。しかし、X の API の有料化に伴い機能がなくなってしまいました。仕方なく、X のポスト文を Notion のフォーミュラで作成し、手動でポストしていました。しかし、どうしても手動での作業はつい抜けてしまいます。そこで、ショートカットでサポートすることを考えてみました。
NotionRubyMapping による必要な情報の取得
まず、今編集しているページを取得します。Cmd-L で URL を取得して、その URL から page を取得します。
page = Page.find "https://app.notion.com/p/hkob-private/Notion-X-hkob-573-3b10ce2a6520814a98c5df84dd0300c0?source=copy_link" => NotionRubyMapping::Page-3b10ce2a6520814a98c5df84dd0300c0
このページの親を取得します。
ds = page.parent => NotionRubyMapping::Database-2280ce2a65208007bb54f8509503f397
Wiki なので Database が取得されてしまいました。仕方がないので、data_sources から取得します。
ds = ds.data_sources.first => NotionRubyMapping::DataSource-2280ce2a65208172ad47000be5c535a8
このデータソースと今日の日付から上で取得した page が取得できるように query を作成します。無事に同じ page が取得できたことを確認できました。
page2 = ds.query_data_source(ds.properties["日付"].filter_equals(Date.today - 1)).first => NotionRubyMapping::Page-3b10ce2a6520814a98c5df84dd0300c0
このための payload を表示します。API は UTC で動作するため、Timezone 情報を含まない日付情報では正しいページが取得できません。NotionRubyMapping では日付の等価比較の場合には、0:00から23:59までの範囲比較の payload を作成してくれます。この情報を使ってショートカットを作成します。
print ds.query_data_source(ds.properties["日付"].filter_equals(Date.today - 1), dry_run: true) #!/bin/sh curl -X POST 'https://api.notion.com/v1/data_sources/2280ce2a65208172ad47000be5c535a8/query' \ -H 'Notion-Version: 2026-03-11' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Content-Type: application/json' \ --data '{"filter":{"and":[{"property":"日付","date":{"after":"2026-08-04T00:00:00+09:00"}},{"property":"日付","date":{"before":"2026-08-04T23:59:59+09:00"}}]},"page_size":100}'=> nil
実際のテキストは以下のように取得できます。
page2.json["properties"]["X"]["rich_text"][0]["plain_text"] => "hkob の雑記録 第573回目は、はてなブログ投稿を X に自動投稿するショートカットを作成したことを記録しています。(要約 by Notion AI)\n#NotionTips #X自動投稿"
作成したショートカット
ショートカット名は「はてなブログ→X」としました。最初に NOTION_API_KEY が一番上に置かれています。その部分は隠していて、次に置かれている dsid と名付けた data_source_id が続いています。通常はブログを投稿する前日に記事を作成しているので、現在の日付から1日引いた日付を ISO8601 フォーマットに変換しています。

ここから先はアクションごとに表示します。次は payload という名前のテキストです。payload は先ほど NotionRubyMapping で作成したものです。日付の部分だけ ISO8601 に変換したテキストで置き換えています。

あとは、API を呼び出すだけです。ファイルで payload テキストを書けることがわかってから、ショートカットの作成は本当に楽になりましたね。

取得した JSON データから plain_text を取得します。page は results の中の最初の要素なので、results.1 となります。あとは、NotionRubyMapping で取得した JSON と比較すると以下のように取り出せることがわかります。

間違ってショートカットを実行してしまうことも考えられるので、人間による確認を入れるようにしました。問題がなければ X アクションを使ってツイートすることにします。

おわりに
昨日、ブログを書き忘れました。執筆は一日遅れですが本日の投稿分としておきます。このブログ記事のリンクがポストできるといいのですが。