はじめに
Denoはv1.25以降からnpmモジュールがimportできるようになっています。これでLINE Messaging API SDK for node.jsをインポートして利用できるかやってみました。
やってみる
VSCodeを設定する
VSCodeを使っている場合、Deno extensionを有効にしたりnpm importしたモジュールのタイプヒントを表示したりすると便利です。
{
"recommendations": [
"denoland.vscode-deno"
]
}
{
"deno.enable": true,
"deno.enablePaths": ["./"],
"deno.unstable": true,
"deno.lint": true,
"deno.path": "/Users/user/.deno/bin/deno"
}
/Users/user/.deno/bin/deno
は自分のPCのdeno cliのパスに読み替えてください。
{
"imports": {
"npm/": "https://unpkg.com/"
}
}
Massaging API Client を作成する
ためしに Massaging API Clientを作成するところまで実行してみます。
import { messagingApi } from "npm:@line/bot-sdk@8.4.0"
import type { ClientConfig } from "npm:@line/bot-sdk@8.4.0"
const config: ClientConfig = {
channelAccessToken: "YOUR CHANNEL ACCESS TOKEN",
channelSecret: "YOUR CHANNEL SECRET",
}
const client = new messagingApi.MessagingApiClient(config)
console.log(client)
deno run -A main.ts
MessagingApiClient {
httpClient: HTTPClient {
config: {
defaultHeaders: { Authorization: "Bearer YOUR CHANNEL ACCESS TOKEN" },
responseParser: [Function: bound parseHTTPResponse],
baseURL: "https://api.line.me"
},
instance: [Function: wrap] {
constructor: [Function: wrap],
request: [Function: wrap],
getUri: [Function: wrap],
delete: [Function: wrap],
get: [Function: wrap],
head: [Function: wrap],
options: [Function: wrap],
post: [Function: wrap],
postForm: [Function: wrap],
put: [Function: wrap],
putForm: [Function: wrap],
patch: [Function: wrap],
patchForm: [Function: wrap],
defaults: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: [ "xhr", "http" ],
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
xsrfCookieName: "XSRF-TOKEN",
xsrfHeaderName: "X-XSRF-TOKEN",
maxContentLength: -1,
maxBodyLength: -1,
env: { FormData: [Function], Blob: [class Blob] },
validateStatus: [Function: validateStatus],
headers: {
common: [Object],
delete: {},
get: {},
head: {},
post: {},
put: {},
patch: {},
Authorization: "Bearer YOUR CHANNEL ACCESS TOKEN",
"User-Agent": "@line/bot-sdk/8.4.0"
},
baseURL: "https://api.line.me"
},
interceptors: {
request: InterceptorManager { handlers: [] },
response: InterceptorManager { handlers: [Array] }
},
create: [Function: create]
}
}
}
なんかやれそうな感じです。
シンプルなBot Serverを作ってみる
Deno標準のhttpサーバーでシンプルなBotを作ってみます。
import { messagingApi } from "npm:@line/bot-sdk@8.4.0"
import type { ClientConfig } from "npm:@line/bot-sdk@8.4.0"
import { MessageEvent } from "npm:@line/bot-sdk@8.4.0";
const config: ClientConfig = {
channelAccessToken: "YOUR_CHANNEL_ACCESS_TOKEN",
channelSecret: "YOUR_CHANNEL_SECRET",
}
const client = new messagingApi.MessagingApiClient(config)
const handler = async (request: Request): Promise<Response> => {
if (request.method.toUpperCase() === "POST") {
const body = await request.json()
const event: MessageEvent = body.events[0]
await client.replyMessage({
replyToken: event.replyToken,
messages: [
{
type: "text",
text: "Hello, I'm Deno.",
},
],
})
}
return new Response(null, { status: 204 })
}
const options = {
port: 443,
cert: await Deno.readTextFile("CERT_FILE_PATH"),
key: await Deno.readTextFile("CERT_KEY_PATH"),
}
Deno.serve(options, handler)
上記のコードを前回のLINE BotサーバーをNestJSで開発する その1と同じようにEC2インスタンスを立ち上げてDenoをインストールし、Let's Encriptの証明書を取得しました。
上記のコードを実行します。
deno run -A main.ts
LINE Chatからメッセージを送るとHello, I'm Deno.
とだけ返信するBotができました。
おわりに
Denoのnpm importでもLINE Messaging API SDK for node.jsが問題なく動作しそうです。以前書いた記事でdeno-linebotを紹介しましたが、特定のWeb server frameworkに依存していてちょっと使い勝手が悪いかなと思っていたのでこちらの方法のほうが自由度が高そうです。個人的には最近Denoを使うことも増えてきたので開発が捗るシーンが出てくるかもしれません。
次回は何かDeno用のweb frameworkを使ってBotを作ってみたいと思います。