{
  "$type": "com.whtwnd.blog.entry",
  "theme": "github-light",
  "title": "GitHubのイベントをBlueskyにポストする仕組み作り",
  "content": "本記事は [Bluesky / ATProtocol Advent Calendar 2025](https://adventar.org/calendars/12255) の17日目の記事です。\n[ちなみに去年のアドカレはこちら。](https://adventar.org/calendars/10752)\n\n## 概要\nGitHubリポジトリで誰かがイシューやコメント、PRを作成すると自動的にその旨をBlueskyにポストする仕組みを紹介します。ごめん、他になんもネタ思い付かんかった。  \nきっかけとして、Klearskyのリポジトリにイシューなどをいただくことが稀にあるんですが、取りこぼすんですよね、私メールとか見ないしプッシュ通知も嫌いなので…その割にBlueskyはいつも、いや時々、あー1日1回くらい?は見ているので、そちらで通知を受け取れれば良いかなと。というわけでGitHub ActionsからBlueskyアカウントにログインし、メンション入りのポストを投稿するようにしました。\n\n<blockquote class=\"bluesky-embed\" data-bluesky-uri=\"at://did:plc:ilxxgyz7oz7mysber4omeqrg/app.bsky.feed.post/3m7zxxfteh32k\" data-bluesky-cid=\"bafyreiahvffpfwf3m5qxmspcglanpztvsdqv4s2um5yl6eluyclbf4esbu\" data-bluesky-embed-color-mode=\"system\"><p lang=\"ja\">このようにな<br><br><a href=\"https://bsky.app/profile/did:plc:ilxxgyz7oz7mysber4omeqrg/post/3m7zxxfteh32k?ref_src=embed\">[image or embed]</a></p>&mdash; mimonelu 🦀 みもねる (<a href=\"https://bsky.app/profile/did:plc:ilxxgyz7oz7mysber4omeqrg?ref_src=embed\">@mimonelu.net</a>) <a href=\"https://bsky.app/profile/did:plc:ilxxgyz7oz7mysber4omeqrg/post/3m7zxxfteh32k?ref_src=embed\">2025年12月16日 0:43</a></blockquote><script async src=\"https://embed.bsky.app/static/embed.js\" charset=\"utf-8\"></script>\n\n## 構成\nGitHub ActionsのYAMLファイルと投稿用のスクリプトファイルの2つだけ。Claudeに書いてもらいました(正直)。\n\n### .github/workflows/notify-to-bluesky.yml\n\nhttps://github.com/mimonelu/klearsky/blob/staging/.github/workflows/notify-to-bluesky.yml\n\nご想像の通り、GitHubのSecretsで `BLUESKY_HANDLE` と `BLUESKY_PASSWORD` (アプリパスワード!)を設定する必要があります。ちなみに `BLUESKY_HANDLE` はハンドルだけではなく、メールアドレスやDIDでもOK。これはどんなBluesky関連サービスでも同様のはず。  \n他、特にいじる箇所はないかなと。イベントのトリガー( `on` )くらいでしょうか。\n\n### notify-to-bluesky.js\n\nhttps://github.com/mimonelu/klearsky/blob/staging/notify-to-bluesky.js\n\n変数 `message` にポスト本文が入りますが、 `@mimonelu.net` という文字列が入っているため、このままコピペすると私に通知がずんどこ飛んできてしまいます。再利用したい方は必ず変更してください。\n\nなお言うまでもなく、トリガーとなるイベントの対象は該当リポジトリのみ、またデフォルトブランチのファイルが処理される点にご注意を。\n\n## ミソ\n### RichText\nRichTextで mimonelu.net 宛のメンションを `facets` として埋め込んでいます。 `facets` がないと通知は飛びません。なくてもクライアント上ではハンドルにリンクが張られると思いますが、これはクライアントが気を利かせているだけで、通知そのものはサーバ上で `facets` を見て送信されます。  \n逆に言うと `facets` さえあれば本文中にハンドル文字列があろうとなかろうと通知が飛びます。これは裏技みたいなもので、Klearskyでも「リストメンション」として利用していますが、非推奨です。  \n[実際にリストメンションを使ったポストのレコードはこちら。](https://pdsls.dev/at/did:plc:ilxxgyz7oz7mysber4omeqrg/app.bsky.feed.post/3l3khxtvi2v26)\n\n### サブアカ\n本アカではなくサブアカで投稿させています。通知ポストをフォロワーに見せても仕方がないので…。\n\n### チャット\n通知目的であればポストではなくチャットを送信するべきかもしれません。ただ、Blueskyの仕様では自分自身とチャットすることはできないため、やはりサブアカを使うことにはなるかと。\n\n### createdAt\n`createdAt` に過去の日時を指定すればTLやプロフページのポスト一覧には表示されなくなります(過去ポスト)。[実物はこちら。](https://bsky.app/profile/did:plc:ilxxgyz7oz7mysber4omeqrg/post/3ma3cvkz3pg2m)  \nただし西暦10年以降に限る。昔は西暦1年でも投稿できたんですが、いつからかエラーで投稿できなくなってしまいました。\n\n## GitHubでのユーザーアクションを取りこぼさないことが目的であれば、もっと根本的な解決方法があるのでは?\nチッ そうですね、ただBlueskyには通知プラットフォームとしてのポテンシャルもうんぬんかんぬん  \n以上です。\n",
  "createdAt": "2025-12-17T04:59:10.251Z",
  "visibility": "public"
}