LoginSignup
9
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-05-31

やりたいこと

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

チャネルを作る

メッセージを送信する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が発行されるので、メモります。

公開鍵を使ってkidを取得する

チャネルIDを確認する

LINE Developersコンソールで確認できます。IDはこの後使うのでメモっておきます。

JWT(JSON Web Token)を生成する

JWTを生成する

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

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

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

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

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

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

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が出力されるので、それをメモります。

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

チャネルアクセストークンv2.1を発行する

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

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

こちらを参考に、ようやく手に入れたアクセストークンをヘッダーにセットし、リクエストを投げると...

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

IMG_DBDEF6FC9EFB-1.jpeg

終わりに

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

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6