LINEボット開発マニュアル

本ページでは、AIがLINEメッセージに自動で返信してくれるLINEボットの開発方法を説明しています。

動いている様子を先に見たい人は以下からLINE友達登録して簡単な質問をしてみてください。

「趣味は?」などの世間話でも結構です。

LINEボット開発で使用するツールは以下の4つです。

アカウントをお持ちでない方は、上記リンクからそれぞれアカウント登録もできるので、登録してから進めてください。

また、手順でわからない点などがあれば、ぜひChatGPTに質問して解決策を聞いてみてください。

手順1.LINE公式を作成

LINE公式は、通常のLINEと違い一人で複数のアカウントを登録することができます。
主にビジネス利用を目的として用意されたLINEのサービスの1つです。
以下の手順で、LINEボット用のLINE公式アカウントを作成してください。

1.LINE Official Account Manager(https://www.lycbiz.com/jp)にアクセスしてログインしてください。
ログイン画面が出ない場合はこちらからもアクセスできます。
https://account.line.biz/login

2.ログイン後、コンソール画面から「アカウント作成」または「新規作成」ボタンをクリックします。


3.アカウント名、アイコン、業種、説明文などの必要情報を入力し、公式アカウントを作成します。
各種プロフィール項目で入力内容に悩む箇所があれば、ChatGPTに聞いてみましょう。
ChatGPTに「ビジネス用のLINEのアカウント名を考えて」
のように質問したら候補を出してくれますよ。

4.作成完了後、管理画面でアカウントの情報や友だち追加用のQRコードなどが確認できます。

アカウント認証のリクエストは本日は行わないで大丈夫です。

以下のような画面が表示されたらOKです。

手順2.Messaging APIチャネルの作成

LINE公式アカウントを作成したら、画面右上にある設定ボタンをおして、Messaging APIのページからMessaging APIを有効にして、プロバイダーの登録を済ませましょう。

プロバイダー名は何でも構いません、作成したLINE公式アカウント名と同じでもいいでしょう。

プロバイダを登録したら、LINE Developersコンソールから「チャネルアクセストークンの発行」をしていきます。

手順3.チャネルアクセストークンの取得

1.LINE Developers(https://developers.line.biz/ja/)にアクセスしてログインしてください。

2.作成したチャネルの設定画面に移動し、【Messaging API設定】タブの下にある「チャネルアクセストークン」で「発行」ボタンをクリックし、生成されたアクセストークンをコピーしておきましょう。

チェック項目

  • LINE公式アカウントを作成
  • Messaging APIを有効にする
  • LINE Developersの画面からアクセストークンをコピーしておく

手順4.Google Apps Script(GAS)にプロジェクト作成

GASはGoogleが提供しているサービスで、Googleが用意してくれたサーバー上で自分が作成したプログラムを動作させることができる仕組みです。

LINEを使ったボット開発の場合、プログラム本体はGAS上に設置します。

ブラウザで https://script.google.com/ にアクセスし、Googleアカウントでログインします。
「新規プロジェクト」をクリックして、新しいスクリプトプロジェクトを作成しましょう。

プロジェクトを作成するとコード.gsというサンプルファイルができているはずです。

このファイルを改良、編集してプログラムを完成させます。

コード.jsの編集画面。右側の編集領域がプログラムを記述する部分。


手順5.自動応答プログラムの開発(AI)

従来一番難しい、自動応答プログラム自体はAIに開発してもらいます。
以下のプロンプトをChat GPTに貼り付けてプログラムを開発させてください。

GASにそのままコピペしても動きません。
コード内の「ここにあなたのLINEのトークンをコピペ」をご自身のコードに書き換えた上で、
必ずChatGPTにコピーしてください!

Google Apps ScriptとLINE公式を連携して、私の代わりにLINEで受信したメッセージをOpen AIのAPIを利用して自動返信するGASコードを記述してください。

私のOpenAIのAPIキーとLINEのアクセストークンは以下です。
プログラムを修正しやすいように、各種設定は冒頭にまとめてください。
また、追加命令を複数行で柔軟に変更できるように``で括った状態で冒頭にまとめてほしいです。

リクエストのエンドポイントとして
https://api.openai.com/v1/chat/completions
を利用してMMLはgpt-4を指定してください

#Open AIのAPIキー
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

#LINEのアクセストークン
ここにあなたのLINEのトークンをコピペ

#APIに渡す追加命令
あなたは私の代わりに質問に答える優秀な私のクローンAIです。

出力されたコードをGASにコピペしましょう。

コードを保存したら、デプロイボタンから、このプログラムを「ウェブアプリ」としてデプロイします。「アクセスできるユーザー」の欄は必ず「全員」を設定してください。

✅ 初回デプロイ時のGoogle認証について(重要)

LINEボットをGAS(Google Apps Script)で動かすために、初回のデプロイ時にはGoogleから以下のようなセキュリティ警告画面が表示されることがあります。

これはGASがまだGoogleに「信頼されたアプリ」として登録されていないためで、誰が作ったか分からないアプリを実行する前に「本当に実行しますか?」と聞かれるイメージです。

ですが、これは自分自身が作ったスクリプトなので、手順に沿って安全に承認できます


▼ 認証手順

① 「このアプリはGoogleで確認されていません」と表示される
➡ 下にある「詳細(Advanced)」リンクをクリック


② 「プロジェクト名(安全ではないページ)に移動」をクリック
※ 表示されるプロジェクト名は、GASのスクリプト名です。


③ Googleアカウントでログインし、必要な権限を**「許可」**します
(LINEと連携するためにスプレッドシート・スクリプトの実行権限などを求められます)

デプロイしたときに表示されるURLをLINEのwebhookとして設定したら完了です。

LINE公式の管理画面、Messaging APIの設定ページでwebhook URLをコピペして設定してください。

※ デプロイとは?
GASではファイルの内容を変更した場合、保存しただけでは変更が反映されません。ファイルを編集したら必ず「デプロイ」をして最新の変更内容をプログラムに反映させるのを忘れないようにしましょう。


Open AIのAPIキーは今回のセミナー用のサンプルです。
今後もAIボットを使いたい場合はご自身のOpen AIのキーを取得してください。

Open AIのキーの取得方法は、ChatGPTに「Open AIのキーの取得方法を教えて」と聞けばリンク付きで丁寧に教えてくれます。ぜひ聞いてみてください。

ネクストステップ

AIに人格を組み込んでみよう!
以下から人格プロンプトを取得して、AIに追加命令を渡してみましょう。

動かないときは?

今回の開発実演にあたってOpenAIのAPIキーは上田のキーを一時的に開放しました。
数日は有効なキーですが、一定期間で無効になります。

継続的にAIを利用する場合はご自身のAPIキーをご利用ください。

その場合は、ChatGPTなどに「Open AIのAPIキーの取得方法を教えて」と聞いて、OPENAI_API_KEYの値をご自身のAPIキーに上書きしてコードを作り直してください。

ChatGPTのコード生成は非常に優秀ですが、それでも時には不十分なコードが生成されるケースもあります。

ChatGPTの対話を繰り返して、問題を解決するのが一番ですが、今回は上田が実際に動作するコードを用意しました。
ご利用の際は必ず、以下のコードをAPIキーとLINEのアクセストークンをご自身のものに書き換えてご利用ください。

/***************************************
 * 【設定項目】
 ***************************************/
var OPENAI_API_KEY = 'OPEN AIのAPIキーをコピペ';
var LINE_ACCESS_TOKEN = 'LINEのアクセストークンをコピペ';



var OPENAI_API_URL = 'https://api.openai.com/v1/chat/completions';
var LINE_REPLY_API_URL = 'https://api.line.me/v2/bot/message/reply';

// APIに渡す追加命令(システムプロンプト)
// バッククォートで括った複数行の自然文として設定しています。
var ADDITIONAL_INSTRUCTIONS = `
あなたは私の代わりに質問に答える優秀な私のクローンAIです。
私のプロフィールは以下です。
---プロフィールここから---
あなたのプロフィールをここにコピペしよう
---プロフィールここまで---
`;


/***************************************
 * 【LINE webhook エントリポイント】
 ***************************************/
function doPost(e) {
  try {
    // LINEからのPOSTデータをJSONで取得
    var data = JSON.parse(e.postData.contents);
    if (!data.events || data.events.length === 0) {
      return ContentService.createTextOutput(JSON.stringify({status: 'no events'}));
    }
    
    // 複数イベントがある場合は、最初のイベントのみ処理
    var event = data.events[0];
    var replyToken = event.replyToken;
    var userMessage = event.message.text;
    
    // OpenAI APIに問い合わせて回答を取得
    var replyMessage = callOpenAI(userMessage);
    
    // 取得した回答をLINEへ返信
    replyToLine(replyToken, replyMessage);
    
    return ContentService.createTextOutput(JSON.stringify({status: 'ok'}));
  } catch (err) {
    console.error(err);
    return ContentService.createTextOutput(JSON.stringify({status: 'error', message: err}));
  }
}


/***************************************
 * 【OpenAI API 呼び出し】
 ***************************************/
function callOpenAI(userMessage) {
  var payload = {
    model: 'gpt-4',
    messages: [
      { role: 'system', content: ADDITIONAL_INSTRUCTIONS },
      { role: 'user', content: userMessage }
    ]
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + OPENAI_API_KEY
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(OPENAI_API_URL, options);
  var responseData = JSON.parse(response.getContentText());

  if (response.getResponseCode() === 200 && responseData.choices && responseData.choices.length > 0) {
    return responseData.choices[0].message.content;
  } else {
    console.error('OpenAI API error:', responseData);
    return 'エラーが発生しました。';
  }
}


/***************************************
 * 【LINE 返信送信】
 ***************************************/
function replyToLine(replyToken, message) {
  var payload = {
    replyToken: replyToken,
    messages: [
      {
        type: 'text',
        text: message
      }
    ]
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN
    },
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(LINE_REPLY_API_URL, options);
}