LINEログインをしてbotからプッシュメッセージをもらうまで

JavaScript
この記事は約8分で読めます。

単純にbotから送信したら、友達登録している人全員にメッセージが送られてしまう
botに対してメッセージを送れば返信してくれるけど向こうからはメッセージをくれない

今回はNEXT.js + TypeScriptで実装していきます
プッシュメッセージの実装のみ記事にしていますのでNEXT.jsの環境構築には一切触れていません
ご了承ください

LINE Developersの登録

LINE Developersの登録を行いましょう
LINEログインで簡単に登録できます
https://developers.line.biz/ja/

開発者名とメールアドレスの入力が求められます

botの作成

プロバイダーを作成して機能を追加していきます

まずはMessaging APIの作成をします
特に困るような項目はないと思います

登録が完了したらMessaging APIの設定画面でチャネルアクセストークンを確認しておきましょう
このトークンで送信元のbotの設定をします

チャネルアクセストークン

LINEログインの作成

続いてLINEログインの作成をします

作成はMessaging APIとほぼ同じですが、その後の設定が少し必要になります

作成したらチャネルIDチャネルシークレットを確認しておきます

チャネルID
チャネルシークレット

ログイン時に友達追加をするためのbotを関連付けておきます

botの関連付け

ログイン処理を行なった後にリダイレクトするURLを設定します
今回はローカルで動かすため「127.0.0.1」を設定します
以前は「localhost」が使えましたが今は使えないみたいです

コールバックURLの設定

LINEログインの実装

LINEログインページに遷移するだけのページです
トークンは直接コードに書かずenvファイルなどで管理しておくといいと思います

識別に必要なデータはURL上に載せる必要があります
パラメータは公式ドキュメントを参照してください
https://developers.line.biz/ja/docs/line-login/integrate-line-login/#making-an-authorization-request

client_idではLINEログインのチャネルIDを設定してください(process.env.NEXT_PUBLIC_CLIENT_ID)

/* index.tsx */
import type { NextPage } from 'next'

const Home: NextPage = () => {

  const url = `https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=${process.env.NEXT_PUBLIC_CLIENT_ID as string}&redirect_uri=http%3A%2F%2F127.0.0.1%3A3000%2Fline&state=hoge&bot_prompt=normal&scope=profile%20openid&nonce=foobar&prompt=consent`

  return (
    <div>
      <a href={url}>
        Lineログイン
      </a>
    </div>
  )
}

export default Home

IDトークンの検証

トークンの検証です

URLにトークンが載っているため取得します

process.env.NEXT_PUBLIC_CLIENT_ID:LINEログインのチャネルID
process.env.NEXT_PUBLIC_CLIENT_SECRET:LINEログインのチャネルシークレット

/* line.tsx */
import axios from "axios";
import { useRouter } from "next/router";

const Line = () => {

  const route = useRouter();

  const getToken = async () => {

    // アクセストークンの発行
    var params = new URLSearchParams()
    params.append('grant_type', "authorization_code")
    params.append('code', route.query.code as string)
    params.append('redirect_uri', "http://127.0.0.1:3000/line")
    params.append('client_id',  process.env.NEXT_PUBLIC_CLIENT_ID as string)
    params.append('client_secret', process.env.NEXT_PUBLIC_CLIENT_SECRET as string)

    const token = await axios.post("https://api.line.me/oauth2/v2.1/token", params);
    console.log("token: ", token.data)


    // IDトークンの検証
    var params_second = new URLSearchParams()
    params_second.append("id_token", token.data.id_token)
    params_second.append("client_id", process.env.NEXT_PUBLIC_CLIENT_ID as string)
    const userdata = await axios.post("https://api.line.me/oauth2/v2.1/verify", params_second);
    console.log("userdata: ", userdata.data)


    const data = {
      params: {
        to: userdata.data.sub
      }
    }

    const result = await axios.get('http://127.0.0.1:3000/api/push', data)
    console.log(result)

  }

  return (
    <div>
      <button onClick={getToken}>send message</button>
    </div>
  ) 
}

export default Line

アクセストークンの発行→IDトークンの検証という流れでユーザーIDを取得しています

最後のGETリクエストでプッシュメッセージの送信処理を行なっています
本当はPOSTでやった方がいいですが

プッシュメッセージの送信

プッシュメッセージの送信処理です
サーバでの処理になるのでNEXT.jsのAPIで作成します

トークン検証のようにAPIを利用することもできますがライブラリを使った方がスッキリするのでこちらを使います

process.env.NEXT_PUBLIC_CHANNEL_ACCESS_TOKEN:Messaging APIのチャネルアクセストークン

/* push.ts */
import type { NextApiRequest, NextApiResponse } from 'next'

import * as line from "@line/bot-sdk"
import type {Message} from "@line/bot-sdk"

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {

  try {
    if (req.method === 'GET') {
      const client = new line.Client({
        channelAccessToken: process.env.NEXT_PUBLIC_CHANNEL_ACCESS_TOKEN as string
      })

      const message: Message = {
        type: 'text',
        text: 'Hello World!'
      };
      
      const hoge = await client.pushMessage(req.query.to as string, message)

      res.json([req.query.to, hoge])
    }

  }catch (err: any) {
    res.json(err)
  }

}

処理が正常に完了した場合戻り値は空になります

これでbotから”Hello World!”が送られたはずです
お疲れ様でした

おわりに

今回はbotからプッシュメッセージをもらう方法でした

パラメータなどの説明は全て省いてしまいましたが、是非公式の正しい情報を参照してください

間違い等ありましたら指摘などお願いします

タイトルとURLをコピーしました