Skip to content
Published on

チャットボットフレームワーク 2026 — Slack Bolt / discord.js / Discord.py(復活)/ JDA / py-cord / Telegram / LINE / KakaoTalk 徹底ガイド

Authors

プロローグ — チャットボットは道具ではなくインフラになった

2018年頃のチャットボットは「楽しいサイドプロジェクト」だった。2026年は違う。会社の Slack には通知ボット・デプロイボット・インシデントボット・LLM アシスタントが並び、コミュニティの Discord にはモデレーションボット・ロールボット・チケットボット・ミュージックボットが並び、KakaoTalk ビジネスチャンネルにはサポートボット・予約ボット・決済ボットが並ぶ。チャットボットはもう道具ではなく、ユーザーが最初に出会うインターフェースになった。

ところが実際に作ろうとすると詰まる。Slack ボットは Bolt を使えばいい — Bolt Node、Bolt Python、Bolt Java のどれを使う?Discord ボットは discord.js を使えばいいけど、Python チームに Node を強制はできない — じゃあ Discord.py?ところで Discord.py は 2021年に deprecate されたんじゃなかった?なら py-cord?nextcord?韓国市場は?KakaoTalk Channel API はどんな形?日本は LINE Messaging API だけど、東京チームが KARTE Talk Bot を使いたいと言ったら?

この記事は 2026年現在のチャットボットフレームワーク地図を描く。どのプラットフォーム・言語・ライセンス・生存性を持っているか、そして会社の Slack・コミュニティ Discord・KakaoTalk ビジネスを作るとき、誰が何を選ぶべきか — そこまで踏み込む。


1. 2026年のチャットボットフレームワーク地図 — プラットフォーム / 言語別

まずは全体像。プラットフォーム(Slack・Discord・Telegram・…)と 言語(JS・Python・Java・Rust・…)の二軸で整理する。

プラットフォームNode.jsPythonJavaRust.NET
SlackBolt NodeBolt PythonBolt Java(なし)(なし)
Discorddiscord.js / erisdiscord.py / py-cord / nextcordJDA / Discord4JserenityDSharpPlus / Discord.Net
Matrixmatrix-bot-sdkmatrix-nio(サードパーティ)(サードパーティ)(サードパーティ)
Mattermostmattermost-clientmattermostdriver(サードパーティ)(サードパーティ)(サードパーティ)
Rocket.Chatrocket.chat.jsrocket-python(サードパーティ)(サードパーティ)(サードパーティ)
TelegramTelegraf / node-telegram-bot-apipython-telegram-bot / aiogramTelegramBotsteloxideTelegram.Bot
WhatsAppMeta Cloud API (HTTP)Meta Cloud API (HTTP)Meta Cloud API (HTTP)Meta Cloud API (HTTP)Meta Cloud API (HTTP)
LINEline-bot-sdk-nodejsline-bot-sdk-pythonline-bot-sdk-java(サードパーティ)line-bot-sdk-net
KakaoTalk Channel(HTTP)(HTTP)(HTTP)(HTTP)(HTTP)

見えてくるパターン:

  1. Slack は Bolt に統一された。 Node・Python・Java すべて公式 SDK があり、ほぼ同じ API を提供する。「Slack ボットは Bolt」の一行で終わる。
  2. Discord は言語陣営で分かれる。 JS は discord.js、Python は discord.py(復活)/ py-cord / nextcord、Java は JDA / Discord4J、Rust は serenity、.NET は DSharpPlus / Discord.Net。社内標準言語が先で、ライブラリは後
  3. Telegram にも分岐がある。 Python の同期系は python-telegram-bot、asyncio ネイティブは aiogram。Node は Telegraf が事実上の標準。
  4. WhatsApp・LINE・KakaoTalk は HTTP API。 公式 SDK は補助で、本質は webhook と HTTP リクエスト。言語依存は薄い。
  5. Matrix・Mattermost・Rocket.Chat はセルフホスティング陣営。 エンタープライズ・オープンソースの通信に使われる。

2. Slack Bolt — Node/Python/Java 公式、社内ボットの統一標準

Slack の公式ボットフレームワークは Bolt だ。2019年に Node 版が登場し、その後 Python・Java 版が加わり、いまや三つとも公式。Slack はわざと三つの SDK の API を揃えているので、言語間の移行コストが小さい。

Bolt Node の最小骨格

import { App } from '@slack/bolt';

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  socketMode: true,
  appToken: process.env.SLACK_APP_TOKEN,
});

// スラッシュコマンド
app.command('/hello', async ({ command, ack, respond }) => {
  await ack();
  await respond(`こんにちは、<@${command.user_id}>さん!`);
});

// メッセージイベント
app.message('ヘルプ', async ({ message, say }) => {
  await say('何かお手伝いできますか?');
});

// インタラクティブボタン
app.action('button_click', async ({ ack, body, respond }) => {
  await ack();
  await respond('ボタンが押されました');
});

(async () => {
  await app.start();
  console.log('Bolt アプリ起動中');
})();

Bolt Python — 同じ形

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os

app = App(token=os.environ["SLACK_BOT_TOKEN"])

@app.command("/hello")
def handle_hello(ack, respond, command):
    ack()
    respond(f"こんにちは、<@{command['user_id']}>さん!")

@app.message("ヘルプ")
def handle_help(message, say):
    say("何かお手伝いできますか?")

@app.action("button_click")
def handle_button(ack, respond):
    ack()
    respond("ボタンが押されました")

if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

API の形がほぼ同じ。デコレーター名もパラメータ名もほとんど揃っている。

Bolt Java — エンタープライズ向け

import com.slack.api.bolt.App;
import com.slack.api.bolt.AppConfig;

public class SlackBotApp {
  public static void main(String[] args) {
    var config = new AppConfig();
    config.setSigningSecret(System.getenv("SLACK_SIGNING_SECRET"));
    config.setSingleTeamBotToken(System.getenv("SLACK_BOT_TOKEN"));
    var app = new App(config);

    app.command("/hello", (req, ctx) -> {
      return ctx.ack("こんにちは、" + req.getPayload().getUserName() + "さん!");
    });

    var server = new com.slack.api.bolt.jetty.SlackAppServer(app);
    try { server.start(); } catch (Exception e) { e.printStackTrace(); }
  }
}

Socket Mode vs HTTP Mode

Bolt には二つの運用モードがある。

  • Socket Mode: ボットが Slack に WebSocket で outbound 接続する。社内ネットワークで inbound ポートを開けなくても運用できる。開発・小規模ボットに最適。
  • HTTP Mode: Slack が webhook をボットの URL に送ってくる。公開 HTTPS エンドポイントが必要。本番・大規模向け。

会社の Slack ボットを始めるなら Socket Mode が圧倒的に楽。トラフィックが増えたら HTTP Mode に移すのが定石。

誰がどの言語を選ぶか

  • 社内標準が Node: Bolt Node。Slack の新機能は通常ここに最初に来る。
  • 社内標準が Python(特にデータチーム): Bolt Python。社内のデータ・LLM コードと合わせやすい。
  • 社内標準が Java(大企業): Bolt Java。Spring 統合も無難。

三言語とも同じ会社が直接保守しており、新機能リリースの lag はほぼない。言語を選んだ時点で Bolt を選んだことになる。


3. discord.js — Node.js Discord の標準

Discord ボットの Node.js 陣営は discord.js が事実上独占している。2025年中盤に v14 が安定化し、2026年現在 v15 が活発に開発中。スラッシュコマンド・ボタン・セレクトメニュー・モーダル・スレッド・フォーラムチャンネル・自動モデレーションまで、Discord の新機能をほぼすべて素早く取り込む。

最小骨格

import { Client, GatewayIntentBits, SlashCommandBuilder } from 'discord.js';

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
});

client.once('ready', () => {
  console.log(`ログイン完了: ${client.user?.tag}`);
});

// スラッシュコマンドを登録
const ping = new SlashCommandBuilder()
  .setName('ping')
  .setDescription('レイテンシ測定');

client.on('interactionCreate', async (interaction) => {
  if (!interaction.isChatInputCommand()) return;
  if (interaction.commandName === 'ping') {
    const ms = Date.now() - interaction.createdTimestamp;
    await interaction.reply(`Pong (${ms}ms)`);
  }
});

client.login(process.env.DISCORD_TOKEN);

Intents — 権限モデル

Discord は、ボットが受け取りたいイベントを明示する必要がある。MessageContent intent は 2022年に privileged intent になり、100 サーバーを超えるボットは Discord の承認が必要。小規模ボットは自動承認。

Sharding — 大規模ボットの運用

ボットが 2500 サーバーを超えると Discord は sharding を要求する。discord.js は ShardingManager を組み込みで提供しており、シャードをプロセス単位で起動できる。

import { ShardingManager } from 'discord.js';

const manager = new ShardingManager('./bot.js', {
  totalShards: 'auto',
  token: process.env.DISCORD_TOKEN,
});

manager.on('shardCreate', (shard) => console.log(`シャード ${shard.id} 起動`));
manager.spawn();

なぜ discord.js が勝ったか

  • TypeScript ファーストクラス: v14 以降、型が非常に正確。
  • Discord の新機能を first-class でサポート: API 変更後、数日以内に反映されることが多い。
  • 巨大なエコシステム: ボイラープレート・CLI ジェネレーター・コグ風フレームワーク・DB アダプター。
  • eris より一段抽象度が高い: メッセージコンポーネント・インタラクションが扱いやすい。

discord.js が合わない場面: メモリフットプリントを極小にしたい(共有ホスティング)、または raw gateway に近く触りたいとき。そのときは eris を見る。


4. Discord.py 復活(2024年4月、Rapptz)— deprecate からの帰還

Discord.py は Python Discord ボットのゴールドスタンダードだった。ところが 2021年8月、メンテナーの Rapptz(Danny Garcia)が「これ以上維持しない」と宣言し、GitHub リポジトリを archive にした。理由は Discord がメッセージコンテンツを privileged intent に変更し、100 サーバー超のボットは Discord 承認が必要になったこと — Rapptz はこの変更が音楽ボットなどのカテゴリを殺すと公に反対し、ライブラリ維持の道徳的負担を理由に去った。

Python Discord エコシステムはパニックになった。何万ものボットが discord.py に依存しており、スラッシュコマンド・インタラクション・スレッドといった新機能はライブラリの更新なしには使えない。

2年半の空白

2021年8月から 2024年4月までの約2年半、discord.py は事実上停止していた。その間にコミュニティは fork を複数生み出した(次章)。発展したものもあれば、消えたものもある。

2024年4月 — 復活

2024年4月、Rapptz は discord.py を再開すると発表。Discord が音楽ボット周りのポリシーを一部緩和し、本人の心の整理もついた、というのが理由だった。発表当日、Twitter・Reddit・Discord 開発者サーバーは沸き返った。

復活後、discord.py は急速に追いついた。

  • スラッシュコマンド(app_commands)
  • モーダル・セレクトメニュー
  • スレッド・フォーラムチャンネル
  • ボイス v3 API
  • ボイス受信(ライブラリで対応)

2026年現在、discord.py 2.x は再び Python Discord ボットの事実上の標準だ。

最小骨格

import discord
from discord import app_commands
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print(f'ログイン完了: {bot.user}')
    await bot.tree.sync()

@bot.tree.command(name='ping', description='レイテンシ測定')
async def ping(interaction: discord.Interaction):
    latency = round(bot.latency * 1000)
    await interaction.response.send_message(f'Pong ({latency}ms)')

bot.run('YOUR_TOKEN')

Cogs — モジュールシステム

commands.Cog はコマンド・イベント・リスナーをクラスにまとめるモジュールシステム。大きなボットを作るならほぼ必須。

from discord.ext import commands
from discord import app_commands
import discord

class Moderation(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @app_commands.command(name='kick', description='ユーザーを追放')
    async def kick(self, interaction: discord.Interaction, member: discord.Member):
        await member.kick()
        await interaction.response.send_message(f'{member} を追放しました')

async def setup(bot):
    await bot.add_cog(Moderation(bot))

誰が discord.py を選ぶか

  • 既存の Python 資産が大きいチーム
  • LLM・データパイプラインとボットを同じコードベースで運用
  • Rapptz の設計思想と合うとき(明示的・型安全・「マジック少なめ」)

5. py-cord / nextcord — 不在期に生まれた fork

discord.py が止まっていた2年半の間に、fork がいくつか生まれた。生き残ったのは二つ。

py-cord — 最大の fork

py-cord は fork のうち最も大きなコミュニティを集めた。2021年末に始まり、スラッシュコマンド・インタラクションを積極的に取り込んだ。API は discord.py に近いが、一部の判断(ボイス処理・名前衝突の解決)で分岐した。

import discord
from discord.ext import commands

bot = commands.Bot()

@bot.slash_command(name='ping', description='レイテンシ')
async def ping(ctx: discord.ApplicationContext):
    await ctx.respond(f'Pong ({round(bot.latency * 1000)}ms)')

bot.run('TOKEN')

py-cord はスラッシュコマンド対応が早く深く、不在期に多くのボットが移ってきた。

nextcord — もうひとつの fork

nextcord は py-cord より少しだけ discord.py に近い形で留まった fork。保守的・段階的な変更を好む。

import nextcord
from nextcord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.slash_command(description='レイテンシ')
async def ping(interaction: nextcord.Interaction):
    await interaction.send(f'Pong')

bot.run('TOKEN')

本家復活後 — fork の運命

2024年4月に本家が戻ると、fork の価値提案は弱まった。py-cord はいまも活発だが、新規プロジェクトは再び discord.py に向かうのが一般的だ。nextcord は開発が鈍化している。

ただし、既存の py-cord / nextcord ボットは移行コストのためにその場に残る。2026年の判断:

状況推奨
新規 Python Discord ボットdiscord.py
既存の py-cord ボット維持(現在も活発)
既存の nextcord ボット移行を検討(開発が鈍化)

6. JDA / Discord4J — Java 陣営

Java で Discord ボットを作る人は、二つのライブラリのどちらかを選ぶ。

JDA — 命令型の標準

JDA(Java Discord API)は Java Discord ボットの事実上の標準。命令型 API、強い型、豊富なドキュメント。

import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.events.session.ReadyEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;

public class Bot extends ListenerAdapter {
  public static void main(String[] args) throws Exception {
    JDABuilder.createDefault(System.getenv("DISCORD_TOKEN"))
        .enableIntents(GatewayIntent.MESSAGE_CONTENT)
        .addEventListeners(new Bot())
        .build();
  }

  @Override
  public void onReady(ReadyEvent event) {
    System.out.println("ログイン: " + event.getJDA().getSelfUser().getAsTag());
  }
}

JDA には Spring・Quarkus 統合ライブラリが別途あり、エンタープライズで慣れたパターンが使える。

Discord4J — リアクティブ

Discord4J は Project Reactor ベースで、すべてをリアクティブストリームとして表現する。Reactor / WebFlux に慣れたチームには非常に自然。

import discord4j.core.DiscordClient;
import discord4j.core.event.domain.message.MessageCreateEvent;

public class Bot {
  public static void main(String[] args) {
    var client = DiscordClient.create(System.getenv("DISCORD_TOKEN"))
        .login()
        .block();

    client.on(MessageCreateEvent.class, event -> {
      var message = event.getMessage();
      if (message.getContent().equals("!ping")) {
        return message.getChannel()
            .flatMap(channel -> channel.createMessage("Pong"));
      }
      return reactor.core.publisher.Mono.empty();
    }).blockLast();
  }
}

誰がどちらを選ぶか

チームの傾向推奨
Spring Boot 正統、命令型JDA
Reactor / WebFlux 使用中Discord4J
とにかく Java で早く作りたいJDA(学習曲線が緩い)
大量同時イベント処理Discord4J(バックプレッシャー)

7. serenity(Rust)/ DSharpPlus + discord.net(.NET)/ eris

serenity — Rust Discord 標準

serenity は Rust Discord ボットの標準。async/await ベース、強い型、メモリ安全。大規模ボット・リソース制約環境で人気。

use serenity::async_trait;
use serenity::model::channel::Message;
use serenity::prelude::*;

struct Handler;

#[async_trait]
impl EventHandler for Handler {
    async fn message(&self, ctx: Context, msg: Message) {
        if msg.content == "!ping" {
            if let Err(why) = msg.channel_id.say(&ctx.http, "Pong").await {
                println!("送信失敗: {:?}", why);
            }
        }
    }
}

#[tokio::main]
async fn main() {
    let token = std::env::var("DISCORD_TOKEN").expect("トークンなし");
    let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT;
    let mut client = Client::builder(&token, intents)
        .event_handler(Handler)
        .await
        .expect("クライアント生成失敗");

    if let Err(why) = client.start().await {
        println!("実行エラー: {:?}", why);
    }
}

DSharpPlus / Discord.Net — .NET の二大ライブラリ

.NET 陣営には二つのライブラリが共存する。

  • DSharpPlus: 新機能を早く取り込む傾向。
  • Discord.Net: より古く、大型ボットで使われる。スラッシュコマンド対応も安定。
using Discord;
using Discord.WebSocket;

var client = new DiscordSocketClient(new DiscordSocketConfig {
    GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.MessageContent
});

client.Log += msg => { Console.WriteLine(msg.ToString()); return Task.CompletedTask; };

client.MessageReceived += async msg => {
    if (msg.Content == "!ping") await msg.Channel.SendMessageAsync("Pong");
};

await client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("DISCORD_TOKEN"));
await client.StartAsync();
await Task.Delay(-1);

eris — 旧 Node、それでも一部に残る

eris は discord.js より前世代の Node Discord ライブラリ。より低レベルに近く、メモリ効率が良いため、一部の大規模ボットはいまも使う。新規ならまず discord.js を勧める。

const Eris = require('eris');
const bot = new Eris(process.env.DISCORD_TOKEN, {
  intents: ['guilds', 'guildMessages', 'messageContent'],
});

bot.on('ready', () => console.log('準備完了'));
bot.on('messageCreate', (msg) => {
  if (msg.content === '!ping') bot.createMessage(msg.channel.id, 'Pong');
});
bot.connect();

8. Matrix bots — matrix-nio(Python)/ matrix-bot-sdk(Node)

Matrix はオープンプロトコルなので、SDK が複数の言語に分散している。ボット作りに最もよく使われるのは二つ。

matrix-nio — Python 非同期

from nio import AsyncClient, MatrixRoom, RoomMessageText

async def message_callback(room: MatrixRoom, event: RoomMessageText):
    if event.body == "!ping":
        await client.room_send(
            room_id=room.room_id,
            message_type="m.room.message",
            content={"msgtype": "m.text", "body": "Pong"},
        )

client = AsyncClient("https://matrix.example.org", "@bot:example.org")
client.add_event_callback(message_callback, RoomMessageText)

matrix-bot-sdk — Node

import { MatrixClient, SimpleFsStorageProvider } from 'matrix-bot-sdk';

const client = new MatrixClient(
  'https://matrix.example.org',
  process.env.MATRIX_TOKEN!,
  new SimpleFsStorageProvider('bot.json'),
);

client.on('room.message', async (roomId, event) => {
  if (!event.content || event.sender === (await client.getUserId())) return;
  if (event.content.body === '!ping') {
    await client.sendMessage(roomId, { msgtype: 'm.text', body: 'Pong' });
  }
});

client.start();

Matrix を使うのは誰か

  • オープンソースコミュニティ(Mozilla・KDE・GNOME など)
  • 政府・公共(フランスの Tchap、ドイツの BWMessenger)
  • フェデレーションが重要な組織

エンタープライズ Slack 代替として Matrix(+ Element クライアント)を選ぶところも増えた。ボット作成の難易度は Slack・Discord より少し高いが、自前ホスティング・フェデレーション・E2EE が大きな利点。


9. Mattermost / Rocket.Chat — エンタープライズチャット

Mattermost — Slack 代替の代表

Mattermost はセルフホスティング Slack 代替として最もよく使われる。ボット API は Slack に非常に近い。

from mattermostdriver import Driver

driver = Driver({
    'url': 'mattermost.example.com',
    'token': 'BOT_TOKEN',
    'scheme': 'https',
    'port': 443,
})
driver.login()

# メッセージ送信
driver.posts.create_post({
    'channel_id': 'CHANNEL_ID',
    'message': 'こんにちは',
})

Mattermost はスラッシュコマンド・インタラクティブメッセージ・webhook をすべてサポート。Slack ボットコードを移植しやすい。

Rocket.Chat — もうひとつの陣営

Rocket.Chat も別のオープンソース・セルフホスティングメッセンジャー。Rocket.Chat Apps Engine でボットを作るか、REST API + webhook で作る。

const { RocketChatApp } = require('@rocket.chat/apps-engine/definition/RocketChatApp');

class HelloApp extends RocketChatApp {
  async executeSlashCommand(context, read, modify) {
    const sender = context.getSender();
    const room = context.getRoom();
    const builder = modify.getCreator().startMessage()
      .setSender(sender)
      .setRoom(room)
      .setText('こんにちは!');
    await modify.getCreator().finish(builder);
  }
}

Mattermost / Rocket.Chat を使うのは誰か

  • データ主権が必要な政府・公共
  • Slack のライセンスコストを避けたい大規模組織
  • 軍・金融など規制環境

10. Telegram — python-telegram-bot / Telegraf(Node)/ aiogram

Telegram Bot API は HTTP ベースで、どの言語からでも使えるが、言語ごとに標準ライブラリがある。

python-telegram-bot — Python の同期/非同期

最も古く、最大の Python Telegram ライブラリ。2022年の v20 から本格的に非同期化。

from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text('こんにちは!')

app = Application.builder().token('YOUR_TOKEN').build()
app.add_handler(CommandHandler('start', start))
app.run_polling()

Telegraf — Node の標準

import { Telegraf } from 'telegraf';

const bot = new Telegraf(process.env.TELEGRAM_TOKEN!);
bot.start((ctx) => ctx.reply('こんにちは!'));
bot.command('ping', (ctx) => ctx.reply('Pong'));
bot.launch();

aiogram — asyncio ネイティブ Python

asyncio 優先設計。大規模・同時実行の多いボットに向く。

from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
import asyncio

bot = Bot(token='YOUR_TOKEN')
dp = Dispatcher()

@dp.message(Command('start'))
async def handle_start(message: types.Message):
    await message.answer('こんにちは!')

async def main():
    await dp.start_polling(bot)

asyncio.run(main())

誰が何を選ぶか

状況推奨
新規 Python Telegram ボットpython-telegram-bot(コミュニティ最大)
高同時実行・async-firstaiogram
Node 環境Telegraf
豊富な TypeScript 型Telegraf(型定義が秀逸)

11. WhatsApp Cloud API(Meta)

WhatsApp ビジネスメッセージは 2022年以降、Meta が直接運営する Cloud API が標準になった。以前は BSP(Business Solution Provider)を経由する必要があったが、いまは Meta Cloud API に直接統合する。

基本フロー

  1. Meta for Developers でアプリを作成
  2. WhatsApp Business Account(WABA)を接続
  3. 電話番号を登録・認証
  4. webhook URL を登録(メッセージ受信)
  5. Graph API でメッセージ送信

メッセージ送信例(HTTP)

curl -X POST "https://graph.facebook.com/v18.0/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "to": "819012345678",
    "type": "text",
    "text": {"body": "こんにちは"}
  }'

テンプレートメッセージ — 24時間ウィンドウの外

WhatsApp には 24時間ウィンドウ ルールがある。ユーザーが最後にメッセージを送ってから24時間を超えると、自由形式のメッセージは送れず、事前承認されたテンプレートのみ送れる。

curl -X POST "https://graph.facebook.com/v18.0/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "to": "819012345678",
    "type": "template",
    "template": {
      "name": "order_confirmation",
      "language": {"code": "ja"}
    }
  }'

WhatsApp を使うのは誰か

  • 東南アジア・インド・南米・欧州市場のビジネス
  • グローバル SaaS の通知チャンネル
  • 日本市場では限定的(LINE が支配)

12. LINE Messaging API

LINE は日本・台湾・タイで支配的なメッセンジャーで、ビジネスボット・公式アカウントは LINE Messaging API で作る。

基本フロー

  1. LINE Developers で Provider とチャネルを作成
  2. Messaging API チャネルを有効化
  3. Channel Access Token を発行
  4. webhook URL を登録
  5. SDK または HTTP でメッセージ送信

Node SDK 例

import { Client, middleware } from '@line/bot-sdk';
import express from 'express';

const config = {
  channelAccessToken: process.env.LINE_ACCESS_TOKEN!,
  channelSecret: process.env.LINE_CHANNEL_SECRET!,
};

const client = new Client(config);
const app = express();

app.post('/webhook', middleware(config), async (req, res) => {
  const events = req.body.events;
  for (const event of events) {
    if (event.type === 'message' && event.message.type === 'text') {
      await client.replyMessage(event.replyToken, {
        type: 'text',
        text: `エコー: ${event.message.text}`,
      });
    }
  }
  res.sendStatus(200);
});

app.listen(3000);

Python SDK 例

from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from flask import Flask, request

app = Flask(__name__)
line_bot_api = LineBotApi('YOUR_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')

@app.route('/webhook', methods=['POST'])
def webhook():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    handler.handle(body, signature)
    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=f'エコー: {event.message.text}')
    )

LINE Rich Menu と Flex Message

LINE の特徴は Rich Menu(チャット下部の固定メニュー)と Flex Message(JSON DSL で作るカスタム UI)。EC・予約・カスタマーサポートでほぼ標準。

LINE Bot Designer(日本)

日本では LINE Bot Designer という GUI ツールで、非エンジニアが Flex Message・シナリオを作れる。マーケティングチームがコードを書かずにボットコンテンツを運営するのに使う。


13. KakaoTalk Channel API

KakaoTalk Channel(カカオトークチャンネル)は韓国のビジネスメッセージで圧倒的なシェアを持つ。ただし API モデルは Slack・Discord・LINE とかなり違う。

二種類のメッセージ

  1. KakaoTalk Channel メッセージ — チャンネルを追加したユーザー向けのマーケティング・お知らせ。ポリシー審査あり。
  2. アラームトーク / フレンドトーク — 決済・予約・配送などの情報通知。テンプレートの事前登録が必要。BSP(公式の SI / 代理店)を経由して送ることが多い。

Kakao i Open Builder — チャットボットビルダー

Kakao i Open Builder は KakaoTalk Channel チャットボットを作る公式ツール。GUI でシナリオ・発話・ブロックを設計し、外部サーバーに webhook で接続する。

ボット応答フロー:

  1. ユーザーがチャンネルにメッセージ送信
  2. Kakao i Open Builder が発話を解析し、適切なブロックをマッチ
  3. ブロックが外部サーバー(スキルサーバー)に webhook 送信
  4. スキルサーバーが応答 JSON を返す
  5. KakaoTalk にメッセージ送出

スキルサーバー例(Python Flask)

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/skill/order-status', methods=['POST'])
def order_status():
    data = request.json
    user_id = data['userRequest']['user']['id']
    utterance = data['userRequest']['utterance']

    # 実際には DB 参照
    status = '配送中'

    response = {
        'version': '2.0',
        'template': {
            'outputs': [{
                'simpleText': {
                    'text': f'注文状態: {status}'
                }
            }]
        }
    }
    return jsonify(response)

if __name__ == '__main__':
    app.run(port=5000)

アラームトーク送信フロー

アラームトークは韓国の情報通信網法の関係で、情報性/広告性の区別が厳格。送信フロー:

  1. 発信プロフィール登録(事業者登録証が必要)
  2. テンプレート登録・審査(Kakao 検収、数日)
  3. 承認テンプレートのみで送信可能
  4. 変数のみ置換して本文送信

韓国ビジネスが KakaoTalk を避けられない理由

  • 韓国メッセンジャー市場シェアが圧倒的
  • ユーザーが日常的に毎日使うメッセンジャー
  • 決済・認証・カスタマーサポートまで Kakao エコシステムで完結

代わりにポリシー審査・テンプレート承認など、Slack・Discord より運用コストが大きい。


14. 韓国 / 日本 — KakaoTalk Channel、LINE ボット、KARTE Talk Bot

韓国 — KakaoTalk + アラームトーク + チャットボットビルダー

韓国のビジネスボットスタックはほぼこのパターン。

  • マーケティング・お知らせ: KakaoTalk Channel メッセージ
  • 情報通知(決済・配送・予約): アラームトーク(BSP 経由)
  • チャットボット(サポート・FAQ): Kakao i Open Builder + スキルサーバー
  • 社内コラボレーション: Slack または JANDI

日本 — LINE 圧倒的

日本のビジネスボットスタック。

  • マーケティング・顧客対応: LINE 公式アカウント
  • チャットボット: LINE Messaging API + 自前サーバー、または LINE Bot Designer
  • マーケティングオートメーション: KARTE Talk Bot(KARTE のチャットボット機能)
  • 社内コラボレーション: Slack・Microsoft Teams・Chatwork

KARTE Talk Bot — 日本 SaaS の事例

KARTE は日本の大手 CX(カスタマーエクスペリエンス)プラットフォームで、その中に Talk Bot というチャットボット機能がある。マーケティングオートメーション・セグメンテーションとチャットボットを一体運用したいときに選ぶ。日本の EC・メディアサイトでよく見る。

多国籍ボットの現実

グローバルサービスを作ると、一つのボットが Slack・Discord・LINE・KakaoTalk・Telegram すべてを扱う必要が出る。だいたいこのパターン。

  1. 共通ボットコア: ビジネスロジック・状態管理・LLM 呼び出し — 自前サービス。
  2. プラットフォームアダプター: 各プラットフォーム個別の webhook・メッセージ変換 — 薄い層。
  3. メッセージ正規化: テキスト・画像・ボタン・カードを共通モデルに。

これを内製するチームもあれば、Sendbird・Customer.io・Twilio Conversations のようなマルチチャネル SaaS を使うチームもある。


15. 誰が何を選ぶべきか — 会社の Slack / コミュニティ Discord / KakaoTalk ビジネス

最後にシナリオ別の推奨構成。

会社の Slack ボット(社内ツール)

  • 社内標準 Node: Bolt Node + Socket Mode
  • 社内標準 Python: Bolt Python + Socket Mode
  • 社内標準 Java / Kotlin: Bolt Java
  • 開始コスト最小化: Socket Mode、単一ワークスペーストークン

社内コラボレーション自前ホスティング

  • Slack 代替セルフホスティング: Mattermost + Python / Node ボット
  • オープンソース・フェデレーション: Matrix + matrix-nio
  • 無料・軽量オプション: Rocket.Chat + Apps Engine

コミュニティ Discord ボット

  • Node チーム: discord.js
  • Python チーム: discord.py(復活後安定、新規推奨)、既存 py-cord ボットは維持
  • Java チーム: JDA(正統)、リアクティブ志向なら Discord4J
  • Rust チーム: serenity
  • .NET チーム: DSharpPlus(活発)または Discord.Net(安定)

グローバルメッセージ通知

  • 北米・欧州・一般消費者: WhatsApp Cloud API(ブラジル・インドで圧倒)
  • 日本・台湾・タイ: LINE Messaging API
  • 韓国: KakaoTalk Channel + アラームトーク(BSP 経由)
  • グローバル IT / 開発者: Telegram(python-telegram-bot / aiogram / Telegraf)

韓国・日本ビジネス統合

  • 韓国 B2C: Kakao i Open Builder + アラームトーク(BSP) + 社内 Slack
  • 日本 B2C: LINE Messaging API + KARTE Talk Bot + 社内 Slack / Teams
  • 両国運営: 共通ボットコア + プラットフォームアダプター(内製または SaaS)

マイグレーションガイド

現在推奨移行先
Discord.py(2021年以前)2.x にアップグレード(復活済み)
Discord.py fork(py-cord)維持可、新規は discord.py
Discord.py fork(nextcord)discord.py への移行を検討
eris(Node)discord.js(性能差は縮小)
node-telegram-bot-apiTelegraf(型・エコシステム優秀)
python-telegram-bot v13v20+(非同期化済み)

16. おわりに — チャットボットはインターフェースの決定だ

チャットボットフレームワーク選びは単なる技術的決定ではなく、インターフェースの決定だ。ユーザーがどのメッセンジャーで自分たちと出会うか、自分たちのチームがどの言語で運用を支えられるか、そのメッセンジャーのポリシー環境で生き残れるか。

2026年のまとめ。

  • Slack: Bolt に統一された。社内ツールの絶対王者。
  • Discord: コミュニティの絶対王者。言語陣営別にしっかり揃う。Python は discord.py 復活後に再び安定。
  • Matrix / Mattermost / Rocket.Chat: セルフホスティング・フェデレーションが必要なとき。
  • Telegram: 開発者コミュニティ・国際ユーザー。
  • WhatsApp / LINE / KakaoTalk: B2C・地域別。ポリシーコストを覚悟する。

ボットを作ると決めるとき最後にひとつ問う: このボットを一年後に誰が維持するのか? チャットボットは作るのは楽だが、運用はしつこい。ユーザーが頼り始めると止めるのも難しい。だからフレームワークの生存性・チームの実力・メッセンジャーのポリシー安定性 — この三つを見て決めるべきだ。

良いボットはユーザーがボットだと気づかないまま使う。それがよく作られたインターフェースの姿だ。


参考 / References

Slack

Discord — Node

Discord — Python

Discord — Java / Rust / .NET

Matrix / Mattermost / Rocket.Chat

Telegram

WhatsApp / LINE / KakaoTalk