こんにちは、最近プログラミングの案件をとろうと躍起になっているYuiです。
追記:案件受注しています!
はい、おしゃべりマンの言う通りですね。これに関しては私が頑張るのみなので、引き続き勉強します。笑
案件取れたら経験ゼロで案件取れたという記事を書きたいので頑張るぞ~~!
まあ、こんな私の決意表明は置いといて、今回はLineBotのコードの解説をしながら、Google Apps Script(以下GAS)の機能について説明したいと思います。
前回のGASでのLineBotの作り方の記事で使ったコードを解説しながら進めていきます。
コードの意味を理解しよう
まずは前回書いた繰り返しLineBotのコードの意味を理解しましょう。
下記のようなコードを書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var CHANNEL_ACCESS_TOKEN = 'あなたのアクセストークン'; function doPost(e) { // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; // 応答用Tokenを取得 var reply_token= JSON.parse(e.postData.contents).events[0].replyToken; //ついでにエラー処理 if (typeof reply_token === 'undefined') { return; } // 応答メッセージ用のAPI URL var line_url = 'https://api.line.me/v2/bot/message/reply'; UrlFetchApp.fetch(line_url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': userMessage, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } |
まず、最初の部分ですが、Web上でアクセスを受け取ったときにコードの中身を表示させてあげる場合ならGETメソッドなので、function doGet()と書くべきなのですが、LINE Messaging APIは、POSTメソッドでデータを送ってくるのでdoGetではなくdoPostを使います。
その中に実際の動きとなるコードを書いてあげるのですが、LineBotが実際に働くまでの流れをまとめると、下記のようになります。
1、ユーザーからのメッセージを取得
2、そのメッセージをJSONでパースして変数userMessageを宣言
3、応答用のトークンをJSONでパースして変数reply_tokenを宣言
4、LineBotを動かすためのAPIに対応したURLを変数line_urlとして宣言
5、LineBotAPIの動く範囲の中でコードを書いて実装する
今回はJavaScriptで書いてあることもあって、JSONを利用してデータの受け渡しをしてあげているというわけです。
GASでのAPIの導入方法
さて、次に気になるのが4のAPIの導入方法ですね。どこでAPIを導入させてあげているのでしょうか。
GASではAPIの導入のためにgemfileをいじる必要はありません。
各APIに対応したURLを定義してあげて、それをコードの中に組み入れてあげれば簡単に実装できます!
これはどういうことかというと、上記コードの中のこの部分でAPIを定義してあげています。
var line_url = ‘https://api.line.me/v2/bot/message/reply’;
そしてどこで使っているのかというと、ここです。
UrlFetchApp.fetch(line_url, {
これがまさにGASの便利なところなのですが、GASでは外部のサイトにアクセスする処理として「UrlFetchApp」というオブジェクトが用意されています。
そうすることで、普通は外部のWebサイト(今回だとAPI)から情報を得る場合、まずはダウンロードをして、そのデータにアクセスする処理を書かなければいけませんが、GASではその必要はありません。
このオブジェクトはいろいろな使い方があるのですが、今回はfetchというメソッドを呼び出して、LineMessagingAPIにアクセスしてあげています。
UrlFetchApp.fetch(URL)
この引数に、アクセス先となるURLを指定するだけで、そこにアクセスしてサーバーからデータを取り出すことができる。
実はそのあとの見慣れない’headers’や’method’なども、GAS側で用意してくれている便利な機能を使ってあげているんですね。
GASのオブジェクトを使いこなそう(応用編)
先ほど、UrlFetchApp.fetch(URL)でアクセス先を指定するだけで簡単に外部のサイトにアクセスできると書きましたが、実はさらに便利な機能があるのです。
じつは第2引数に必要な情報をオプションとして用意することができるんです。
UrlFetchApp.fetch(URL, ここにオプション)
オプションを指定してあげることで、外部サイトにアクセスする際の動きをより細かく指定することができます。
具体的に見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
UrlFetchApp.fetch(line_url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': userMessage, }], }), }); |
まず、今回のように外部のAPIにアクセスする際は、情報をヘッダ情報として送り、サーバーとやり取りをすることが必要です。(これが‘headers’部分)
そのために必要な情報を連想配列としてまとめた上で、‘Content-Type’のところではJSONを使うことを宣言して、文字化けしないようにUTF-8に指定しています。
また、実はまだアクセストークンを認証させていませんでした(最初のvar~~の部分では、変数として定義しただけ)ので、‘Authorization’の部分で認証させてあげています。
そのあとに、‘method’でメソッドの種類を(今回だとPOST型なので’post’)、‘payload’で同時に送信する情報を入力しているのですが、JavaScriptの値を JSONに変換する必要があるので、ここではJSON.stringifyメソッドを使っています。
以下、まとめます。
・UrlFetchApp.fetch(URL, ここにオプション)で簡単に外部のURLにアクセスして、さらにオプションを指定することで、どのようにアクセスしたいかを指定することが出来る。
・GASのオプションを使うとより簡単にコードを書ける。
・‘headers’でヘッダ情報を詳しく指定
・‘Content-Type’でコンテンツの種類を指定
・‘Authorization’でアクセストークンを認定させる
・‘method’でメソッドの種類を指定
・‘payload’で同時に送信する情報を指定
いかがでしょうか?
GASの機能を使ったら色々出来そうですね!
また、GASが用意しているオブジェクトとオプションは他にもたくさんあるので、ぜひ調べてみてください!