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

- Name
- Youngju Kim
- @fjvbn20031
プロローグ — チャットボットは道具ではなくインフラになった
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.js | Python | Java | Rust | .NET |
|---|---|---|---|---|---|
| Slack | Bolt Node | Bolt Python | Bolt Java | (なし) | (なし) |
| Discord | discord.js / eris | discord.py / py-cord / nextcord | JDA / Discord4J | serenity | DSharpPlus / Discord.Net |
| Matrix | matrix-bot-sdk | matrix-nio | (サードパーティ) | (サードパーティ) | (サードパーティ) |
| Mattermost | mattermost-client | mattermostdriver | (サードパーティ) | (サードパーティ) | (サードパーティ) |
| Rocket.Chat | rocket.chat.js | rocket-python | (サードパーティ) | (サードパーティ) | (サードパーティ) |
| Telegram | Telegraf / node-telegram-bot-api | python-telegram-bot / aiogram | TelegramBots | teloxide | Telegram.Bot |
| Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | |
| LINE | line-bot-sdk-nodejs | line-bot-sdk-python | line-bot-sdk-java | (サードパーティ) | line-bot-sdk-net |
| KakaoTalk Channel | (HTTP) | (HTTP) | (HTTP) | (HTTP) | (HTTP) |
見えてくるパターン:
- Slack は Bolt に統一された。 Node・Python・Java すべて公式 SDK があり、ほぼ同じ API を提供する。「Slack ボットは Bolt」の一行で終わる。
- Discord は言語陣営で分かれる。 JS は discord.js、Python は discord.py(復活)/ py-cord / nextcord、Java は JDA / Discord4J、Rust は serenity、.NET は DSharpPlus / Discord.Net。社内標準言語が先で、ライブラリは後。
- Telegram にも分岐がある。 Python の同期系は python-telegram-bot、asyncio ネイティブは aiogram。Node は Telegraf が事実上の標準。
- WhatsApp・LINE・KakaoTalk は HTTP API。 公式 SDK は補助で、本質は webhook と HTTP リクエスト。言語依存は薄い。
- 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-first | aiogram |
| Node 環境 | Telegraf |
| 豊富な TypeScript 型 | Telegraf(型定義が秀逸) |
11. WhatsApp Cloud API(Meta)
WhatsApp ビジネスメッセージは 2022年以降、Meta が直接運営する Cloud API が標準になった。以前は BSP(Business Solution Provider)を経由する必要があったが、いまは Meta Cloud API に直接統合する。
基本フロー
- Meta for Developers でアプリを作成
- WhatsApp Business Account(WABA)を接続
- 電話番号を登録・認証
- webhook URL を登録(メッセージ受信)
- 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 で作る。
基本フロー
- LINE Developers で Provider とチャネルを作成
- Messaging API チャネルを有効化
- Channel Access Token を発行
- webhook URL を登録
- 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 とかなり違う。
二種類のメッセージ
- KakaoTalk Channel メッセージ — チャンネルを追加したユーザー向けのマーケティング・お知らせ。ポリシー審査あり。
- アラームトーク / フレンドトーク — 決済・予約・配送などの情報通知。テンプレートの事前登録が必要。BSP(公式の SI / 代理店)を経由して送ることが多い。
Kakao i Open Builder — チャットボットビルダー
Kakao i Open Builder は KakaoTalk Channel チャットボットを作る公式ツール。GUI でシナリオ・発話・ブロックを設計し、外部サーバーに webhook で接続する。
ボット応答フロー:
- ユーザーがチャンネルにメッセージ送信
- Kakao i Open Builder が発話を解析し、適切なブロックをマッチ
- ブロックが外部サーバー(スキルサーバー)に webhook 送信
- スキルサーバーが応答 JSON を返す
- 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)
アラームトーク送信フロー
アラームトークは韓国の情報通信網法の関係で、情報性/広告性の区別が厳格。送信フロー:
- 発信プロフィール登録(事業者登録証が必要)
- テンプレート登録・審査(Kakao 検収、数日)
- 承認テンプレートのみで送信可能
- 変数のみ置換して本文送信
韓国ビジネスが 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 すべてを扱う必要が出る。だいたいこのパターン。
- 共通ボットコア: ビジネスロジック・状態管理・LLM 呼び出し — 自前サービス。
- プラットフォームアダプター: 各プラットフォーム個別の webhook・メッセージ変換 — 薄い層。
- メッセージ正規化: テキスト・画像・ボタン・カードを共通モデルに。
これを内製するチームもあれば、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-api | Telegraf(型・エコシステム優秀) |
| python-telegram-bot v13 | v20+(非同期化済み) |
16. おわりに — チャットボットはインターフェースの決定だ
チャットボットフレームワーク選びは単なる技術的決定ではなく、インターフェースの決定だ。ユーザーがどのメッセンジャーで自分たちと出会うか、自分たちのチームがどの言語で運用を支えられるか、そのメッセンジャーのポリシー環境で生き残れるか。
2026年のまとめ。
- Slack: Bolt に統一された。社内ツールの絶対王者。
- Discord: コミュニティの絶対王者。言語陣営別にしっかり揃う。Python は discord.py 復活後に再び安定。
- Matrix / Mattermost / Rocket.Chat: セルフホスティング・フェデレーションが必要なとき。
- Telegram: 開発者コミュニティ・国際ユーザー。
- WhatsApp / LINE / KakaoTalk: B2C・地域別。ポリシーコストを覚悟する。
ボットを作ると決めるとき最後にひとつ問う: このボットを一年後に誰が維持するのか? チャットボットは作るのは楽だが、運用はしつこい。ユーザーが頼り始めると止めるのも難しい。だからフレームワークの生存性・チームの実力・メッセンジャーのポリシー安定性 — この三つを見て決めるべきだ。
良いボットはユーザーがボットだと気づかないまま使う。それがよく作られたインターフェースの姿だ。
参考 / References
Slack
- Slack Bolt for JavaScript: https://slack.dev/bolt-js/
- Slack Bolt for Python: https://slack.dev/bolt-python/
- Slack Bolt for Java: https://slack.dev/java-slack-sdk/guides/bolt
- Slack API: https://api.slack.com/
Discord — Node
- discord.js: https://discord.js.org/
- discord.js Guide: https://discordjs.guide/
- eris: https://github.com/abalabahaha/eris
Discord — Python
- discord.py: https://github.com/Rapptz/discord.py
- discord.py 復活アナウンス(2024): https://gist.github.com/Rapptz/4a2f62751b9600a31a0d3c78100287f1
- py-cord: https://github.com/Pycord-Development/pycord
- nextcord: https://github.com/nextcord/nextcord
Discord — Java / Rust / .NET
- JDA: https://github.com/discord-jda/JDA
- Discord4J: https://github.com/Discord4J/Discord4J
- serenity (Rust): https://github.com/serenity-rs/serenity
- DSharpPlus: https://github.com/DSharpPlus/DSharpPlus
- Discord.Net: https://github.com/discord-net/Discord.Net
Matrix / Mattermost / Rocket.Chat
- matrix-nio (Python): https://github.com/matrix-nio/matrix-nio
- matrix-bot-sdk (Node): https://github.com/turt2live/matrix-bot-sdk
- Mattermost API: https://api.mattermost.com/
- mattermostdriver (Python): https://vaelor.github.io/python-mattermost-driver/
- Rocket.Chat Apps Engine: https://developer.rocket.chat/
Telegram
- Telegram Bot API: https://core.telegram.org/bots/api
- python-telegram-bot: https://github.com/python-telegram-bot/python-telegram-bot
- aiogram: https://github.com/aiogram/aiogram
- Telegraf: https://github.com/telegraf/telegraf
WhatsApp / LINE / KakaoTalk
- WhatsApp Cloud API: https://developers.facebook.com/docs/whatsapp/cloud-api/
- LINE Messaging API: https://developers.line.biz/en/services/messaging-api/
- LINE Bot SDK Node: https://github.com/line/line-bot-sdk-nodejs
- LINE Bot SDK Python: https://github.com/line/line-bot-sdk-python
- Kakao i Open Builder: https://i.kakao.com/openbuilder
- KakaoTalk Channel Message API: https://developers.kakao.com/docs/latest/ko/message/rest-api
- KARTE Talk: https://karte.io/product/talk/