本ページでは、AIがLINEメッセージに自動で返信してくれるLINEボットの開発方法を説明しています。
動いている様子を先に見たい人は以下からLINE友達登録して簡単な質問をしてみてください。
「趣味は?」などの世間話でも結構です。
動作確認用LINEボット(是非登録して質問を送ってみて下さい)
LINEボット開発で使用するツールは以下の4つです。
- LINE公式(https://www.lycbiz.com/jp/)
- LINE Developers(https://developers.line.biz/ja/)
- GAS(Google Apps Script) (https://script.google.com/ )
- ChatGPT (https://chatgpt.com/)
アカウントをお持ちでない方は、上記リンクからそれぞれアカウント登録もできるので、登録してから進めてください。
また、手順でわからない点などがあれば、ぜひChatGPTに質問して解決策を聞いてみてください。
手順1.LINE公式を作成
動画はこちら(LINE公式の作成〜アクセストークンの取得まで)
LINE公式は、通常のLINEと違い一人で複数のアカウントを登録することができます。
主にビジネス利用を目的として用意されたLINEのサービスの1つです。
以下の手順で、LINEボット用のLINE公式アカウントを作成してください。
1.LINE Official Account Manager(https://www.lycbiz.com/jp)にアクセスしてログインしてください。
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の画面からアクセストークンをコピーしておく
後編動画はこちら(AI人格の組み込み)
手順4.Google Apps Script(GAS)にプロジェクト作成

GASはGoogleが提供しているサービスで、Googleが用意してくれたサーバー上で自分が作成したプログラムを動作させることができる仕組みです。
LINEを使ったボット開発の場合、プログラム本体はGAS上に設置します。
ブラウザで https://script.google.com/homeにアクセスし、Googleアカウントでログインします。
「新規プロジェクト」をクリックして、新しいスクリプトプロジェクトを作成しましょう。
プロジェクトを作成するとコード.gsというサンプルファイルができているはずです。
このファイルを改良、編集してプログラムを完成させます。

手順5.自動応答プログラムの開発(AI)
AIプログラムを動作させるためには、Open AIのAPIキーが必要です。
ChatGPTの有料プランを契約している方でも、別途料金がかかりますが、非常に低コストで運用できます。
問い合わせ内容などにもよって前後はしますが、300文字程度のメッセージ送信で1円以下です。
あくまでも目安ですが、1000回メッセージを発信した場合のモデルごとの料金を並べておきます。
1ドル=140円換算で計算しています。
| モデル | 1リクエスト($) | 1,000リクエスト($) | 約日本円(¥) |
|---|---|---|---|
| GPT-4(標準) | $0.015 | $15.00 | 約 ¥2,100 |
| GPT-4 Turbo | $0.007 | $7.00 | 約 ¥980 |
| GPT-4o mini | $0.000135 | $0.135 | 約 ¥19 |
GPT-4o miniモデルでは、1000回やり取りしても20円程度の料金ですから、非常に低コストです。
以下のページにAPIキーの取得方法をまとめていますので、こちらからご自身のAPIキーを発行してください。
本来は一番難しい、自動応答プログラム自体はAIに開発してもらいます。
以下のプロンプトをChat GPTに貼り付けてプログラムを開発させてください。
※ コード内の「OpenAIのAPIキー」と「ここにあなたのLINEのトークンをコピペ」をご自身のコードに書き換えた上で、ChatGPTにコピーしてください。
Google Apps ScriptとLINE公式を連携して、私の代わりにLINEで受信したメッセージをOpen AIのAPIを利用して自動返信するGASコードを記述してください。
私のOpenAIのAPIキーとLINEのアクセストークンは以下です。
プログラムを修正しやすいように、各種設定は冒頭にまとめてください。
また、追加命令を複数行で柔軟に変更できるように``で括った状態で冒頭にまとめてほしいです。
練習用なので、開発のしやすさを考えてAPIキーやトークンなどはコードに直書きでお願いします。
リクエストのエンドポイントとして
https://api.openai.com/v1/chat/completions
を利用してMMLはgpt-4o-miniを指定してください
#Open AIのAPIキー
ここにあなたのAPIキーをコピペ
#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ではファイルの内容を変更した場合、保存しただけでは変更が反映されません。ファイルを編集したら必ず「デプロイ」をして最新の変更内容をプログラムに反映させるのを忘れないようにしましょう。
ネクストステップ
AIに人格を組み込んでみよう!
以下から人格プロンプトを取得して、AIに追加命令を渡してみましょう。
動かないときは?
ChatGPTのコード生成は非常に優秀ですが、それでも時には不十分なコードが生成されるケースもあります。
再度GPTにプロンプトを貼り付けて、コードを再生成させたりすることで解決する場合もあります。
GPTと対話して問題を解決するのが一番ですが、今回は上田が実際に動作するコードを用意しました。
安定動作のためにモデルはgpt-4を指定しています。
下記コードをGASにコピペしてご利用ください。
ご利用の際は必ず、以下のコードをAPIキーとLINEのアクセストークンをご自身のものに書き換えてご利用ください。
AI 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);
}
