ハンズオンっぽい記事になります。
本記事ではおうむ返しをするLINE BotをCloudflareにcliでさささっとデプロイするところをやってみます。
テーマはスピード
- Bunだからインストールが速い
- cloudflareはDeployが速い
- そして動作もメチャクチャ速い
というのがメリットです
![Eicrns8UcAAOAfq.jpeg](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2100048%2F39d61653-bcc2-ca0f-bf0f-88f8baf99db1.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e153844ec314651f7ae4cf08611f35e5)
一方でデメリットもあり
画像を送受信するLINE Botには向いていません
これはcloudflareの処理時間制限に引っかかる可能性があるためです。
気になる方は次の記事を参照ください。
0. 準備
0.1. cloudflareのアカウント登録
アクセスして適当に登録するだけです
0.2 Bunのインストール
トップページにあるLinux & macOS
またはWindosw
のところに書いてあるコマンドを、ターミナルまたはPowerShellにコピペして実行しましょう
わかる方は、パッケージマネージャー使っていただいても大丈夫です
0.2.1. おすすめのパッケージマネージャー
OSに合わせて選んでください。私はPCに合わせて(個人用がMac、仕事用がWindowなので)両方利用していますが良い感じです。
Mac: proto
Windows: Scoop
0.3. VS Codeのインストール
オンラインエディタだとcloudflareのログインのところでCORSに引っかかって進まないのでローカルのエディタを利用することをお勧めします。
0.4. LINE Developersのアカウント登録と、プロバイダーの作成と設定
この記事の1.LINE公式アカウント作成
を実施してください
途中で作成されるChannel Secret
, Channel Access Token
もメモしておいてください
1. ハンズオン
1.0. デスクトップに空のフォルダーを作成し、VS Codeで開いてターミナルを起動
初めてVS Codeを使う方向けの項です
普段VS Codeでの開発を実施されている方は、その手順で開始していただいて構いません
折りたたみを開いて参照する
1.0.1. 空のフォルダーを作成する
- デスクトップに
linebot
などご自身がわかる名前でフォルダを作成してください
1.0.2. VS Codeを開いてフォルダーを開く
- VS Codeを開いてください
- 画像の通り、VS Codeでフォルダーを開いてください
1.0.3. VS Codeからターミナルを開く
- この後cliで操作するのでターミナルを開きます
- 下の画像のように進めてください
1.1. CLIからBunでHonoのプロジェクトを開始してCloudflareにデプロイ
まずはcloudflareにベースとなるサーバーを立てていきます
1.1.1. Bunを使ってHonoのプロジェクトを準備
- ターミナルに次のコマンドをコピペしてEnterを押してください
bun create hono
- 色々と質問されるので、画像のように答えてください
- 画像の通り
cd line-server
をターミナルにコピペしてEnter
-
package.json
を確認
scriptsに
deploy
のコマンドがあることを確認
1.1.2. cloudflareへのDeploy
- ターミナルに次のコマンドをコピペしてEnter
bun run deploy
初回はログインするためにアクセスするURLが表示されると思いますので、そのURLにアクセスして認証を行ってください。私は使ったことがあったので画像が撮れず、申し訳ありません🙇
- 次の画像のようになっていれば成功です
- 画像の位置にあるアドレスへアクセスしてみましょう
1.2. Bot serverの起動
次にLINE Botのサーバーとして動かすための準備をしていきます
1.2.1. コードのコピペ
-
index.ts
に次のコードをコピペしてください
import {
messagingApi,
webhook,
} from '@line/bot-sdk'
import { Hono } from 'hono'
import HmacSHA256 from "crypto-js/hmac-sha256";
import Base64 from "crypto-js/enc-base64";
type Bindings = {
CHANNEL_ACCESS_TOKEN: string,
CHANNEL_SECRET: string,
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/', (c) => {
return c.text('Hello hono & line!')
})
app.post('/webhook', async (c) => {
const body = await c.req.text() // JSONではなくテキストで取得
const channelAccessToken = c.env.CHANNEL_ACCESS_TOKEN || process.env.CHANNEL_ACCESS_TOKEN || ''
const channelSecret = c.env.CHANNEL_SECRET || process.env.CHANNEL_SECRET || ''
// シグネチャの取得
const signature = c.req.header('x-line-signature')
if (!signature) {
return c.text('Missing signature', 400)
}
// HMACを使ってシグネチャを生成
const hash = await generateHmac(channelSecret, body);
// シグネチャの検証
if (signature !== hash) {
return c.text('Invalid signature', 403)
}
const events = JSON.parse(body).events
const promises = events.map((event: webhook.Event) => handleEvent(event, channelAccessToken))
await Promise.all(promises)
return c.text('OK')
})
const handleEvent = async (
event: webhook.Event,
accessToken: string,
) => {
if (event.type !== 'message' || event.message.type !== 'text') return;
if (!event.replyToken) return;
const { text } = event.message;
fetch('https://api.line.me/v2/bot/chat/loading/start', {
method: 'POST',
headers: {
"Authorization": `Bearer ${accessToken}`,
"Content-Type": "application/json"
},
body: JSON.stringify({"chatId": event.source?.userId})
})
const responseBody: messagingApi.ReplyMessageRequest = {
replyToken: event.replyToken,
messages: [
{'type': 'text', 'text': text}
]
}
return fetch('https://api.line.me/v2/bot/message/reply', {
method: 'POST',
headers: {
"Authorization": `Bearer ${accessToken}`,
"Content-Type": "application/json"
},
body: JSON.stringify(responseBody)
})
}
export default app
const generateHmac = async (secret: string, message: string) => {
const hmac = HmacSHA256(message, secret);
return Base64.stringify(hmac);
}
1.2.2. ライブラリのインストール
- ターミナルに次のコマンドを入力してください
bun add @line/bot-sdk crypto-js @types/crypto-js
- 画像のような感じでインストールが進みます
1.2.3. 新しいコードでDeploy
- もう一度次のコマンドをターミナルにコピペしてdeployします
bun run deploy
デプロイ成功したら先ほどと同じURLにアクセスしてみます
1.3. 環境変数とwebhook URLの設定
最後に認証周りの設定を行います
1.3.1. cloudflareへの環境変数の設定
LINE Developersにあるチャネルシークレットとチャネルアクセストークンをcloudflareに設定していきます
- まずはチャネルシークレットを設定します
- 次のコマンドをターミナルに入力してEnterを押してください
bunx wrangler secret put CHANNEL_SECRET
- 同様の手順をチャネルアクセストークンに対して実施します
- 次のコマンドをターミナルに入力してEnterを押してください
bunx wrangler secret put CHANNEL_ACCESS_TOKEN
これでcloudflare側のセットは完了です
1.3.2. LINE Developersへのwebhook URLの設定
次はLINE Developers側の設定となります
- これまで使ってきたURL(Hello hono & line!が表示されるURLです)をコピペして、末尾に/webhookを入力します
-
更新
ボタンを押したのち、検証
を押して成功のダイアログが表示されれば成功です
Webhook設定の項目にあるwebhook URLに入力します
ここまでできればおうむ返しLINE Botが動作します。試しに実施してみましょう
2. 動かしてみる
は、速すぎる・・・
1日1万リクエスト、感謝のおうむ返しは、ローディングアニメーションを置き去りにしてしまった
3. 実行環境
基本的にBot SDKは型のチェックにしか利用していないので、そこまでバージョン差異に困ることはないかと思いますが、念の為Bun
のバージョンとpackage.json
をおいておきます
❯ bun --version
1.1.24
{
"name": "line-server",
"scripts": {
"dev": "wrangler dev src/index.ts",
"deploy": "wrangler deploy --minify src/index.ts"
},
"dependencies": {
"@line/bot-sdk": "^9.2.2",
"@types/crypto-js": "^4.2.2",
"crypto-js": "^4.2.0",
"hono": "^4.5.7"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20240529.0",
"wrangler": "^3.57.2"
}
}
4. 最後に
あとは煮るなり焼くなりお好きにどうぞ。
特に、ノーコードツールのmakeを利用している場合など、直接LINEモジュールを使うとレスポンスが遅いですが、LINEの部分はcloudflareに任せて、makeにwebhookで繋いで処理を実行するようにすると、かなり軽快なLINE Botを作ることが可能です