Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BotKit by Fedify:誰でも簡単に作れるActivityPubボット

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

BotKit by Fedify:誰でも簡単に作れるActivityPubボット

BotKit by Fedifyの紹介資料です。

BotKitは、ActivityPubボットを簡単に作ることができるTypeScriptフレームワークです。従来のMastodon・Misskey APIを使ったボットとは異なり、ActivityPubを直接実装する独立型ボットを数行のコードで作成できます。

OSC 2025 京都での発表資料として作成しました。

🔗 ドキュメント:https://botkit.fedify.dev/
🔗 ソースコード:https://github.com/fedify-dev/botkit

Avatar for Hong Minhee (洪 民憙)

Hong Minhee (洪 民憙)

August 03, 2025

More Decks by Hong Minhee (洪 民憙)

Other Decks in Technology

Transcript

  1. ߑຽጣ ϗϯ ϛϯ ώ w ؖࠃι΢ϧग़਎ w ϑΣσΟόʔεؔ࿈ͷιϑτ΢ΣΞΛ੍࡞ w 'FEJGZ)PMMP#PU,JU)BDLFST1VC

    w ೔ຊޠ͸·ͩษڧதͳͷͰɺΑΖ͓͘͠ئ͍͠·͢ w (JU)VCɿ!EBIMJB w ϑΣσΟόʔεɿ!IPOHNJOIFF!IPMMPTPDJBM!IPOHNJOIFF!IBDLFSTQVC
  2. جຊϘοτ࡞੒ ʢ෼Ͱʂʣ import { createBot, text } from "@fedify/botkit"; const

    bot = createBot<void>({ username: "greetbot", name: "ѫࡰϘοτ", summary: text`ͥΥͽͳ΁ĈBotKit͹ᥭ͵ͱϡψύ͹ͫg`, kv: new MemoryKvStore(), }); export default bot; / / deno serve͹࣮ͫ͢ḝĈ
  3. Πϕϯτॲཧ / / Ϛήϲ ー ͧΞͱᙉ΀ରԠ bot.onFollow = async (session,

    followRequest) = > { await followRequest.accept(); await session.publish( text`Ϛήϲ ー ͔Μ͞ͺ͖ͦͨ͘ΐͫf${followRequest.follower}ͧΥĈ`, { visibility: "direct" } ); }; / / ϦϸμϬϸͧΞͱᙉ΀ରԠ bot.onMention = async (session, message) = > { await message.like(); await message.reply(text`ͥΥͽͳ΁f${message.actor}ͧΥĈ`); };
  4. #PU,JUͰૹड৴Ͱ͖ΔΠϯλϥΫγϣϯҰཡ #PU,JUͰ΍ΓऔΓͰ͖ΔΠϯλϥΫγϣϯ͸ɺ࣍ͷͱ͓ΓͰ͢ Πϕϯτϋϯυϥʔ ϝιου Bot.onFollow Session.follow() Bot.onUnfollow Session.unfollow() Bot.onAcceptFollow FollowRequest.accept()

    Bot.onRejectFollow FollowRequest.reject() Bot.onReply Message.reply() Bot.onQuote Session.publish( . . . , { quoteTarget }) Bot.onMention Session.publish(text`${actor} . . . `)
  5. #PU,JUͰૹड৴Ͱ͖ΔΠϯλϥΫγϣϯҰཡ #PU,JUͰ΍ΓऔΓͰ͖ΔΠϯλϥΫγϣϯ͸ɺ࣍ͷͱ͓ΓͰ͢ Πϕϯτϋϯυϥʔ ϝιου Bot.onMessage Session.publish() Bot.onSharedMessage Message.share() Bot.onLike Message.like()

    Bot.onUnlike AuthorizedLike.unlike() Bot.onReact Message.react() Bot.onUnreact AuthorizedReaction.unreact() Bot.onVote Session.publish( . . . , { poll })
  6. ߴ౓ͳػೳ / / ΰξτϥֆየᥙΤᄐ࿥ const emojis = bot.addCustomEmojis({ botkit: {

    f i le: "./botkit.png", type: "image/png" } }); / / ᨷ࿴ᴬລ + ᥦხᒵ᩹ setInterval(async () = > { const session = bot.getSession("https: / / mybot.com"); const message = await session.publish( text`ຖ࣌ؒ͝ѫࡰʂ ${customEmoji(emojis.botkit)}` ); / / 30᰽ἦͽᥦხᒵ᩹ setTimeout(() = > message.delete(), 30000); }, 1000 * 60 * 60);