毎朝、ChatGPTから「今日も一日がんばってね!」という応援メールをもらうには?(「GoogleAppScripts」+「ChatGPT API」+「Gmail」で簡単に作るオリジナル配信)
こんにちは!
エス・エー・エス株式会社
DXサービス部の海田(かいだ)です。
5月です。
入学から1か月たちましたが、子供たちも小学校、幼稚園に変わらず楽しく通えているようです。
GW明けくらいから家の周りの田んぼでは田植えが始まり、その苗も少しずつ大きくなってきました。
(すでに暑いですが)これから暑くなっていきそうですね!
先月、社内のグループ会や部会で、
「ChatGPTを使ってる?どんなふうに使ってる?」
というテーマで話し合う機会がありました。
ちょっとした資料のたたきに使ってる、とか
知らない技術用語のざっくりとした理解につかってる・・とか、
仮想のヤンデレキャラを設定して遊んでる!・・とか(笑)
皆さんいろいろな使い方をされているようでした。
ChatGPTに関しては、以前TechBlogで「AIチャット「ChatGPT」で「エス・エー・エス株式会社」のことを聞いてみた(https://www.wantedly.com/companies/sas-com/post_articles/485334)」という記事を書きましたが、今日はより実用的な使い方を知りましたので、ここで共有したいかなと思います。
【ChatGPTの使い方は2通り】
ChatGPTの使い方は2通りあります。
パターンA:ブラウザを立ち上げてChatGPTのページにいって、ログインして直接ChatGPTを使うこと。
パターンB:別のサービスやアプリケーションからChatGPTを呼び出して使うこと。
今回はパターンBの話をしていきたいと思います。
パターンBのような使い方を一般的には「API」と呼びます。
(一応パターンAの使い方でも内部的にはAPIを呼んで処理しているとは思うのですが、目的とするサービスの「外」から呼び出すことを一般的にはAPIと呼びます。)
パターンAの使い方は、あなた自身が主体的、能動的にアクセスしなくてはなりません。
ところがパターンBはあなた自身が呼び出す必要はありません。
また、パターンBは呼び出すサービス元の「機能を絡めて」使うことができます。つまりできることの幅が広がります。
例えば、
「予定表サービス」などと組み合わせると、
「(あなた自身が手動で行わなくても)毎朝決まった時間にChatGPTに問い合わせる」
なんてことができます。
また
「メール送信サービス」などと組み合わせると
「(あなた自身が手動で行わなくても)ChatGPTに問い合わせた結果を指定のメールアドレスに送る」
なんてことができます。
あなたが手動でやらなくても実現できることが増えるというのが、API呼び出しのメリットです。
【認証のシチュエーションを考えてみる】
とはいえ、ChatGPTは認証されたユーザでないと使えません。だから皆さんがChatGPT利用する時は最初にアカウントを登録しますよね。
パターンAの使い方の場合は、事前に登録したユーザ情報(メールアドレスやパスワード+電話番号認証(ありましたよね?))で認証をクリアすることで、ChatGPTを使うことができます。
ではパターンBの場合はどうなるのでしょうか・・?
パターンBの認証は、パターンAの情報に加えて、「APIキー」というモノが必要になります。
正確には、パターンAの情報でログインして、APIキーを発行します。
【毎朝、ChatGPTから「今日も一日がんばってね!」という応援メールをもらうには?】
ChatGPTの呼び出し方とそれぞれの認証方式を簡単にまとめたところで、いよいよ実装してみましょう。
今回の目標は、
「毎朝、ChatGPTから「今日も一日がんばってね!」という応援メールをもらう」
です。
この文章にはChatGPT以外にキーワードが2つあります。
「毎朝」と「メール」です。
つまり、
「別の予定表サービス」を使って、「毎朝」を認識してChatGPTに問い合わせる。
「別のメールサービス」を使って、ChatGPTから来た「がんばってね!」的な言葉を指定のメールに届ける。
これらをパターンBの呼び出し方で実装していきたいと思います。
やりたいことは何となくイメージできましたでしょうか・・?
そして、これらを実現する外部サービスを考えます。
どうもネットでググってみると、よく出てくるのが「Google Apps Script(GAS)」でした。
このGASの中には処理を書くことができて、その処理を「トリガー」という機能で定期的に呼び出すことができます。ちなみに私はGASは使ったことはなく、今回初めて知りました。
処理にはGmailと連携する記載もできるのでそれで書いてみます。
つまり、
「GAS(トリガー)」から「ChatGPT」をパターンBの方式で呼び出し、その結果を「GAS(Gmail)」で届けるという機能です。
なお、以下2点は前提とします。
・パターンAのやり方でChatGPTが利用できること(ChatGPTへログインできること)
・Googleアカウント(Gmailアドレス)があること
【手順1】APIキーの作成
パターンBの呼び出し方で必ず必要なのが「APIキー」です。
これは以下の手順で作ることができます。
https://platform.openai.com/account/api-keys にアクセス(必要であればログイン)
そうすると以下の画面になりますので、ここで「Create new secret key」をクリックします。
適当な名前を入れます。
【超重要!!】ここでシークレットキーが表示されます。これはこの時一度限りしか表示されないので、コピーのアイコンでコピーして、ローカルのどこかに一時的に貼り付けておいてください。(決して外部に公開しないように!)
以下のように新しく作成していられたら完成です。APIキーの作成はここまでです。
【手順2】Google Apps Scriptsの事前準備
https://script.google.com/home/my にアクセスします。最初にブラウザでGoogleログインしていたほうが楽です。ログインしていない場合は、以下画面になるので「Start Scripting」をクリック。その後Googleログインダイアログが表示されるのでログインします。(他にもGoogleDriveから辿り着く方法もありみたいです。)
いずれにしても以下の画面(Apps Script)に遷移すれば大丈夫です。ここで「新しいプロジェクト」を作りましょう。
まずこの「無題のプロジェクト」となっている場所に名前を付けましょう。
新しいプロジェクトができましたね。
これで、Google Apps Scriptの事前準備は終わりです。
【手順3】Google Apps Scriptでスクリプトを書いていく
ここまで出来たら、スクリプトを書いていきましょう。
といってもゼロから書くのは大変ですので、私の記載した以下のスクリプトをコピペしてください。このまま使えるはずです。(私もゼロから作成したわけではなく、いくつかのサンプルコードを参考にさせていただき作成していきました。)
function request_quiz_to_ChatGPT() {
//OpenAIのAPIキー(スクリプトプロパティから取得)
const apiKey = PropertiesService.getScriptProperties().getProperty('APIKEY');
//ChatGPTのAPIのエンドポイントを設定(スクリプトプロパティから取得)
const apiUrl = PropertiesService.getScriptProperties().getProperty('ENDPOINT_URL');
//ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
const messages = [{'role': 'user', 'content': 'チャットさんおはようございます!今日一日頑張れるような応援メッセージを50文字くらいでお願いします。'}];
//OpenAIのAPIリクエストに必要なヘッダー情報を設定(https://platform.openai.com/docs/api-reference/making-requests の「Making requests」を参照!)
const headers = {
'Authorization':'Bearer '+ apiKey,
'Content-type': 'application/json'
};
//ChatGPTモデルやトークン上限、プロンプトをオプションに設定(GASではCurlコマンドではなく、「UrlFetchApp.fetch」関数を使うみたい(https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja、https://zenn.dev/shikumiya_hata/books/33f44d4f561ec4/viewer/51230)
const options = {
'muteHttpExceptions' : true, //必須ではないかも
'headers': headers, //必須
'method': 'POST', //必須
'payload': JSON.stringify({ //以下の各項目をJSON文字列に変換
'model': 'gpt-3.5-turbo', //利用するChatGPTエンジン
'max_tokens' : 1024, //利用するトークンの上限
'temperature' : 0.9, //返答の自然度
'messages': messages}) //ChatGPTに送信する問い合わせメッセージ
};
//OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納(apiURLとoptionsを使っている)
const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
//ChatGPTのAPIレスポンスをログ出力(変数.choices[0].message.contentで取り出せる。console.logに出したくなければ不要。)
console.log(response.choices[0].message.content);
// ここからメールを送信する処理
// 送信先メールアドレス(スクリプトプロパティから取得)
const recipient = PropertiesService.getScriptProperties().getProperty('SEND_EMAIL_ADDRESS');
// メールのタイトルのために年月日を取得(任意)
const today = new Date();
const today_year = today.getFullYear() ;
const today_month = today.getMonth() + 1 ;
const today_date = today.getDate() ;
const today_day = today.getDay() ;
const dayArray = ["日","月","火","水","木","金","土"]; //曜日の配列
// メールタイトル設定(XXXX年〇〇月△△日 月曜日 ChatGPTからの今日の元気な一言!! と表示したい)
const subject = today_year + "年" + today_month + "月" + today_date + "日 " + dayArray[today_day] + "曜日" + " ChatGPTからの今日の元気な一言!!" ;
// メール本文。ChatGPTからの返信は、変数.choices[0].message.contentで取り出せる。
const body = response.choices[0].message.content;
// メール送信
GmailApp.sendEmail(recipient, subject, body);
}
このスクリプトを書いて、保存します。保存は画面上部のフロッピーディスク(古い)みたいなアイコンで保存できます。
スクリプトはここまでです!
【手順4】環境変数を定義していく!
スクリプトの中の変数「APIKEY
」「ENDPOINT_URL
」「SEND_EMAIL_ADDRESS
」については、「PropertiesService.getScriptProperties().getProperty
」という関数で呼び出しています。
これは、GASの中にある環境変数リスト(スクリプトプロパティ)から呼び出せます。
スクリプトプロパティを使うメリットはたくさんありますが、特にここではAPIキーの存在がデカいです。
先述のように発行されたAPIキー(APIの秘密鍵のこと)は、厳重に管理しなくてはなりません。
それを上記のようなスクリプトに直接定義したり、記載してしまうと、いろいろやりにくいです。
APIキーを含んだスクリプトを外部公開してしまうと、見知らぬ誰かに利用されてしまう恐れがあります。
ChatGPTのAPIは、無料枠の範囲で使うことはできるものの、見知らぬ誰かに無尽蔵にAPIを叩かれたら
たまったものではありません。
ですので、環境変数リストで別管理していきましょう。やり方は簡単で、画面左側のギアマークから、「プロジェクトの設定」をクリックしましょう。
そして画面下部のスクリプトプロパティの部分で、それぞれのプロパティ名と、対応する値を入力していきます。
APIKEY:手順1で取得したAPIキーの秘密鍵フレーズを入れる
ENDPOINT_URL:「https://api.openai.com/v1/chat/completions」と入力。(しばらくはこれでいいはずです)
SEND_EMAIL_ADDRESS:送信先のメールアドレスを入力
こんな感じです。
これで、環境変数の定義は終わりです。
【手順5】いよいよ実施してみよう!
ここまでできると作成したスクリプトの動作確認をすることができます。トリガーで定期実行させる前にまずは手動で実行してみましょう。
実行は簡単で、画面上部の「実行」を押下するだけです。
初回のみ、承認が必要です。以下のように、それぞれ「権限を確認」「許可」を押下していきます。(途中で赤い△マークの警告が出てくることがありますが、そちらも「詳細」→「安全ではないページに移動をクリックしてください。自分自身のオリジナルアプリなので、Googleによる正式な確認がされていないために出てくるようです。)
さて、実行結果として画面下部に以下のように表示されましたでしょうか?私の場合は、「朝から元気にスタート!自分に自信を持って、一歩ずつ前進しましょう。今日はきっと素晴らしい一日になりますよ。頑張って!
」と応援メッセージを頂きました。
そして、このメッセージを受信するGmailのほうも見てみましょう。ちゃんと思った通りのタイトル文言と、先ほどの応援メッセージが来ていることがわかりますね!
【手順6】最後にスケジュール実行してみよう
手動実行がうまくいったら、最後は「トリガー」機能をつかって定期実行させてみましょう。「毎朝」にすると明日の朝まで待たないといけないので、とりあえず1分おきに動くようにしてみましょう。
トリガーの設定は、画面左の時計マークを選択して「トリガー」をクリックします。
画面右下の「トリガーを追加」をクリックすると、以下のような設定画面がでます。
ここで、実行する関数や、実行間隔を設定するだけです。たぶん感覚的に設定できるかなと思います。
こんな風に、トリガーが追加されたら完了です。しばらく待つと、「前回の実行」等に時刻が記載されていきます。
画面左側の「実行数」という部分をクリックすると、以下のように実行数が出力されます。「エディタ」となっているのは手動実行、「時間主導型」となっているのが先ほど設定した「トリガー」からの実行です。ちゃんと1分おきに実行されていますね。
Gmailのほうにもちゃんと1分おきにきていますね!それぞれ別の文言でChatGPTからの応援メッセージが来ています。
あとはこれを毎朝設定にすればいいだけですね。(方法は省略します!)
トリガーに関しては「無効化」という考え方はないようなので(あったらすみません)、短期間に連発するようなトリガーを作成していて不要になった場合は、「削除」をしておきましょう。
これですべての手順は完了です!スクリプトをゼロから作るのは大変ですが、コピペすればここまでの処理はそれほど難しくなく実施できると思います!ぜひチャレンジしてください!
【おまけ】たとえばいろんな使い方
上記のように、「ChatGPT」+「GoogleAppsScrips」+「Gmail」+「トリガー」を組み合わせて、ChatGPTとの会話を定期的に実施することが可能となります。
スクリプトの中の以下の部分を好きな質問文に変えることで、GASからChatGPTに向かっていろんな質問をAPIとして投げて、その結果をメールで受け取れます。
const messages = [{'role': 'user', 'content': 'チャットさんおはようございます!今日一日頑張れるような応援メッセージを50文字くらいでお願いします。'}];
いろんな使い方が想定されると思いますが、例えばこんな使い方!
1.英会話でよく使われるフレーズを一つ教えてください。解説は英語(English)と日本語(Japanese)の両方で表示してください。
2.AWS Certified CloudPractitionerの試験問題を一つ作成してください。 問題:200文字以内 選択肢:多肢選択式、回答は100文字以下の文章 また、正解・不正解の選択肢の理由をそれぞれ簡潔に示してください。
これらをトリガーすれば、毎朝とか、1時間おきとかに練習問題や気になるフレーズを覚えたりできますね!いろいろ試してみると面白いかと思います!もちろん、おすすめパン屋さんをでっちあげてくれたの「チャットさん」(https://note.com/koguma_gunso/n/na300a4677473 参照)なので回答の真偽はちゃんと確認する必要があります(笑) でも、技術系の回答に関してはだいたい大丈夫かな・・という印象です。
注意点としては、ChatGPT_APIには無料で使える枠には期限と限りがあります。APIキーを作成した画面の「Usage」という部分で詳細を確認することができます。私のここまでの使い方では全然問題ない感じですね。
長くなってしまいましたが、初めて使ったGASでいろいろ学ぶことができました!いろんなサイト参考にさせていただきました。一部を紹介させていただきます。最後まで読んで下さってありがとうございました。
【【GAS】Gmailでメールを送信するには?】
【GASでChatGPTのAPIリクエスト方法!文脈に沿った応答のサンプルコードを解説】
https://auto-worker.com/blog/?p=7438
【OPEN AI API Reference】
https://platform.openai.com/docs/api-reference
【GoogleAppsScrips Class UrlFetchApp リファレンス】