【期間限定無料】ChatGPTのLINEボットを30分でプログラミングせずに作る

:::note info
上手く動作しない場合は、[動作しない時のTips](#動作しない時のtips)を確認してみてください。
[Twitter](https://twitter.com/daigo_3_8)で質問承ります！
:::

3月1日に公開されたChatGPTのAPIを用いたサービスが続々と登場していますが、日本では[AIチャットくん](https://twitter.com/ai_chat_)というサービスがユーザ数40万人を突破しています。(2023/3/11 時点)

今回はAIチャットくんと同じChatGPT LINEボットを**無料で、30分で、プログラミングせずに**作ってみましょう！
番外編として、独自の知識を学習した専門性のあるカスタムチャットボットの作り方も紹介します。

それでは30分ディベロッピング、スタートです。

# 前提
　この記事の対象は「**開発の経験は少ないけど、とりあえず動くものを作ってみたい方**」です。
詳細な説明はなく、正確性よりも簡潔さを優先していることをご了承ください。
プログラム以外の説明は既存の記事に頼っています。
**【KRC】最新テクノロジー解説**さんによる分かりやすい解説動画を添付いたしますので、ぜひこちらもご覧ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/aQMlfptyIaQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### 料金について
料金は3ヶ月間ほぼ0円です。
OpenAIのAPIには最初の3ヶ月間有効な18ドルの無料枠があります。かなり良心的な価格設定なので、無茶な使い方をしない限り18ドルを超過することはないと考えていただいて結構です。

# 流れ
1. LINE Developersの登録とアクセストークンの発行
1. OpenAIの登録とAPIキーの発行
1. GAS(Google Apps Script)でボットのプログラムを用意


# LINE Developersの登録とアクセストークンの発行
LINE DevelopersというのはLINEボット開発用のアカウントです。
アクセストークンというのは、開発者のパスワードみたいなものです。
1. LINE Deverlopersにログインする
1. プロバイダーを作成する
1. LINE Messaging APIのチャンネルを作成する
1. チャンネルアクセストークンを発行する
という流れです。

こちらの記事が参考になると思います。

https://arukayies.com/gas/line_bot/gettoken



# OpenAIの登録とAPIキーの発行
OpenAIはChatGPTを提供する企業です。
APIとは外部サービス（ここではChatGPT）を利用するための窓口みたいなもので、APIキーというのは窓口を使うためのパスワードみたいなものです。


1. OpenAIにアクセスする
1. OpenAIに登録する
1. OpenAI API キーを取得する
という流れです。

こちらの記事が参考になると思います。

https://laboratory.kazuuu.net/how-to-get-an-openai-api-key/


# GASでボットのプログラムを用意
### GASプロジェクト作成
GASというのは、Googleスプレッドシートと連携してプログラムを動かすサービスです。
Googleスプレッドシートの拡張機能からプロジェクトを作成することができます。

こちらの記事が参考になると思います。

https://tonari-it.com/gas-script-editor/




### プログラムをコピペ
GASプロジェクトができたので、プログラムを用意します。
![スクリーンショット 2023-03-11 2.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/232bd7ce-9b06-8f3d-76d1-9b319f78629f.png)

上図ような画面になっていると思うので、既存のプログラムを全てを削除し、以下のプログラムをそのままコピペしてください。
LINEからのメッセージを受け取り、OpenAIのAPIで文章を生成し、LINEに返信しています。
```javascript
//APIキーとアクセストークンの設定
const OPEN_AI_KEY = "先の手順で取得したOpenAI APIキー";
const LINE_ACCESS_TOKEN = "先の手順で取得したLINEのアクセストークン";
//文章生成APIエンドポイント
const OPEN_AI_END_POINT = "https://api.openai.com/v1/chat/completions";
// メッセージ返信のエンドポイント
const LINE_END_POINT = "https://api.line.me/v2/bot/message/reply";

function doPost(e) {
  //webhook（LINEボット）からのリクエストイベント
  const event = JSON.parse(e.postData.contents).events[0];
  //応答用のトークンを取得
  const replyToken = event.replyToken;
  //送られてきたメッセージを取得
  const requestMessage = event.message.text;

  //apiリクエストのheader情報を設定
  const openAiHeaders = {
    "Authorization":`Bearer ${OPEN_AI_KEY}`,
    "Content-type": "application/json",
    "X-Slack-No-Retry": 1
  };

  //api設定パラメータ
  const openAiParams = { 
    "headers": openAiHeaders, 
    "method": "POST",
    "payload": JSON.stringify({
      "model": "gpt-3.5-turbo",//ChatGPTモデルの設定パラメータ
      "max_tokens": 512,//返信トークン数の最大値
      "temperature": 0.9,//返信の”硬さ”
      "messages": [
        {"role": "system", "content": "あなたはチャットボットです。60文字以内で明るく返答してください"}, 
        {"role": "user", "content": requestMessage}
      ]
    })
  }

  //文章生成リクエストを送る
  const res = JSON.parse(UrlFetchApp.fetch(OPEN_AI_END_POINT, openAiParams).getContentText());
  const replyMessage = res.choices[0].message.content;

  //APIリクエスト時にセットするペイロード値を設定する
  const linePayload = {
    "replyToken": replyToken,
    "messages": [{"type": "text", "text": replyMessage}]
  };

  //パラメータを設定
  const lineParams = {
    "payload": JSON.stringify(linePayload),
    "headers": {"Authorization": `Bearer ${LINE_ACCESS_TOKEN}`}, 
    "myamethod": "POST",
    "contentType": "application/json"
  };

  //Messaging APIでメッセージ送信
  UrlFetchApp.fetch(LINE_END_POINT, lineParams);
}
```
OPEN_AI_KEYとLINE_ACCESS_TOKENには先の手順で取得した値を設定してください。
**絶対に第三者に公開しないよう注意してください。**





### LINEボットと連携
プログラムが用意できたので、最後にGASとLINEボットの連携です。
こちらの記事が参考になると思います。
**デプロイした瞬間からセキュリティ的に危険な状態になるので、取得したURLは公開しないことをお勧めします。**

https://auto-worker.com/blog/?p=5141




### 動作確認
自分が作ったLINEボットを友達追加してメッセージを送ってみてください。
数秒後に返信が来るはずです。

# 動作しない時のTips
以下の項目を確認してください。

### OpenAIの初期設定を確認する
OpenAIのAPIを使うには、クレジットカード登録と使用上限の設定が必要です。
意外といろんなメディアで触れられていない部分でもあります。

https://cocomiru.com/openai-register/

https://qiita.com/kotattsu3/items/d6533adc785ee8509e2c

これらの記事を参考に、設定を行ってください。
**なお、これらの設定によって無料枠が使われなくなるという報告があります。**
これについては情報が混在しており、現時点で断言はできません。
少なくとも私のアカウントでは課金されていませんが、心配な方は控えるのが得策かと思います。


### アクセストークンやURLを確認
以下の項目を確認してください
* OpenAI APIキーやLINEのアクセストークンが正しく設定されているか
* webhookに設定しているURLが最新のデプロイURLになっているか
    * GASでは修正した時に、デプロイを**上書き**する必要があります。
    * 新しいURLを発行していたり、上書きされていなかったりすると修正は適用されません。（参考：[GoogleAppsScriptの新しいエディタで更新デプロイする方法](https://ymt43.com/gas-new-editor-deploy/)）
* 誤字脱字がないか
    * 意図せずどこかを変更してしまったのかもしれません。
    * 一度全体をコピペし直して、デプロイを上書きしてみてください。

### OpenAIサーバのパンクを疑う
リクエスト過多により、OpenAIのサーバからエラーが返されるトラブルが稀に発生します。
私たちにできることはないので、気長に待ちましょう。だいたい数十分で解決する気がしています。

### ログを確認する
本記事は初学者向けなので、小難しいことはしたくないのですが、どうしても解決しない場合はGASのログを確認する必要があります。

https://zenn.dev/uma1100/articles/2695d1d93e238a

この記事を参考にログを確認してみてください。
エラーメッセージがわかったら、ググるかChatGPTに聞けば十中八九解決します。

[Twitter](https://twitter.com/daigo_3_8)にて質問を承りますので、お気軽にお問い合わせください！

# まとめ
いかがでしたでしょうか？
今回はChatGPTをLINEで使えるようにしてみました。

しかし、このチャットボットは所詮ChatGPTの下位互換です。
せっかく作るなら、**自社のAIチャットボット**として、**自分だけの英語教師**として、専門性のあるカスタムチャットボットにしたくないですか？？

ということで、番外編です。

# 【番外編】 カスタムチャットボット

https://qiita.com/daigo_38/items/160dc9695b5166b82d7e

文脈を理解し、独自の知識を学習した専門性のあるチャットボットを作ります。
これができれば、どんなチャットボットも小一時間で作れてしまいます😳
社内Slack上のすべての会話を学習させたら、「A社のCTOって誰だっけ？」と聞くと「**Xさんです。2022年3月8日に#randomに投稿されたスレッドによると、Xさんは廃墟巡りが趣味だそうです。**」と回答するようなボットを作ることができます。
六法全書や判例集を学習させたら弁護士になれるかも。