GASによるHTTPリクエスト(GET/POST)方法を解説!UrlFetchAppクラスでフェッチ

Google Apps Script(GAS)ではスクレイピングでのWebサイト情報取得や、他のサービスとAPI通信するためにHTTP(HTTPS)リクエストを行う必要があります。

今回httpのGETやPOSTの通信や暗号化したhttpsリクエストをGASで実行する方法をまとめて解説します。

Google Apps ScriptでWebサイトの情報取得

Google Apps Script(GAS)はWebサイトのスクレイピング用途で用いられるケースが多いです。

スクレイピングとは、Webサイトの情報を取得し、その中から必要とする情報を抽出し、データとして保存することです。

GASはサーバーレスで一定間隔と特定の時間帯に実行できることに加え、データを保存するスプレッドシートとの親和性が高いため、スクレイピングに適しています。

GASによるスクレイピング方法の解説記事↓

GASでスクレイピングする方法!Parserライブラリを利用した手順を解説

スクレイピングをする際には、まずWebサイト(http://****.com)に対し、HTTPリクエストを行いHTML情報の取得が必要です。

HTTPリクエストはGASのAPI利用でも

また、HTTPリクエストはGoogle Apps Script(GAS)において、他のサービスのAPIを利用する際にも必要になってきます。

API通信のほとんどはHTTPリクエストを通じて、API利用するサービスと情報のやり取りを行います。

サービス連携に欠かせないAPI

天気情報を取得するOpen Weather MapやGoogleの機械学習サービスもAPIで利用する仕組みです。

こうしたサービスとAPIでやり取りする際には、APIのルールに従いHTTPリクエストを行って、サービスから情報を取得したり、サービスに送ったりします。

HTTPリクエストは大きく3種類

GASのスクレイピングやAPI通信で用いられるHTTPリクエストは大きく3種類あります。

  1. HTTP GETリクエスト(パラメータなし)
  2. HTTP GETリクエスト(パラメータあり)
  3. HTTP POST

①HTTP GET(パラメータなし)とは

HTTP GETリクエスト(パラメータなし)は、普段Webページを見る際に最もよく使っているHTTPリクエストです。

例えば、このブログ(https://auto-worker.com/blog)のページを取得するために、ブラウザのアドレスバーにURLを打ち込み、エンターキーを押すと、HTTP GETがリクエストされます。

HTTP GETリクエストは、ブラウザでWebページを表示する際に実行されている

サーバーから情報を取得する際に用いられ、スクレイピングなどではこのHTTP GETリクエストが行われます。

②HTTP GET(パラメータあり)とは

HTTP GETリクエスト(パラメータなし)は、先程のHTTP GETのリクエストにパラメータを追加したものです。

例えば、このブログのスクレイピング解説記事(https://auto-worker.com/blog/?p=2460)にアクセスする場合に、「?p=2460」とついているのがパラメータです。

これは「pというパラメータに2460を指定」してHTTP GETのリクエストすることで、そのパラメータの数値・要素に応じた情報をサーバーは返します。

ECサイトなどでは商品検索結果のページがパラメータ付きのURLなので、検索結果ページをスクレイピングしたい場合に、HTTP GETでパラメータ付きでリクエストします。

その他にも、API通信を行う場合に、そのAPIが正しいものか確認する要素としてAPIキーをパラメータに付けて、HTTP GETが行われることがあります。

HTTP GETリクエストを受け取ったサーバーはAPIキーが登録済みのものかチェックします。

登録されている場合はリクエストに応じた正常な結果を返し、登録されていない場合はエラーを返すことで、リクエスト元の身元確認が可能です。

③HTTP POSTとは

3つ目のHTTP POSTは、HTTP GETとは少し性質が異なる通信です。

HTTP GETは「サーバーから情報を取得する」ことが目的のHTTPリクエストでした。

それに対し、HTTP POSTは「サーバーに情報を送る」ことが目的となっています。

サーバーに情報をおくるために、ペイロード(payload)と呼ばれる情報を付加してサーバーにリクエストを送ることで、サーバーが情報を受け取ることができます。

2番目のパラメータ付きのHTTP GETもパラメータを送ることできるので、何が違うのでしょうか?

HTTP GETではパラメータとして数値または文字列しか送ることができません。

それに対し、HTTP POSTは画像やファイルなどのデータもペイロードの中に格納して送ることが可能なのが大きな相違点です。

また、数値や文字列のやり取りでも扱う情報が増えると、HTTP GETで送るとリクエストURLが長くなるため、HTTP POSTを使うケースもあります。

API通信でサーバー側に情報を送る場合にHTTP POSTが用いられます。

ワードプレスのAPIでは、ブログ記事のタイトルや本文を送ることで、記事の自動投稿ができます。

このようにHTTPリクエストはGET(パラメータなし)、GET(パラメータあり)、POSTの3つを利用します。

GASのHTTPリクエスト方法はUrlFetchApp

Google Apps Script(GAS)で各種のHTTPリクエストを行うために、UrlFetchAppと呼ばれるクラスが用意されています。

このUrlFetchAppというクラスにあるfetchメソッドを使い、引数に指定したURLに対してHTTPリクエストが可能です。

UrlFetchApp.fetch(“HTTPリクエストしたいURL”)

このメソッドを実行すると、URLに対しHTTPリクエストが実行され、サーバーからの応答が戻り値として取得できます。

HTTPSの場合もhttpと同様

これまでHTTPリクエストについて紹介してきましたが、HTTPSの場合はどうなるでしょうか。

HTTPSは通信が暗号化されていないHTTPを暗号化した、よりセキュアな通信です。

最近ではGoogleなどがWebページやブログのHTTPS化を推奨しているため、ほとんどのWebページやAPI通信がHTTPからHTTPSに切り替わっています。

暗号化したことでHTTPSのリクエストは複雑かもと思われるかもしれませんが、安心してください。

Google Apps Script(GAS)ではHTTPSもHTTPと同じUrlFetchAppによる実行が可能です。

GASではHTTPであってもHTTPSであっても特に意識することなく、HTTPリクエストすることができます。

各種HTTPリクエストのGASサンプルコード

実際にGoogle Apps ScriptでHTTPリクエスト(GET/POST)を行うサンプルコードを解説します。

Google Apps Script(GAS)でHTTPリクエスト(GETとPOST)の通信を行うサンプルコード

function myFunction() {
//HTTP GET(パラメータなし)の通信
let responseDataGET = UrlFetchApp.fetch("https://auto-worker.com/blog/").getContentText();
console.log(responseDataGET);
//HTTP GET(パラメータ付き)の通信(amazonの「googleappsscript」の検索結果ページ)
let responseDataGET2 = UrlFetchApp.fetch("https://www.amazon.co.jp/s?k=googleappsscript").getContentText();
console.log(responseDataGET2);
//HTTP POSTのAPI通信(リクルートのA3RTのAPI)
let apiURL = "https://api.a3rt.recruit-tech.co.jp/image_influence/v1/meat_score";
let apiKey = PropertiesService.getScriptProperties().getProperty("APIKEY");
//リクルートのAPIに採点してもらう肉画像をGoogleドライブから取得する
let meetImage = DriveApp.getFileById("1hmjS_6exIiogs_iWU1_vEt7CGOBWIyu5").getBlob();
//APIのリクエストでPOSTデータするパラメーターを設定する
let payload = {
'apikey': apiKey,
'predict':'1',
'imagefile': meetImage,
};
//HTTP POSTで前述で設定したパラメーターをオプションで設定する。
let options = {
'method' : 'post',
'payload' : payload
};
//APIにリクエストし、結果をログ出力する
let responseDataPOST = UrlFetchApp.fetch(apiURL,options).getContentText();
}

HTTP GETは基本的にシンプルで、UrlFetchApp.fetch()にURLを引数に指定するだけです。

パラメータなしであっても、パラメータ付きでもそれほど実行方法は変わりません。

HTTP POSTの場合は、API通信に求められる情報をペイロードとしてまとめます。

今回のサンプルコードではリクルートのAIサービス「Image Influence API」にHTTP POSTリクエストを送っています。

API通信で必要なAPIキーや予想値、画像データを設定した上で、POST通信であることも指定してUrlFetchApp.fetch()を実行します。

POSTで送る情報はAPI通信によって規定されているので、APIのドキュメントに従って通信を組み立てます。

まとめ・終わりに

今回、Google Apps Script(GAS)でのHTTPリクエストについて実行方法含め紹介しました。

GASのHTTPリクエストはGET(パラメータなし・あり)、POSTの3種類用意されていますが、いずれもUrlFetchApp.fetch()というメソッドで実行可能です。

それぞれの違いがわかりにくいですが、スクレイピングやAPI通信をGASで行う際には必要になります、

まずはサンプルで書き方を覚え、リクエストするURLを変更したり、パラメータをいじりながら、通信方法を体感するのがオススメです。

理解が進んだところで、スクレイピングしたいWebサイトのURLやAPIのリクエスト先URLを使って、GASのHTTPリクエストを実装しましょう。