LINE Messenging APIを使用し、APIリクエストでメッセージを送信するまでのメモ

# やりたいこと

ホームページのフォームから送信された内容をLINEで受け取れたら良いなあと思い、検証を行ったのでメモ。
参照した公式ドキュメントはこちらです。（この記事を読まなくても、以下の公式ドキュメントを読むだけでもできると思います。）

- [Messaging APIを始めよう | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-oa-manager)
- [メッセージを送信する | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/sending-messages/)
- [チャネルアクセストークンv2.1を発行する | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/generate-json-web-token/#create-an-assertion-signing-key)
- [Messaging APIリファレンス | LINE Developers](https://developers.line.biz/ja/reference/messaging-api/#channel-access-token)

# チャネルを作る

メッセージを送信するBot本体(= チャネル?)を作成します。

以下の公式ドキュメントに、スクショ付きで說明がついています。
[Messaging APIを始めよう | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-oa-manager)

チャネルを作成すると、実はすでにメッセージの送信ができるAPIの口は出来上がっているので、あとはアクセストークンを発行するだけです。
[メッセージを送信する | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/sending-messages/)

# アクセストークンを発行する

アクセストークンには、以下の種類があります。

| 種類                           | 有効期限                   | 発行方法                                                                                             | 
| ------------------------------ | -------------------------- | ---------------------------------------------------------------------------------------------------- | 
| 短期のチャネルアクセストークン | 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](https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/)

今回は検証で使いたいだけなので、`チャネルトークンv2.1`を選択しました。

## アサーション署名キーの作成

色々やり方はあるようですが、Chromeなどのブラウザで生成するのが手っ取り早いかと思います。

[ブラウザで生成する](https://developers.line.biz/ja/docs/messaging-api/generate-json-web-token/#use-browser)

生成された`公開鍵`と`秘密鍵`をメモっておきます。

## `kid`の取得

先程生成された公開鍵を、LINE Developersコンソールのチャネル設定画面から登録すると、`kid`が発行されるので、メモります。

[公開鍵を使ってkidを取得する](https://developers.line.biz/ja/docs/messaging-api/generate-json-web-token/#register-public-key-and-get-kid)

## チャネルIDを確認する

[LINE Developersコンソール](https://developers.line.biz/console/)で確認できます。IDはこの後使うのでメモっておきます。


## JWT(JSON Web Token)を生成する

[JWTを生成する](https://developers.line.biz/ja/docs/messaging-api/generate-json-web-token/#generate-jwt)

2個前のセクションで生成された`秘密鍵`と、先程発行された`kid`を使って、JWTなるものを生成します。
Node.jsが動く環境が必要なので、無い方は準備してください。


```shell
### 適当なディレクトリを作る
$ mkdir createJWT
$ cd createJWT

### package.jsonを作成する(コマンド実行後に出てくる質問はすべてエンターキーで飛ばして大丈夫です)
$ npm init

### node-joseをインストールする
$ npm i node-jose --save

### 実行ファイルを作成する
$ vi create.js
```

実行ファイルの書き方は公式ドキュメントにも書いてあります。
以下は、公式ドキュメントから、どこを書き換えるのか示したものです。

```javascript: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);
  });
```

ここまでできたら、このファイルを実行します。

```shell
$ node create.js
```
実行すると、JWTが出力されるので、それをメモります。


## アクセストークンをリクエストする

[チャネルアクセストークンv2.1を発行する](https://developers.line.biz/ja/reference/messaging-api/#issue-channel-access-token-v2-1)

上記ドキュメント通りに、先程作成したJWTをリクエストボディにセットしてリクエストを投げると、アクセストークンが帰ってきます。
これでやっと、APIリクエストでメッセージを送信する準備ができました。

# APIリクエストでメッセージを送信する

[こちら](https://developers.line.biz/ja/docs/messaging-api/sending-messages/)を参考に、ようやく手に入れたアクセストークンをヘッダーにセットし、リクエストを投げると...

メッセージが届きました。

![IMG_DBDEF6FC9EFB-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951040/1293417f-0436-26dc-c82a-2f31a0cd0815.jpeg)



# 終わりに

アクセストークン取得までの道のりは少々長かったですが、とても簡単にメッセージを送ることができました。
自前でサーバー立てたりする必要がないって本当にすごい...