🤖

BotKitを使ってActivityPubボットを作ってみよう

2025/01/14に公開

はじめに

BotKitは、ActivityPubボットを作成するためのTypeScriptフレームワークです。このチュートリアルでは、BotKitを使用して最初のボットを作成する方法を学びます。

事前準備:Denoのインストール

BotKitはDenoで書かれたTypeScriptフレームワークです。使用するにはDeno 2.0以降がインストールされている必要があります。Denoのインストール方法は複数ありますが、最も簡単な方法は以下のコマンドを使用することです:

Linux/macOSの場合:

curl -fsSL https://deno.land/install.sh | sh

Windowsの場合:

irm https://deno.land/install.ps1 | iex

BotKitのインストール

Denoがインストールされたら、ボット用の新しいプロジェクトを作成し、BotKitを依存関係としてインストールします:

mkdir my-bot/
cd my-bot/
deno add jsr:@fedify/botkit@^0.1.0-dev

BotKitはDenoの実験的なTemporal APIを使用するため、deno.jsonの設定でこれを有効にする必要があります:

deno.json
{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.1.0-dev.34+3c01b9f1"
  },
  "unstable": ["temporal"]  // これを追加
}

ボットの作成

新しいTypeScriptファイルを作成し、createBot()関数を使用してボットインスタンスを定義します:

bot.ts
import {
  createBot,
  InProcessMessageQueue,
  MemoryKvStore,
  text,
} from "@fedify/botkit";

const bot = createBot<void>({
  username: "mybot",
  name: "My Bot",
  summary: text`A bot powered by BotKit.`,
  kv: new MemoryKvStore(),
  queue: new InProcessMessageQueue(),
});

このコードでは:

  • usernameはボットのフェディバースハンドル(例:@mybot@your-domain)の最初の部分となります
  • nameは表示名です
  • summaryはボットのプロフィールの説明文です(Textオブジェクトを使用)
  • kvはデータを保存するためのキーバリューストアです
  • queueはバックグラウンドタスクを処理するためのメッセージキューです

イベントの処理

BotKitはonFollowonMentionなどの様々なイベントをサポートしています。これらのイベントはBotインスタンスにイベントハンドラを設定することで処理できます。

例えば、誰かがボットをフォローした時にダイレクトメッセージを送信するには:

bot.ts
bot.onFollow = async (session, follower) => {
  await session.publish(text`Thanks for following me, ${follower}!`, {
    visibility: "direct",
  });
};

ボットの実行

ボットを実行するには、HTTPサーバーに接続する必要があります。deno serveコマンドを使用します。まず、bot.tsファイルでbotインスタンスをデフォルトエクスポートとして設定します:

bot.ts
export default bot;

そして、以下のコマンドでボットを実行します:

deno serve -A ./bot.ts

実行すると以下のメッセージが表示され:

deno serve: Listening on http://0.0.0.0:8000/

ボットはhttp://localhost:8000/で利用可能になります。

インターネットへの公開

ローカルマシンだけでは他のFediverseサーバーと通信できないため、インターネットに公開する必要があります。開発時はfedify tunnelngrokTailscale Funnelなどのトンネリングサービスを使用できます。

これらのサービスはL7リバースプロキシとして動作するため、behindProxyオプションを有効にする必要があります:

bot.ts
const bot = createBot<void>({
  username: "mybot",
  name: "My Bot",
  summary: text`A bot powered by BotKit.`,
  kv: new MemoryKvStore(),
  queue: new InProcessMessageQueue(),
  behindProxy: true,  // これを追加
});

fedify tunnelを使用してボットを公開するには:[1]

fedify tunnel 8000

実行すると、一時的な公開ホスト名が表示されます:

✔ Your local server at 8000 is now publicly accessible:

https://c4d3933be87bc2.lhr.life/

Press ^C to close the tunnel.

ボットのテスト

ボットをテストするには、開発用のMastodonインスタンスであるActivityPub.Academyを使用できます。以下の手順でテストしてみましょう:

  1. ActivityPub.Academyの検索バーで@mybot@c4d3933be87bc2.lhr.lifeを検索します(ホスト名は自分の環境のものに置き換えてください):

    ActivityPub.Academyでのボットアカウントの検索結果

  2. ボットのプロフィールページで「フォロー」ボタンをクリックします:

    ActivityPub.Academyでのボットアカウントのプロフィール

  3. 数秒後、ボットからダイレクトメッセージが届きます:

    ActivityPub.Academyでのボットからのダイレクトメッセージ

これでボットの基本的な機能が正常に動作していることが確認できました!

次のステップ

基本的なボットの作成ができたら、以下のような機能を追加して、より高度なボットを作ってみましょう:

  • 自動返信の拡張:メンションされた時に、メッセージの内容に応じて異なる返答をする
  • 定期投稿setInterval()を使って、定期的に投稿を行う
  • メディア投稿:画像を添付した投稿を行う
  • インタラクティブな対話:会話の文脈を理解し、適切な返答を行う
  • 外部APIとの連携:天気予報やニュースなど、外部サービスと連携した情報を投稿する

BotKitの詳細な機能については公式ドキュメントを参照してください。ActivityPubプロトコルの特徴を活かした、ユニークなボットの開発を楽しんでください!

脚注
  1. まず、fedifyコマンドをインストールする必要があります。 ↩︎

Discussion