{
"ogp": {
"url": "https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreic75ewmajgnmriddxj4len7qoxif5x4j3zy2v3r3jjemirn4ioe3a",
"width": null,
"height": null
},
"$type": "com.whtwnd.blog.entry",
"blobs": [
{
"name": "nc204407_終03.png",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreifyos5bxynt52y3scwnd33mo5pqoa56bxfxwoctoo4tagcxxtf7qa"
},
"mimeType": "image/png",
"size": 33755
},
"encoding": "image/png"
},
{
"name": "Chavatar - Bluesky ___________.jpeg",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreihtdwngvy4p44kwcxdinxj6xwlo34x2iqm4nlmaf34uycw2tytary"
},
"mimeType": "image/jpeg",
"size": 496526
},
"encoding": "image/jpeg"
},
{
"name": "ogp-image.png",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreic75ewmajgnmriddxj4len7qoxif5x4j3zy2v3r3jjemirn4ioe3a"
},
"mimeType": "image/png",
"size": 184211
},
"encoding": "image/png"
},
{
"name": "ScreenShot 2026-03-25 17.11.45.png",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreifirgw35p7x3wrl2srvu2bfsb74hw75yjbmbdiannayajyy2a47ru"
},
"mimeType": "image/png",
"size": 182973
},
"encoding": "image/png"
},
{
"name": "ScreenShot 2026-03-25 17.11.52.png",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreigs4n4usgtboxgd6adrlgfpk72lwscfahkxrbwmuvs43estemtkqe"
},
"mimeType": "image/png",
"size": 99399
},
"encoding": "image/png"
},
{
"name": "ScreenShot 2026-04-05 13.46.41.png",
"blobref": {
"$type": "blob",
"ref": {
"$link": "bafkreiargvstfa5htlaz73dvad3cexlo2xc2nlxlibhuojxr6cxfc7ucuq"
},
"mimeType": "image/png",
"size": 336769
},
"encoding": "image/png"
}
],
"theme": "github-light",
"title": "Blueskyで時限式にアイコン変更をする",
"content": "ブルスこんにちは〜👋\n\n自分のアカウントのアイコンを時限式に変更したいことってありますよね?\n\nえっ?ない?\n\n\n\n\n----\n\nそれじゃ寂しいじゃない。せっかく見にきてくれたし、ちょっと聞いていって下さい。\n\n\n## サービスとして作ってみたよ\n\n**[Chavatar](https://chavatar.app)** というサービスを作ってみました。\n\n\n\n*Ch*ange *Avatar*[^1] でChavatar[^2]、発音的に「茶畑」になるので茶葉っぽくしてます\n\n#### お詫び\n準備確認不足により記事公開からこの時点までアイコン画像のアップロードに失敗しておりました。現在復旧しています。\n(2026/4/5 15:30追記)\n\n\n\n## どんなサービス?\n\nアカウントのアイコンを定時で入れ替えます。画像も設定もあなたのPDSのアカウントのリポジトリ内(Blueskyの投稿データと同じ扱い)で管理されます。このサービスには保管されません。\n\n\n\n\n## 使い方\n\n1. 画面上部からアイコンに使用する画像をアップロードします。\n2. アイコンに使う範囲を選択して保存します。\n3. アップロードした画像は**アバター画像**に表示されます。\n4. 自動変更対象にするアイコンを**アバター画像**から選択し、**ローテーションリスト**に追加します。\n5. **ローテションリスト**に入っているアイコンが**変更間隔**の時間ごとに**モード**設定に従って自動で更新されます。\n\n\n## できること\n\n時限式で自動変更する候補のアイコン画像の管理と、並び順やローテーションの設定を管理できます。\n\n\n\n\n\n変更間隔は最短1時間から1週間単位まで設定できます。\n\n\n\nモード設定ではローテーションリストの順番通りか、リスト内からランダム選択を設定できます。\n\n\n\nそのほか、時間を待たずに即時実行(おためし実行)、リスト内のアイコンに強制適用するなどもあります。\n\n\n現在設定されているアイコン設定も分かるようになっていますし、自動更新されないように設定でオフにすることもできます。[^3]\n\n\n## 注意事項\n\n(2026/4/5 13:50追記)\n\nアイコンの変更は、Bluesky上では「**プロフィール項目の変更**」とみなされます。\n一部のラベラー([Account Activity Labeler\n](https://bsky.app/profile/stechlab-labels.bsky.social)など)では、プロフィールが短期間に頻繁に更新されているアカウントに対して、一定時間ラベルを貼る運用をしているものもあります。(スパムアカウントががプロフィールを頻繁に更新して人々を欺いている可能性があるため)\n\n※ラベラーの運用を否定するものではありません。\n\n\n\nラベラーのラベルの解釈は利用者ごとに異なりますが、**場合によってはアカウントや投稿が非表示になってしまう恐れがある**ことにご注意ください。\n\n\n\n---\n\n## 技術的な話\n\n### Lexicons\n\nこのサービスを作るにあたり、4つのLexiconコレクションを使用します。\n\n|Lexicon|概要説明|フィールド|\n|---------|-----------|------------|\n|`app.chavatar.avatar`|アップロードしたアバターを管理するレコード|`avatar` -- Blob参照<br>`createdAt` -- 登録日時|\n|`app.chavatar.settings`|自動更新するための設定や並び順を保持するレコード|`avatars` -- 入れ替え対象のアバターの配列<br>`enabled` -- 自動アバター入れ替えの有効可否設定<br>`interval` -- 自動入れ替えの間隔(1h,3h,6h,12h,1d,1w,1moなど)<br>`mode` -- ランダム(`random`)か並べた順序通り(`sequetial`)か<br>`executor` -- ローテーション実行プロバイダのURL。OAuthメタデータの`client_id`を指定。ユーザーが複数の実行プロバイダで指定してても重複実行しないようにするための値。|\n|`app.chavatar.settings.executor`|実行者レコード|`execClientId ` -- アバターローテーションを実行するプロバイダのOAuth Client ID。自分のClient ID(URI)と一致しなかったら実行しないように制御する予備的な情報|\n|`app.chavatar.state`|現在の状態を管理するレコード|`cursor` -- `app.chavatar.avatar#avatar`のTID<br>`lastUpdated` -- レコードの更新日時|\n\n\nアバターのみを管理する既存Lexiconを見つけられなかったため独自にしてしまっています。\n\n### OAuth Permission Sets\n\nOAuthでは用途によって3種類のPermission setを作成しています。\n\n| Permission set|用途|\n|-----|-----|\n|`app.chavatar.authManageAvatar`|上記Lexiconすべての読み書き|\n|`app.chavatar.authExecuteRotation`|アバターの定時ローテーションプロバイダ(実行環境)用。`settings`の読込と`state`の読み書き|\n|`app.chavatar.authViewAvatar`|`avatar`に登録されているアバターデータと一覧の読込のみ|\n\nそれぞれのPermissionによって他のクライアントからも制御できます。\n\n\n\n[^1]: Blueskyではアカウントアイコンのことをアバターと呼びます。\n[^2]: Linux系OSだと`cd` (C*hange* D*irectory*)、`chown` (CH*ange* OWN*er*)、 `chmod` (CH*ange* MOD*e*)、`chsh` (CH*ange* SH*ell*) などのコマンドもあるのでそれらにも由来。\n[^3]: 自動更新停止とは別で、Chavatarの利用を中止する(サービスの切断)こともできます。サービスの切断は、このサービスでの更新をやめて、同じ仕組み(Lexicon)を使って自前で作ることもできます。",
"createdAt": "2026-04-05T15:43:18.795Z",
"visibility": "public"
}