こんにちは!
iimonでフロントエンドエンジニアを担当しているたくふぉんです!
だんだんとクリスマスが近づいてきましたね🎄🎅⭐️
本記事はアドベントカレンダー17日目の記事になります。
はじめに・やりたいこと
世の中には無料で便利に使える様々なAPIが存在しますが、そんなAPIを自在に操ることができるエンジニア像に何とはなしに憧憬の念を抱いており(?)、APIを使って自分でも何かツールを作ってみたいと思っていました。
そこで今回は、APIに触れる良い機会だと思いましたのでGAS(Google Apps Script)をベースに、OpenWeatherMapAPIとLINE Messaging API を利用して、WeatherAPIから取得した天気情報をMessaging API経由でLINEに通知させる簡単なスクリプトを作成してみました。
APIを利用するにあたっての準備
さて、今回利用する2つのAPIですが、ざっくり以下の準備が必要となります。
・LINEチャネルアクセストークンの発行
・LINEユーザIDの取得
・OpenWeatherMapAPIキーの発行
Messaging APIの設定準備
手順が地味にややこしかったLINE Messaging APIの諸々準備から見ていきましょう。
Messaging APIを利用するには、LINE公式アカウントを作成し、本APIの利用を有効にした上で、LINE Developerコンソールからチャネルを設定する必要があります(最終的にこの設定した公式アカウントから通知メッセージが届くようになります。要するにここで言う公式アカウント=BOTのことです)。
LINE公式アカウント作成のために、まずLINE Businessアカウントを作成する必要があるので以下から作成します。
続いて、 https://entry.line.biz/form/entry/unverifiedからLINE公式アカウントを作成しましょう。アカウント名は、LINE通知メッセージを送信してくれるBOT名になります。
作成できるとLINE Official Account Manager画面に遷移するかと思いますので、そのまま「設定」>「Messaging API」と進み、「Messaging APIを利用する」ボタンを選択して必要な情報を入力、OKを押せばMessaging APIを使えるようになります。
参考 qiita.com
これによりLINE Developers consoleにチャネルが作成されているかと思いますので、チャネル基本設定から確認できるユーザーIDを控えておきましょう(Messaging APIを叩く際に必要となります)。
続いてMessaging API設定の下部にあるチャネルアクセストークン(長期)から発行ボタンを押してトークンを発行しましょう。こちらもGASからAPIを叩く際に必要となるので控えておいてください。
・・以上でMessaging APIを利用するための準備は完了です。あちこち登録・設定する必要があり、私はだいぶよく分からず苦戦しました。。
以前はLINE DevelopersコンソールからそのままMessaging APIの設定ができたようですが、2024年9月4日よりLINE Official Account Manager経由で公式アカウント(BOT)の作成が必要となるなど手順が色々と追加されたようです(このあたり新旧の情報が混在しており混乱しました)。。
OpenWeatherMapAPIの設定準備
続いて、OpenWeatherAPIの設定を進めていきましょう。こちらの方は公式サイトからアカウントを作成し、APIキーを取得するだけなので簡単です。
今回登録する無償版では、60回/分、100万回/月のAPI呼び出し制限がありますが、個人利用の範疇では十分でしょう。
OpenWeatherMap公式サイトからアカウントを作成します。
登録したメールアドレスからアカウントを有効化した後、ログインして右上のアカウントメニューからMy API Keys > API keysと進み、以下のKeyを確認、控えておいてください。
以上で今回の処理に必要な情報は準備できたので、次項から早速GASでスクリプトを作成していきます。
GASでスクリプトを組む
まず、発行したトークン類を管理するための設定を進めていきます。
Googleスプレッドシートを開き、拡張機能 > Apps Scriptを選択します。
プロジェクトの設定を開き、以下のように発行しておいたLINEチャネルアクセストークン、LINEユーザID、OpenWeatherAPIキーをそれぞれ設定します。
GASのソースコード上にトークン類を直接書いても動作はしますが、セキュリティ的観点からこちらで管理しておくのがよいでしょう。
こちらで設定したプロパティ値は、スクリプト上から
PropertiesService.getScriptProperties().getProperty(設定したプロパティ名)
とすることで参照できます。
以下は、今回作成したスクリプトの全容です。
const LINE_CHANNEL_TOKEN = PropertiesService.getScriptProperties().getProperty('LINE_CHANNEL_TOKEN') const LINE_USER_ID = PropertiesService.getScriptProperties().getProperty('LINE_USER_ID') const OPENWEATHER_API_KEY = PropertiesService.getScriptProperties().getProperty('OPENWEATHER_API_KEY') // 気象情報を取得しLINEに通知 function main() { const message = getWeather(); pushMessageToLine(message) } // OpenWeatherMapAPIから今日の気象情報取得 function getWeather() { try { const response = UrlFetchApp.fetch(`https://api.openweathermap.org/data/2.5/weather?q=Tokyo&units=metric&appid=${OPENWEATHER_API_KEY}&lang=ja`); const weatherData = JSON.parse(response.getContentText()); // 地点情報抽出 const location = weatherData.name; // 天気情報抽出 const weatherEn = weatherData.weather[0].main; // 天気詳細抽出 const weatherDescription = weatherData.weather[0].description; // 表記変換 let weatherJa; switch (weatherEn) { case 'Thunderstorm': weatherJa = '雷雨⛈️' break; case 'Drizzle': weatherJa = '小雨☂️' break; case 'Rain': weatherJa = '雨☔️' break; case 'Snow': weatherJa = '雪⛄️' break; case 'Clear': weatherJa = '晴れ☀️' break; case 'Clouds': weatherJa = '曇り☁️' break; default: weatherJa = weatherEn; } // 最高気温情報抽出 const maxTemp = weatherData.main.temp_max; // 最低気温情報抽出 const minTemp = weatherData.main.temp_min; // LINE通知用メッセージ成形 let message = ''; message += `おはようございます!!本日の${location}の気象情報です😘😘😘\n`; message += `天気:${weatherJa}(${weatherDescription})\n`; message += `最高気温:${maxTemp}℃\n`; message += `最低気温:${minTemp}℃\n`; message += `今日も1日頑張りましょう(⌒,_ゝ⌒)` return message; } catch (e) { Logger.log('エラーが発生しました', e.message); } } // LINEの指定ユーザに引数messageを送信 function pushMessageToLine(message) { try { const options = { "method": "post", "headers": { "Content-Type": "application/json", "Authorization": `Bearer ${LINE_CHANNEL_TOKEN}` }, "payload": JSON.stringify({ "to": LINE_USER_ID, "messages": [{ "type": "text", "text": message, }] }) }; UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); } catch (e) { Logger.log('エラーが発生しました', e.message); } }
getWeather()
の
UrlFetchApp.fetch(
https://api.openweathermap.org/data/2.5/weather?q=Tokyo&units=metric&appid=${OPENWEATHER_API_KEY}&lang=ja
);
でWeatherAPIにリクエストを飛ばしています。とりあえず今回は天気取得地点としてTokyoを指定し(かなりざっくりですが。。)、appidにはWeatherAPIキーを指定します。
ここで得られるレスポンス内容は以下のようになっています。
ひとまず地点情報と天候、最高気温、最低気温を抽出してmessageに格納しています。このmessageがそのままLINEに通知されるメッセージとなります。
そしてpushMessageToLine()で
チャネルアクセストークンと送信先のユーザID(今回は筆者のLINEアカウント)、先ほど成形したmessageを格納して
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options);
とすることで・・・
しっかりLINEに通知が飛んできていますね!
BOT名も公式アカウント作成時に設定した名称になっています。
リクエスト概要 Messaging APIリファレンス | LINE Developers
とりあえずやりたい処理は書けたので、次は毎日定期的に本処理を自動で実行、通知させるようにします。
このようにトリガーを設定することで、指定した時間内で自動でスクリプトが実行されるようになります。
まとめ
今までGASは触ったことがなかったので、このような使い方もできるのかとなかなか面白かったです。
今回作成したスクリプトは改善の余地が多分にあるので更にブラッシュアップしたり、他にも様々なAPIを組み合わせて何かしらのツールを作ってみたくなりました(この辺りの仕様を考えるのも楽しいものですね)。
また、今回OpenWeatherAPIで取得したのは気象情報ですが、これ以外にも特定地点の大気汚染度合いを取得できたり、過去45年間分の太陽光発電量?を取得できるAPIも提供されていたりと、なかなか開拓の余地がありそうです。
ここまでお読みいただき、ありがとうございます。
弊社ではエンジニアを募集しております。
この記事を読んで少しでも興味を持ってくださった方は、ぜひカジュアル面談でお話ししましょう!
下記リンクよりご応募お待ちしております!
iimon採用サイト / Wantedly / Green
次のアドベントカレンダーはhayashiさんの記事になります!どんな記事が発表されるのか乞うご期待!
参考
Current weather data - OpenWeatherMap
LINE Official Account ManagerからMessaging APIを有効化する #linebot - Qiita
【LINE Messaging API × GAS】理想の彼女botを作った
【OpenWeatherAPI】リクエスト・レスポンスの項目に関するメモ書き #OpenWeatherAPI - Qiita
スプレッドシートで天気を自動取得!OpenWeatherMap APIの設定方法 | 合同会社橋爪オフィス