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
girigiribauer
June 20, 2025
Programming
0
40
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
タスクにもストック型・フロー型があるということに Todoist を使い始めて気づいた話 / 20250725-niigata-5min-tech
girigiribauer
0
43
『Bluesky 公式アカウント移行まとめ』のアップデートをした話 / 20241018-niigata-5min-tech
girigiribauer
0
100
コンテナクエリはコンテナ技術の話ではなく CSS の話です / 20240920-niigata-5min-tech
girigiribauer
1
84
公共交通のオープンデータ事始め / 20240823-niigata-5min-tech
girigiribauer
0
97
私と Vim / 20240426-niigata-5min-tech
girigiribauer
2
180
がんばらない勉強会の続け方 / 20240426-niigata-5min-tech-omake
girigiribauer
1
560
初めての chrome extension で Plasmo 使ってみた / 20240329-niigata-5min-tech
girigiribauer
0
120
時間配分を常に意識するために、通知する仕組みを作った話 / 20220527-peacock-meets-up-01
girigiribauer
0
240
モーダルウィンドウを作るときは createPortal を選択肢に加えよう、という話 / 20200201-react-nagoya-learning
girigiribauer
0
110
Other Decks in Programming
See All in Programming
あのころの iPod を どうにか再生させたい
orumin
2
2.4k
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2.1k
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.8k
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
460
kiroでゲームを作ってみた
iriikeita
0
150
Portapad紹介プレゼンテーション
gotoumakakeru
1
120
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.5k
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
190
WebAssemblyインタプリタを書く ~Component Modelを添えて~
ruccho
1
750
物語を動かす行動"量" #エンジニアニメ
konifar
14
4.4k
Understanding Kotlin Multiplatform
l2hyunwoo
0
250
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
480
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Typedesign – Prime Four
hannesfritz
42
2.7k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Thoughts on Productivity
jonyablonski
69
4.8k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
47
9.6k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
8
550
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
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