{
  "$type": "com.whtwnd.blog.entry",
  "blobs": [
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreihn66o4jifl4sgbnnxzihcifrvniu2mtqnqvvjypgsvdsfl3p2yla"
        },
        "mimeType": "image/jpeg",
        "size": 183847
      },
      "encoding": "image/jpeg",
      "name": "Chronosky Landing.jpeg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreiak4nmus2pvocs2wtzrhzesm4jjv3mxe37lfwqqbd6scfh4gieahy"
        },
        "mimeType": "image/png",
        "size": 364886
      },
      "encoding": "image/png",
      "name": "ScreenShot 2025-12-17 15.10.48.png"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreihnqq22ij3nodljycvkylfgl7qbdojh3chpu7o55qcazgihk32lnq"
        },
        "mimeType": "image/png",
        "size": 494368
      },
      "encoding": "image/png",
      "name": "ScreenShot 2025-12-17 15.10.59.png"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreifzdpecy3vxnuhe3yrg33wywo2u7u7knhciio5t75ymgmetrl7bxy"
        },
        "mimeType": "image/jpeg",
        "size": 139192
      },
      "encoding": "image/jpeg",
      "name": "auth-login.jpg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreich7zkp2prlwd7jt2g6zopr5nqcig5lecu6bfx6i3yjemxpat27le"
        },
        "mimeType": "image/jpeg",
        "size": 133697
      },
      "encoding": "image/jpeg",
      "name": "サインイン with Bluesky.jpeg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreigukifggy77npbukqrc5s4mmnlhzpiqvg44gajwoqnzvakaf44th4"
        },
        "mimeType": "image/jpeg",
        "size": 141863
      },
      "encoding": "image/jpeg",
      "name": "認可画面.jpeg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreia3xwj4r476nrtvprvujtcmvca7nuj2kwbla4nso74sz2iffwh2za"
        },
        "mimeType": "image/png",
        "size": 119226
      },
      "encoding": "image/png",
      "name": "dashboard-firstseen.png"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreif6vqak366hgv7k52eshjv43d7zudu5ke2ohhujdyq7rxc2v7rfwq"
        },
        "mimeType": "image/jpeg",
        "size": 152669
      },
      "encoding": "image/jpeg",
      "name": "スケジューラ認可.jpeg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreidmk5vkkyk22x34whmsvb2bgt6zdslomyzmpl7u4ubrjruup65ww4"
        },
        "mimeType": "image/jpeg",
        "size": 196232
      },
      "encoding": "image/jpeg",
      "name": "Chronosky - Bluesky Scheduled Posting.jpeg"
    },
    {
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreichuezm5ijmybppiwvzmul2pdkz3wyby7vckizitdbl7lptcmktly"
        },
        "mimeType": "image/jpeg",
        "size": 12834
      },
      "encoding": "image/jpeg",
      "name": "card8-groupe.jpg"
    }
  ],
  "content": "し た い よ ね ?\n\n> この記事は [Bluesky / ATProtocol Advent Calendar 2025](https://adventar.org/calendars/12255) 18日目の記事になります。\n\nはじめまして、 あのん ([@anon5r.com](https://bsky.app/profile/anon5r.com)) と申します。普段Blueskyでは anon と名乗ってます。~~表記は定まってないのでどちらでも良いです。~~\n\n普段はダジャレと空リプをポストすることを生業としています。\n\n\n# 予約投稿機能が欲しい!\n\n前置きはさておき、Blueskyでも予約投稿したいですよね。\n\n折しも先日、[トランセンドジャパンさん(@transcend.co.jp)](https://bsky.app/profile/transcend.co.jp)からこんなポストがありました。\n\n<blockquote class=\"bluesky-embed\" data-bluesky-uri=\"at://did:plc:md56jjguqb2rb2pajm7lpjnq/app.bsky.feed.post/3ma3rhxyjq22c\" data-bluesky-cid=\"bafyreiclzpn7mkwv6rwovwa3pxswayuc3dvozzpnjwdor4j5ia2c6rbv54\" data-bluesky-embed-color-mode=\"system\"><p lang=\"ja\">突然ですが…Blueskyに追加してほしい機能や改善してほしい点などありますか?</p>&mdash; トランセンドジャパン公式 (<a href=\"https://bsky.app/profile/did:plc:md56jjguqb2rb2pajm7lpjnq?ref_src=embed\">@transcend.co.jp</a>) <a href=\"https://bsky.app/profile/did:plc:md56jjguqb2rb2pajm7lpjnq/post/3ma3rhxyjq22c?ref_src=embed\">2025年12月16日 17:53</a></blockquote><script async src=\"https://embed.bsky.app/static/embed.js\" charset=\"utf-8\"></script>\n\n<blockquote class=\"bluesky-embed\" data-bluesky-uri=\"at://did:plc:md56jjguqb2rb2pajm7lpjnq/app.bsky.feed.post/3ma3rrfykqs2c\" data-bluesky-cid=\"bafyreickes3swmytygygw3lf44fowkj3cmzyk74uxwclfxba4evvdo63va\" data-bluesky-embed-color-mode=\"system\"><p lang=\"ja\">Blueskyの方とお話する機会がありますので、皆さんのご意見をお伝えできたらなと思ってます。</p>&mdash; トランセンドジャパン公式 (<a href=\"https://bsky.app/profile/did:plc:md56jjguqb2rb2pajm7lpjnq?ref_src=embed\">@transcend.co.jp</a>) <a href=\"https://bsky.app/profile/did:plc:md56jjguqb2rb2pajm7lpjnq/post/3ma3rrfykqs2c?ref_src=embed\">2025年12月16日 17:58</a></blockquote><script async src=\"https://embed.bsky.app/static/embed.js\" charset=\"utf-8\"></script>\n\n\nツリーを見ているとBlueskyに期待しているものとして多くの方から様々な案が上がっている中に予約投稿がありました。正直、私もほしいです。\n\n## ないならば、作ってしまおうホトトギス\n\n曲がりなりにもコードを書いてお金をもらう仕事をしているので、やる気さえあれば術はある。\n\n\nやる気があれば。\n\nということで、どうにかやる気を出してこれを作っていきます。\n\n\n# とりあえずできました\n\n……という訳で、サクッと作ってできました。\n予約投稿ができるサービス **[Chronosky](https://chronosky.app)** です。\n\n~~サクッとはウソです。なんだかんだ動くまで3〜4ヵ月はかかりました。~~\n\n[![Chronosky landing page](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreihn66o4jifl4sgbnnxzihcifrvniu2mtqnqvvjypgsvdsfl3p2yla)](https://chronosky.app)\n\n\n\nありがとうございます。私も欲しかった機能ができました👏👏\n\n\nちなみにこの記事の告知もChronoskyから行いました😛\n\n\n事前に限定公開し、テスト利用もしてもらいましたが、UIもイケてないところはあるので、当面ベータ版扱いです。\n\n(テストの際はDiscordサーバー Bluesky Hacker's Space のみなさんに協力いただきました。ありがとうございます🙇‍♂️)\n\n\n\n## なにができるの?特徴は?\n\nほとんどはBlueksyの投稿時にできることと変わらないです。むしろ足りてないこと多いです。\n\n### ✏️ 予約投稿の作成\n\nChronoskyはBluesky向けの予約投稿サービスです。**指定した時刻に予め予約された投稿をポストできます**。予約されたポストデータはサービスのサーバーに保管されます。なのでアカウントのリポジトリ(ATProtocolにおけるアカウントのデータがある場所)ではないです。\nなので投稿される前の予約ポストがうっかり見えてしまう。ということはありません。\n\n### 🖼️ 画像の添付\n\nBlueskyと同じく最大4枚まで画像を添付して投稿可能です。\n画像の編集機能はないためクロップ(切り抜き)や変形はできません。\nサイズの大きな画像はリサイズまたは圧縮して投稿されます。\n\n### 🔗 スレッド投稿\n\n長文を複数投稿を繋げて一回で投稿できます。\n\n### 🗓️ 予約の管理\n\n予約済みまたは過去に投稿したポストを管理できます。\n作成した投稿は予約時間の3分前まで編集することができます。もちろん予約時間の変更も可能です。最短5分前(ただし通常は10分単位)まで指定できます。\n\n![予約投稿一覧画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreiak4nmus2pvocs2wtzrhzesm4jjv3mxe37lfwqqbd6scfh4gieahy)\n\n### 🔍 投稿のプレビュー\n\n実際に投稿した際に、どのように表示されるかをプレビューできます。ただしBlueskyアプリを完全に再現したものでもなく、利用するクライアントによっても見え方はやや異なるためこれは目安程度と捉えてください。\n\n![投稿プレビュー画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreihnqq22ij3nodljycvkylfgl7qbdojh3chpu7o55qcazgihk32lnq)\n\n---\n\n## 💔 できないこと\n\nできないこともたくさんあります。\n\n#### 他のSNSへのクロスポスト\n\n現在のところBluesky専用です。ATProtocolを利用したBluesky以外のSNSで需要があれば、それはいずれ検討したいです。\n\n#### 投稿の統計分析\n\nどれくらい見られたか、どれくらい反応があったか。といった統計は持っておらず、情報提供はありません。\n\n#### その他マーケティング機能\n\nマーケティングツールとしてのサービスではないので、必要な場合は[Buffer](https://buffer.com)、[Metricool](https://metricool.com)などの類似相当以上の機能を持つマーケティングツールを検討してください。\n\n#### ~~サービスを通じた暴力的、残虐性、性的な画像の投稿~~\n\n~~これは機能実装上の問題で、コンテンツ警告ラベルを追加しての投稿ができないため、NSFW画像を添付しての投稿は禁止としています。最悪、アカウントが凍結されるなどの原因になりますのでこれは控えてください。~~\n\n~~機能実装が完了したらこれも常識の範囲で許容できるようにしたいです。~~\n\n\n2026年1月6日以降、画像投稿時の警告ラベルを付けられるようになりました。 \n各自で投稿時に適宜設定してご利用ください。\n(*2026年1月12日追記*)\n\n#### Blueskyクライアントとの統合\n\n残念ながらこれもできません。サードパーティサービスとして単独で利用する形です。\n\n将来的にはサードパーティ製アプリ内からシームレスに利用できるようにできたら良いなと考えています。でも現時点ではただの妄想です。\n\n現状クライアントと統合で提供されているのは[TOKIMEKI](https://tokimeki.blue) と、 [deck.blue](https://deck.blue) の有償サポーター向け機能です。これはクライアントと統合されており、理想的な形でスムーズに利用可能です。\n\n#### 繰り返しの定期ポスト\n\n今のところ計画外。\n\nTwitterに以前あった定期投稿サービスを見ていて思ったのが、定期投稿設定をしたまま放置されているなどのケースをよく見かけて、逆にその投稿がノイズだなと正直思っていたのであまり乗り気になっていないので敢えて実装から除外してます。\n\n良い解決方法があれば実装したいです。\n\n\n---\n\n\n# 使い方\n\n使い方は[ドキュメントガイド](https://docs.chronosky.app/ja/guide/quick-start)としてもまとめているので、そちらを見ていただきたいです。\n\nが、ここでもザックリ説明してみます。\n\n#### ログイン\n\nまずトップから右上のログインボタンを押してログイン画面に遷移します。\n\n![ログイン画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreifzdpecy3vxnuhe3yrg33wywo2u7u7knhciio5t75ymgmetrl7bxy)\n\nBlueskyのアカウントを使用するのでユーザー登録はありません。\n\n\n*(2025年12月24日変更)* \n**合言葉は不要としました。**\n\n~~当面の間、**初回ログイン時にアクセスキーワード(合言葉)が必要**になっています。~~\n\n~~アクセスキーワードは **`return to zero`** です。~~\n\n~~このアクセスキーワードは初回ログイン成功時のみ必要で、2回目以降は不要です。~~\n\n\n合言葉に意味はなく、個人的に好きなアーティストの [Fear, and Loathing in Las Vegas](https://lasvegas-jp.com) の曲名です。\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/o3nbOl2-g-s\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\nせっかくなのでよければBGMにしながら読んでいってください。\n気に入ったら間奏部分で一緒に踊りましょう。\n```\n 🪩  🪩\n✨🕺✨✨🕺✨\n```\n\n---\n\nするとBlueskyのOAuth認証画面が表示されます。\n\nこのとき、アドレスバーのドメインが `bsky.social` になっていることを確認してください。\n\n![Blueskyサインイン](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreich7zkp2prlwd7jt2g6zopr5nqcig5lecu6bfx6i3yjemxpat27le)\n\nここでログインを求められた場合は、**Blueskyのアカウントのハンドルと通常のパスワード**で入力してください。アプリパスワード(App Password)は使用しません。また、ここで入力されたIDとパスワードはアプリ(Chronoskyなど)側は知ることはありません。Bluesky側での認証にのみ使用されます。\n既にログイン済みの人はこの画面は表示されません。\n\n![ログイン認証画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreigukifggy77npbukqrc5s4mmnlhzpiqvg44gajwoqnzvakaf44th4)\n\nアカウントの認可を求められたら画面内の内容を確認し、問題なければ「承認する」をクリックして承認します。拒否した場合、ログインできず、アプリを利用することはできません。\n認可先のURLは `https://api.chronosky.app` で始まっているのが正しいです。\n\n---\n\nログインするとダッシュボードが出てきますが、初回はスケジューラの認可が必要になります。\n\n![ダッシュボード初回表示](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreia3xwj4r476nrtvprvujtcmvca7nuj2kwbla4nso74sz2iffwh2za)\n\n右上のボタンを押してスケジューラを使用できるようにします。\n\n---\n\nするともう一度Blueskyの承認画面が出てきます。面倒ですがもう一度承認してください。\nここで承認することで、予約されたポストをアプリが代理で投稿することができます。これをしないと残念ながら予約したポストを自動投稿できません。\n\n![スケジューラ認可](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreif6vqak366hgv7k52eshjv43d7zudu5ke2ohhujdyq7rxc2v7rfwq)\n\n\n承認が完了したら、投稿を作成ボタンを押して投稿を作成してください。\n\n![投稿画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreidmk5vkkyk22x34whmsvb2bgt6zdslomyzmpl7u4ubrjruup65ww4)\n\n予約可能な期間や予約時間の間隔、予約可能上限などの制限はありますが、これで任意のタイミングに投稿することができます。\n\nなお指定できる時間は利用している環境のタイムゾーン(OS、ブラウザの設定)に依存します。\n\n\n## サービス名について\n\n本質情報ではないですがサービス名について。\n\n元々は **Chronopost** という名前でサービスしようと開発していました。\n由来は、予約投稿ということで、時を表すギリシャ語の \"*Chronos*\" と投稿の \"*Post*\" からでした。\nあとは私がSFCの名作ゲーム [クロノ・トリガー](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%8E%E3%83%BB%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC) が好きだから。という理由もあります。\n\nしかし、*Chronopost* という名前はフランス郵政公社 [La poste](https://www.laposte.fr) のグループ企業内の宅配事業会社に同じ [chronopost](https://www.chronopost.fr) がありました。\n![chronopost](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreichuezm5ijmybppiwvzmul2pdkz3wyby7vckizitdbl7lptcmktly)\n\n個人のウェブサービスと物流サービスでは分野は全く異なるのですが、名前被りは避けておこう~~ぶっちゃけドメインが取れなかったんです~~\n\nということで、*Bluesky* にあやかり、 **Chronosky** としました。\n\n\n## 最後に\n\n正直、まだ色々足りてないです。\n\n不具合が見つかった場合は [@anon5r.com](https://bsky.app/profile/anon5r.com) または [@chronosky.app](https://bsky.app/profile/chronosky.app) にコッソリ教えてください。\n\n\n今後は追加機能や変更としては\n\n- [x] ~~投稿時のNSFWラベル設定~~\n- [x] ~~引用ポストの埋め込み~~\n- [x] タイムゾーンを指定した時間指定\n- [ ] 予約RP\n- [x] ~~予約一覧のカレンダーUI~~\n\nなんかを実装したいなと思ってます。\n\n\n\n技術的なところは後日余裕があれば、Zennあたりで別記事にしたいと思っています。\n\n\n\n明日は Yamatsu さんによる 「[Blueskyのポスト埋め込みコードをPHPで書く](https://srkkr.com/article/2025-bluesky-post-embed/)」です。\n",
  "createdAt": "2026-05-26T17:14:50.166Z",
  "theme": "github-light",
  "title": "Blueskyで予約投稿",
  "visibility": "public"
}