はじめに
こんにちは。アプリケーションチームの栗田です。
外部サービスから Webhook などのリクエストを受信して何か処理させたいとき、一からサーバーを構築するのは大変ですよね。
この記事では Google Apps Script(GAS)で WebAPI を公開し、リクエストを処理する方法を紹介します。
今回は cURL コマンドで POST リクエストを GAS に送信して、リクエストの値を Chatwork にメッセージ通知してみたいと思います。
事前準備
以下を使いますので、お持ちでない場合は準備しておきましょう。
GAS で WebAPI を公開する
Google スクリプトエディタを開き、新しいプロジェクトを作成する
Google ドライブを開き、[+新規]>[その他]>[Google Apps Script]を選択します。
ファイル名が「無題のプロジェクト」になっていますので、適当に変更しておきます。
「無題のプロジェクト」をクリックすると変更できます。(今回は、"WebAPI_Sample" としました)
doPost 関数を作成する
POST リクエストを受け取るために、doPost 関数を実装します。
(GET を受け取りたい場合は、doGet 関数で実装できます)
POST リクエストでは、シンプルに {"content": "こんにちは!\nテストです!"}
という JSON データを送信することにします。
メニューから[エディタ]>[コード.gs]を選択して、以下のサンプルソースを貼り付けてください。
ファイル名は変更していただいて構いません。
function doPost(e){ // データ取得 const data = JSON.parse(e.postData.contents); const content = data.content; // プロパティスクリプトから値を取得 const properties = PropertiesService.getScriptProperties(); const token = properties.getProperty("CHATWORK_APITOKEN"); const room_id = properties.getProperty("CHATWORK_ROOM_ID"); // Chatworkにチャット通知 const message = content; const client = ChatWorkClient.factory({token: token}); client.sendMessage({ room_id: room_id, body: message, self_unread: "1" //自分が通知に気づきたい場合のみ設定する }); }
PropertiesService
や ChatWorkClient
を利用していますが、後ほど設定しますのでスルーしてください。
プロパティサービスに秘密情報を保存する
パスワードや API キーなどの秘密情報はコードに直書きするのは避けたいですよね。プロパティサービスを利用しましょう。メニューの[歯車(プロジェクトの設定)]>[スクリプト プロパティ]から設定できます。
ここでは、Chatwork の API トークンとルーム ID を保存しています。環境に合わせて設定してください。
ルーム ID を定義しておくと、デプロイ不要で値を変更できるので便利です。
プロパティ | 値 |
---|---|
CHATWORK_APITOKEN | Chatwork の API トークンを入力 |
CHATWORK_ROOM_ID | Chatwork で通知したいルーム ID *1 を入力 |
ライブラリに「ChatworkClient」を追加する
Chatwork へメッセージ送信するのに便利なライブラリがありますので利用しましょう。メニューの[エディタ]>[ライブラリ]>[+ボタン]から設定できます。
以下の ID で検索して追加してください。
入力項目 | 値 |
---|---|
スクリプト ID | 1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav |
スクリプトを「ウェブアプリ」として公開する
デプロイすると、WebAPI として公開できます。 画面上部の[デプロイ]>[新しいデプロイ]を選択します。
「歯車(種類の選択)」から「ウェブアプリ」を選択します。
画面には、以下の通り入力します。 特に「アクセスできるユーザー」は「全員」を選択するようにしてください。
入力項目 | 値 |
---|---|
説明 | 任意で構いません。(例:POST リクエストを受け取るサンプルです) |
ウェブアプリ - 次のユーザーとして実行 | 自分 |
ウェブアプリ - アクセスできるユーザー | 全員 |
アクセスの許可を聞かれるので承認します。
ログインしている Google アカウントを選択します。
(GAS の名称を英語にしたからか、表示内容が英語になっていますが気にしないでください)
続けて、承認しましょう。 [詳細(Advanced)]をクリックして、一番下のリンクをクリックします。
[許可(Allow)]をクリックすると、デプロイ完了です!
表示されているウェブアプリ URL(https://script.google.com/macros/s/xxxxxxxxxxx/exec
)に POST リクエストすると、Chatwork へ通知してくれます。
ウェブアプリ URL は後ほど利用するのでコピーしておきましょう。
(コピーし忘れた場合は、画面上部の[デプロイ]>[デプロイを管理]からコピーできます)
cURLでPOSTリクエストを送信する
GAS が正しく動作するか cURL で POST リクエストを送信してみましょう。
cURL コマンドを実行して POST リクエストを送信する
ターミナルを開き、以下のコマンドを実行します。
https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxx/exec
の部分は、コピーしておいたウェブアプリ URL に置き換えてください。
curl --header "Content-Type: application/json" \ --request POST \ --data '{"content": "こんにちは!\nテストです!"}' \ https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxx/exec
ちゃんと通知されましたね!
注意事項
Google Apps Script、Chatwork にはサービスクォータ(制限)があります。 安定稼働が必要なサービスで利用される際はご注意ください。
終わりに
Google Apps Script(GAS)を利用することで、無料でお手軽にリクエストの受信環境をすぐに構築することができます。
今回は cURL を利用した Chatwork 通知でしたが、 SaaS 製品の Webhook イベントを処理したり、Google スプレッドシートにデータ追加したり、もちろん Chatwork 以外のチャットサービスにも通知できます。ぜひ活用してみてください!
*1:ルーム ID はグループチャット URL 末尾の数字と同様の番号です。(例:/#!ridxxxx の「xxxx」の数字)