Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Bluesky のフィードを作ろう / 20250620-niigata-5min-tech
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
girigiribauer
June 20, 2025
Programming
0
51
Bluesky のフィードを作ろう / 20250620-niigata-5min-tech
2025/06/20 Niigata5分Tech #20 で話した資料です
girigiribauer
June 20, 2025
Tweet
Share
More Decks by girigiribauer
See All by girigiribauer
移動は善 / 20260124-NGK2026S
girigiribauer
0
51
Google Antigravity を使ってみた肌感 / 20251130-ai-craft-hacks-niigata
girigiribauer
0
54
なんとなく使っていたクリップボードの不思議 / 20250926-niigata-5min-tech
girigiribauer
0
45
タスクにもストック型・フロー型があるということに Todoist を使い始めて気づいた話 / 20250725-niigata-5min-tech
girigiribauer
0
74
『Bluesky 公式アカウント移行まとめ』のアップデートをした話 / 20241018-niigata-5min-tech
girigiribauer
0
110
コンテナクエリはコンテナ技術の話ではなく CSS の話です / 20240920-niigata-5min-tech
girigiribauer
1
92
公共交通のオープンデータ事始め / 20240823-niigata-5min-tech
girigiribauer
0
110
私と Vim / 20240426-niigata-5min-tech
girigiribauer
2
200
がんばらない勉強会の続け方 / 20240426-niigata-5min-tech-omake
girigiribauer
1
580
Other Decks in Programming
See All in Programming
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
5.8k
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
1.4k
Apache Iceberg V3 and migration to V3
tomtanaka
0
120
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
430
Patterns of Patterns
denyspoltorak
0
1.3k
AtCoder Conference 2025
shindannin
0
1k
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
280
2026年 エンジニアリング自己学習法
yumechi
0
120
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
180
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
180
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
180
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.5k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
400
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
ラッコキーワード サービス紹介資料
rakko
1
2.2M
Git: the NoSQL Database
bkeepers
PRO
432
66k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
88
Optimizing for Happiness
mojombo
379
71k
Everyday Curiosity
cassininazir
0
120
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
150
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Transcript
/JJHBUB5FDI #MVFTLZͷϑΟʔυΛ࡞Ζ͏ HJSJHJSJCBVFS
ࣗݾհ w ωοτ্ͰHJSJHJSJCBVFSͱ͍͏ϋϯυϧωʔϜͰͬͯ·͢ w چ໊ݹຽͰ͢ 2
#MVFTLZ͍͍ͧ w ϒϧʔεΧΠ͍͍͓ͧ͡͞ΜʮϒϧʔεΧΠ͍͍ͧʯ 3
#MVFTLZͷϑΟʔυͱ w ཁ͢ΔʹࣗͳΓͷϩδοΫͰฒͨɺߘͷλΠϜϥΠϯΛ࡞ΕΔ w ΧελϜϑΟʔυΛੜ͢ΔαʔόʔαʔϏεͷ͜ͱΛ ϑΟʔυδΣωϨʔλʔͱݺͿ w ࠷খݶͷϑΟʔυΛ࡞ͬͯɺϑΟʔυΛཧղ͠Α͏ʂ 4
ϑΟʔυʹؔ͢Δոใ w ոใͱ͍͏ͷɺܾͯ͠σΟεΔҙਤͰ͋Γ·ͤΜ w ༗ࢤͷํʑ͕։ൃͨ͠ɺ(6*Ͱϙνϙν͢Δ͚ͩͰϑΟʔυ͕࡞ΕΔαʔϏ ε͕৭ʑ͋Δʢ͢Β͍͠ʣ w ྫಛఆΩʔϫʔυ܈Λઃఆͯ͠ɺͦΕΒΛؚΉϑΟʔυΛ࡞Δ w ཁ͢ΔʹϑΟʔυδΣωϨʔλʔͷδΣωϨʔλʔ
w άάΔͱ͜ͷลͷ(6*ͷૢ࡞ͷํΈ͍ͨͳͷ͕ͨ͘͞ΜҾ͔͔ͬͬͯ͘Δ w ͕ͩཉ͍͠ใͰͳ͍ɾɾɾ 5
ϑΟʔυʹؔ͢Δެࣜใ w ։ൃऀެࣜυΩϡϝϯτΛݟΑ͏ w IUUQTEPDTCTLZBQQEPDTTUBSUFSUFNQMBUFTDVTUPNGFFET w ελʔλʔΩοτ͕Ұ൪Θ͔Γ͍͢ w IUUQTHJUIVCDPNCMVFTLZTPDJBMGFFEHFOFSBUPS w
ͱ͍͑ͬͱ͗མͱͤΔͷͰɺࢀߟʹͭͭࣗ͠લͰ࡞Δ w ඞཁʹԠͯ͡"51SPUPDPMʢΞοτϓϩτίϧʣΛݟΔ w IUUQTHJUIVCDPNCMVFTLZTPDJBMBUQSPUP w ྫϨίʔυΛՃ͢Δ"1*ͰɺʮͲ͜ʹʯʮԿΛʯ͕ͬͪ͜ʹॻ͍ͯ ͋Δʢਖ਼ͪΐͬͱΘ͔ΓͮΒ͍ʣ 6
࠷খݶͷ#MVFTLZϑΟʔυ w αʔόʔΛ༻ҙ͢Δ w దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ 7 \؆୯ʂ/
αʔόʔΛ༻ҙ͢Δ w ݻఆϙετ͚ͩͰ͍͍ͳΒແྉͷTUBUJDTJUFͰେৎ w σʔλϕʔεඞਢͰͳ͍ɺϑΟʔυͷϩδοΫ࣍ୈ 8
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w XFMMLOPXOEJEKTPO w ࢄ*% %*% %FDFOUSBMJ[FE*EFOUJGJFS Λ׆༻ͯ͠ɺ8$͕ඪ४Խͯ͠ ͍Δ%*%%PDVNFOUΛฦ͢
w #MVFTLZଆ͔Β͍߹Θ͕ͤདྷΔ 9
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ 10 const app = new Hono(); app.get("/.well-known/did.json", (c)
=> { return c.json({ "@context": ["https://www.w3.org/ns/did/v1"], id: "did:web:feeds.bsky.girigiribauer.com", service: [ { id: "#bsky_fg", type: "BskyFeedGenerator", serviceEndpoint: "https://feeds.bsky.girigiribauer.com", }, ], }); });
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w YSQDBQQCTLZGFFEHFU'FFE4LFMFUPO w IUUQTEPDTCTLZBQQEPDTBQJBQQCTLZGFFEHFUGFFETLFMFUPO w ͜ͷϨεϙϯεʹԊͬͯฦͯ͋͛͠Δ͚ͩ w ϦΫΤετʹGFFEύϥϝʔλ͕͋ΓɺෳϑΟʔυͷͲΕ͔ΒͷΞΫηε
͔ผͰ͖Δ w ͜ͷ"1*#MVFTLZଆ͔Βୟ͔ΕΔͷ 11
12
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ 13 const app = new Hono(); app.get("/xrpc/app.bsky.feed.getFeedSkeleton", async
(c) => { return c.json({ feed: [ { post: "at://did:plc:tsvcmd72oxp47wtixs4qllyi/app.bsky.feed.post/ 3ldcooerekc2y", }, ], }) });
खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ w ࠓ#MVFTLZଆͷ"1*Λୟ͘ w ελʔλʔΩοτͷTDSJQUTQVCMJTI'FFE(FOUTࢀর w Ճ͢ΔํͷใQVU3FDPSE w IUUQTEPDTCTLZBQQEPDTBQJDPNBUQSPUPSFQPQVUSFDPSE
w Ճ͞ΕΔํͷใBQQCTLZGFFEHFOFSBUPS w IUUQTHJUIVCDPNCMVFTLZTPDJBMBUQSPUPCMPCNBJOMFYJDPOTBQQ CTLZGFFEHFOFSBUPSKTPO 14
खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ 15 const agent = new AtpAgent({ service: "https://bsky.social"
}); await agent.login({ identi fi er: handle, password }); // தུ const image = await fs.readFile(path); const blobResponse = await agent.com.atproto.repo.uploadBlob(image, { encoding: "image/png", }); // தུ const result = await agent.com.atproto.repo.putRecord({ repo: agent.session?.did ?? "", collection: "app.bsky.feed.generator", rkey: "helloworld", record: { did: "did:web:feeds.bsky.girigiribauer.com", displayName: "Helloworld feed", description: "Hello! Hello!", avatar, // BlobRef createdAt: new Date().toISOString(), }, });
/FYUTUFQ w ϑΟʔυʹΞΫηε͖ͯͨ͠ਓͷEJEΛΔʹ"VUIPSJ[BUJPOϔομʔ Λղੳͯ͠+85͔ΒऔΓग़͢ w IUUQTHJUIVCDPNCMVFTLZTPDJBMGFFEHFOFSBUPSCMPCNBJOTSD BVUIUT- w &YQSFTTKTґଘʹͳͬͯΔ෦͕͋ΔͷͰؾΛ͚ͭͯͶ w
໘നϑΟʔυΛ࡞ͬͯΈΔ w ϑΟʔυҎ֎ʹ৭ʑΤϯδχΞϦϯάͰ͖Δͧ 16
·ͱΊ w #MVFTLZͷϑΟʔυɺࣗͰΧελϚΠζͨ͠λΠϜϥΠϯΛఏڙͰ͖Δ Έ w #MVFTLZͷ"1*ɺ͔ͬͪ͜Βୟ͘ͷɺ͜͏͔Βୟ͔ΕΔͷͷ྆ํ ͕ࠞͬͯ͟ॻ͍ͯ͋Δ w Φʔϓϯͳϓϩτίϧͱ"1*ΛͬͯɺࣗͳΓͷใۭؒΛ࡞Ζ͏ 17
w ϒϧʔεΧΠ͍͍͓ͧ͡͞ΜʮϒϧʔεΧΠ͍͍ͧʯ 18 https://internet.watch.impress.co.jp/docs/yajiuma/2024244.html
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ 19