BotKit 시작하기

홍민희·6일 전
1

BotKit연합우주(fediverse)용 봇을 만들기 위한 TypeScript 프레임워크입니다. BotKit을 사용하면 Mastodon, Misskey 등 다양한 연합우주 플랫폼과 상호작용할 수 있는 독립형 ActivityPub 봇을 만들 수 있습니다.

Deno 설치하기

참고
BotKit은 현재 Deno만 지원합니다. 안정화 작업이 완료되면 Node.js와 Bun도 지원할 예정입니다.

BotKit은 Deno로 작성된 TypeScript 프레임워크입니다. BotKit을 설치하려면 먼저 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 설정에서 이를 활성화해야 합니다:

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.1.0-dev.34+3c01b9f1"
  },
  "unstable": ["temporal"]  // 추가
}

봇 만들기

봇을 만들려면 새로운 TypeScript 파일을 만들고 (여기서는 bot.ts라고 하겠습니다) createBot() 함수를 사용하여 Bot 인스턴스를 정의해야 합니다:

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

const bot = createBot<void>({
  username: "mybot",
  name: "My Bot",
  summary: text`BotKit으로 만든 봇입니다.`,
  kv: new MemoryKvStore(),
  queue: new InProcessMessageQueue(),
});

위 코드에서는 username이 "mybot"인 새로운 봇 인스턴스를 생성했습니다. 이 봇은 연합우주에서 @mybot@your-domain이라는 핸들로 식별됩니다.

namesummary는 각각 봇의 표시 이름과 소개글입니다. 소개글은 일반 문자열이 아닌 서식을 지원하는 Text 객체라는 점에 유의하세요.

이벤트 처리하기

BotKit은 onFollowonMention 같은 다양한 이벤트를 지원합니다. 이러한 이벤트는 Bot 인스턴스의 이벤트 핸들러를 설정하여 처리할 수 있습니다.

다음은 누군가 봇을 팔로할 때 DM을 보내는 예시입니다:

bot.onFollow = async (session, follower) => {
  await session.publish(text`${follower}님, 팔로 해주셔서 감사합니다!`, {
    visibility: "direct",
  });
};

봇 실행하기

봇을 실행하려면 먼저 HTTP 서버에 연결해야 합니다. deno serve 명령어를 사용하면 되는데, 이를 위해 bot.ts 파일에서 bot 인스턴스를 디폴트 익스포트로 설정해야 합니다:

export default bot;

그런 다음 다음 명령어로 봇을 실행할 수 있습니다:

deno serve -A ./bot.ts

이제 봇이 http://localhost:8000/에서 실행됩니다.

인터넷에 봇 공개하기

다른 연합우주 서버들이 봇과 상호작용하려면 봇이 공개 인터넷에 노출되어야 합니다. 개발 단계에서는 fedify tunnel, ngrok, Tailscale Funnel 등의 터널링 서비스를 사용할 수 있습니다.

이러한 터널링 서비스는 L7 리버스 프록시처럼 작동하므로, behindProxy 옵션을 활성화해야 합니다:

const bot = createBot<void>({
  username: "mybot",
  name: "My Bot",
  summary: text`BotKit으로 만든 봇입니다.`,
  kv: new MemoryKvStore(),
  queue: new InProcessMessageQueue(),
  behindProxy: true,  // 이 옵션을 추가합니다
});

예를 들어 fedify tunnel을 사용하려면 (fedify 커맨드를 설치한 뒤) 다음과 같이 하면 됩니다:

fedify tunnel 8000

이 명령어를 실행하면 연합우주에서 접근할 수 있는 임시 공개 호스트네임을 얻을 수 있습니다.

봇 테스트하기

봇을 테스트하려면 개발 목적의 Mastodon 인스턴스인 ActivityPub.Academy를 사용할 수 있습니다. ActivityPub.Academy에서는 임시 연합우주 계정을 즉시 만들고 ActivityPub 애플리케이션을 디버깅하기 위한 도구들을 제공합니다.

ActivityPub.Academy에서 봇 계정을 검색한 모습

ActivityPub.Academy에서 계정을 만든 후, 검색창에 봇의 계정(예: @mybot@c4d3933be87bc2.lhr.life)을 입력하고 팔로 버튼을 클릭하세요.

ActivityPub.Academy에서 본 봇 계정의 프로필 페이지

몇 초 후에 봇으로부터 DM을 받을 수 있을 것입니다.

봇 계정을 팔로한 뒤 몇 초 후 봇 계정으로부터 DM을 받은 모습

다음 단계로 나아가기

기본적인 봇을 만들어보았으니, 이제 더 흥미로운 기능들을 추가해볼 수 있습니다:

  1. 메시지 응답하기: onMention 이벤트 핸들러를 추가하여 다른 사용자가 봇을 멘션했을 때 응답하도록 만들어보세요.
  2. 정기적인 포스팅: setInterval() 함수를 사용해 매시간 또는 매일 자동으로 게시물을 올리도록 설정해보세요.
  3. 미디어 첨부: 이미지를 포함한 게시물을 올리도록 만들어보세요.
  4. 대화형 기능: 사용자의 입력에 따라 다르게 응답하는 대화형 기능을 구현해보세요.

더 자세한 내용은 BotKit 문서를 참고하세요. 또한 FediChatBot과 같은 실제 구현 사례를 살펴보면 도움이 될 것입니다.

봇 개발에 대한 질문이나 도움이 필요하다면 한국 연합우주 개발자 모임에서 다른 개발자들과 소통해보세요. 여러분의 창의적인 아이디어로 연합우주를 더욱 풍성하게 만들어주세요!

profile
서울에서 소프트웨어 프로그래머로 일하고 있습니다. 자유·오픈 소스 소프트웨어를 만들며, 주로 Haskell, Python, TypeScript 같은 언어로 코딩합니다.

0개의 댓글