やりたいこと
ホームページのフォームから送信された内容をLINEで受け取れたら良いなあと思い、検証を行ったのでメモ。
参照した公式ドキュメントはこちらです。(この記事を読まなくても、以下の公式ドキュメントを読むだけでもできると思います。)
- Messaging APIを始めよう | LINE Developers
- メッセージを送信する | LINE Developers
- チャネルアクセストークンv2.1を発行する | LINE Developers
- Messaging APIリファレンス | LINE Developers
チャネルを作る
メッセージを送信するBot本体(= チャネル?)を作成します。
以下の公式ドキュメントに、スクショ付きで說明がついています。
Messaging APIを始めよう | LINE Developers
チャネルを作成すると、実はすでにメッセージの送信ができるAPIの口は出来上がっているので、あとはアクセストークンを発行するだけです。
メッセージを送信する | LINE Developers
アクセストークンを発行する
アクセストークンには、以下の種類があります。
種類 | 有効期限 | 発行方法 |
---|---|---|
短期のチャネルアクセストークン | 30日間 | https://developers.line.biz/ja/reference/messaging-api/#issue-shortlived-channel-access-token |
長期のチャネルアクセストークン | 有効期限なし | LINE Developersコンソールの[チャネル設定]タブでチャネルを選択して、[Messaging API設定]タブで発行 |
チャネルアクセストークンv2.1 | 任意の有効期間を指定できる | https://developers.line.biz/ja/docs/messaging-api/generate-json-web-token/ |
参考: チャネルアクセストークン | LINE Developers
今回は検証で使いたいだけなので、チャネルトークンv2.1
を選択しました。
アサーション署名キーの作成
色々やり方はあるようですが、Chromeなどのブラウザで生成するのが手っ取り早いかと思います。
生成された公開鍵
と秘密鍵
をメモっておきます。
kid
の取得
先程生成された公開鍵を、LINE Developersコンソールのチャネル設定画面から登録すると、kid
が発行されるので、メモります。
チャネルIDを確認する
LINE Developersコンソールで確認できます。IDはこの後使うのでメモっておきます。
JWT(JSON Web Token)を生成する
2個前のセクションで生成された秘密鍵
と、先程発行されたkid
を使って、JWTなるものを生成します。
Node.jsが動く環境が必要なので、無い方は準備してください。
### 適当なディレクトリを作る
$ mkdir createJWT
$ cd createJWT
### package.jsonを作成する(コマンド実行後に出てくる質問はすべてエンターキーで飛ばして大丈夫です)
$ npm init
### node-joseをインストールする
$ npm i node-jose --save
### 実行ファイルを作成する
$ vi create.js
実行ファイルの書き方は公式ドキュメントにも書いてあります。
以下は、公式ドキュメントから、どこを書き換えるのか示したものです。
let jose = require('node-jose');
let privateKey = `
////////// ここを書き換える //////////
${生成した秘密鍵}
/////////////////////////////////
`;
let header = {
alg: "RS256",
typ: "JWT",
////////// ここを書き換える //////////
kid: ${kid}
/////////////////////////////////
};
let payload = {
////////// ここを書き換える //////////
iss: ${チャネルID},
sub: ${チャネルID},
/////////////////////////////////
aud: "https://api.line.me/",
////////// 以下は任意で書き換える //////////
// JWTの有効期間。UNIX時間で設定する
exp: Math.floor(new Date().getTime() / 1000) + 60 * 30,
// tokenの有効期限。秒で設定する。最大30日
token_exp: 60 * 60 * 24 * 30
/////////////////////////////////
};
jose.JWS.createSign({ format: 'compact', fields: header }, JSON.parse(privateKey))
.update(JSON.stringify(payload))
.final()
.then(result => {
console.log(result);
});
ここまでできたら、このファイルを実行します。
$ node create.js
実行すると、JWTが出力されるので、それをメモります。
アクセストークンをリクエストする
上記ドキュメント通りに、先程作成したJWTをリクエストボディにセットしてリクエストを投げると、アクセストークンが帰ってきます。
これでやっと、APIリクエストでメッセージを送信する準備ができました。
APIリクエストでメッセージを送信する
こちらを参考に、ようやく手に入れたアクセストークンをヘッダーにセットし、リクエストを投げると...
メッセージが届きました。
終わりに
アクセストークン取得までの道のりは少々長かったですが、とても簡単にメッセージを送ることができました。
自前でサーバー立てたりする必要がないって本当にすごい...