拡張アプリ

目次

フォームに reCAPTCHA を導入してボットからのアクセスを遮断する


a-blog cms Ver.2.8.0から拡張機能より、GoogleのreCAPTCHA機能が使用できます。 ウェブサイトにアクセスを試みるボットを遮断するために設置されているreCAPTCHAですが一度はどこかで体験したことがあると思います。webのフォームは一番攻撃されやすい箇所になります。reCAPTHAを導入して、ロボットによるスパム投稿を防ぎましょう。


ロボットでないことを証明する

ロボットでないことを証明する


下準備

まずreCAPTCHAを導入するために、reCAPTCHA にアクセスして、必要な情報を取得します。

「Domains」の項目はご利用のサイトのドメインを指定してください。


(スクリーンショット)

サイトのドメイン登録


(スクリーンショット)

Site key と Secret key の取得


サイトを登録し、以下2つのキーを使用しますのでメモしておいてください。

  • Site key
  • Secret key

クライアント実装

下準備ができましたので、まずはクライアントサイドを実装します。

JavaScript

以下コードを ご利用のテーマのフォームの head要素内に読み込んでください。

例えば、simple2016テーマなら themes/simple2016/contact/index.html です。

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script>
  function validateRecaptcha ( code ) {
    if ( !!code ) {
      var form = document.querySelector(".recaptcha");
      form.removeAttribute('disabled');
    }
  }
</script>

HTML

次に送信フォームを少し修正します。simple2016テーマなら themes/simple2016/contact/form/main.html を開きます。

以下コードを送信フォーム内に挿入します。ここで、{Site key} は 下準備で取得した Site keyに置き換えてください。

<div class="g-recaptcha" data-callback="validateRecaptcha" data-sitekey="{Site key}"></div>

次に、送信ボタンに recaptcha クラスをふり、 disabled にしておきます。

<input type="submit" name="ACMS_POST_Form_Submit" value="送信する" id="btnSubmit" class="recaptcha btn-attention-block-large" disabled />

完成例

例として themes/simple2016/contact/form/main.html を編集しています。

<!-- BEGIN step#confirm -->
...

<form action="thanks.html" method="post" class="form-btn form-btn-send" enctype="multipart/form-data">

    <div class="g-recaptcha" data-callback="validateRecaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxx"></div>

    <input type="hidden" name="To[]" value="{email}" />
    <input type="hidden" name="AdminReply-To[]" value="{email}" />
    <input type="hidden" name="AdminFrom[]" value="{email}" />
    <input type="hidden" name="step" value="result" />
    <input type="hidden" name="takeover" value="{takeover}" />
    <input type="hidden" name="id" value="contactForm" />
    <input type="submit" name="ACMS_POST_Form_Submit" value="送信する" id="btnSubmit" class="recaptcha btn-attention-block-large" disabled />
</form>

クライアントサイドは完成です。実際に動かしてみましょう。フォームの確認画面まで行くと、reCAPTCHAが表示され、送信ボタンが押せないようになっているかと思います。reCAPTCHAで承認が通ると送信ボタンが押せるようになります。


(スクリーンショット)

チェックするまで送信ボタンが押せない


サーバーサイド実装

クライアントサイドの実装ができると、一見動いていそうに見えますが、このままだと送信ボタンの disabled を開発者ツールなどで削除してしまえば、送信できるようになってしまいます。そこで、サーバーサイドで認証を行いましょう。

認証の仕組み

ユーザーがreCAPTCHAの認証を通ると、ランダムな文字列のコードが生成され、フォーム送信時に一緒に送信されます。 このコードを使って、サーバーサイドでreCAPTCHAのapiにリクエストを投げ、正しいコードかチェックを行うことにより、正常な手段でフォームが送信されたことを確認することができます。

実装

実装にはHook機能を使います。php/ACMS/User/Hook.phpbeforePostFire に以下のコードを追加しましょう。

config.server.phpのHOOK_ENABLEを 1 にしておきましょう。

public function beforePostFire($thisModule)
{
    $moduleName = get_class($thisModule);

    if ( $moduleName === 'ACMS_POST_Form_Submit' ) {
        $secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
        $response = $thisModule->Post->get('g-recaptcha-response');
        $api = "https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${response}";

        $valid = false;
        if ( $res = @file_get_contents($api) ) {
            $check = json_decode($res);
            if ( $check->success === true ) {
                $valid = true;
            }
        }

        if ( !$valid ) {
            $Field  = $thisModule->extract('field');
            $Field->setMethod('g-recaptcha-response', 'check', false);
            $thisModule->Post->set('step', 'forbidden');
        }
    }
}

ここで、 $secret を、下準備で用意した Secret key で置き換えます。これで実装は完了です。

確認

では実際に、サーバーサイドで認証ができているかチェックしてみましょう。フォームで確認画面まで移動して、 disabled になっている送信ボタンを、開発者ツールで disabled を外して送信してみましょう。以下の画像のようにサーバーサイドで不正なアクセスとして処理されていることが確認できます。


不正なアクセスとして処理される

不正なアクセスとして処理される

ネットショップサービス「BASE」との連携


人気のECサービス「The BASE」のAPIと拡張アプリを利用して、a-blog cms のEC機能を強化するカスタマイズをしてみましょう。


「The BASE」に登録した商品をa-blog cms で表示しました


「The BASE」は無料で簡単にネットショップを開設できるサービスです。本格的なECサイトよりも簡単にショップを開設し、a-blog cmsで商品の紹介をおこなえます。

対象バージョン

  • a-blog cms Ver. 2.8 以上

拡張アプリの設置

ダウンロード

ダウンロードしたzipファイル解凍後、ディレクトリ名が「Base」であることを確認して extension/plugins/ に設置してください。

拡張アプリインストール

管理ページ > 拡張アプリ に移動すると The BASE が一覧にあると思います。
ある事を確認できたら The BASEのインストールボタンを押してください。


アプリがインストールされました。


子ブログにBASE商品を表示する場合は、ルートブログとBASE商品を表示したいブログの両方でインストール作業を行ってください。

The BASE アプリ登録

a-blog cms 側でのコールバックURL取得

アプリのインストールが完了すると、管理ページの左側メニューに「拡張メニュー > The BASE」項目が追加されますので、そこから The Base API 連携 設定ページを開いてください。

コールバックURL は BASE側のアプリの登録で使用しますのでコピーしておきます。


管理画面「The Base API 連携」内のコールバックURL


The BASE側でのアプリ登録

The BASE側でアプリの登録を行います。

まずはBASE Developers にて、「新規作成」よりBASE APIの申請をしてください。
※ BASEのアカウントがない場合は、先にアカウント登録をしてください。

  • コールバックURL: 先ほど控えておいたa-blog cmsの「The Base API 連携」に表示されているコールバックURLを入力
  • 利用権限: ユーザー情報を見る / 商品情報を見る にチェック
  • 検索APIの利用: 利用するにチェック

申請には1〜数日かかります。

複数ブログで商品表示したい場合

この後、申請が通ったアプリ情報を使用してBASEとの連携を認証していきます。
複数ブログで商品表示したい場合はそのブログ毎に認証する必要があります。しかし、アプリ登録画面を見れば分かるようにコールバックURLが1アプリにつき1つしか設定できないため異なるbid情報を持つURLを複数登録することはできません。

なので対応としては以下の2つの方法があります。

  1. アプリ登録申請を複数行う(ブログ分)
    → アプリ申請時に同じサイトで複数アプリ申請する理由をアプリ情報の「アプリの説明」にしっかり記入しておくことをお勧めします。

  2. 各ブログ認証時に一つのアプリでコールバックURLのbidを変更しつつ認証する(コールバックURLはアプリ申請が通ったあとでも変更可能です)
    → 30日間サイトから商品を閲覧されることがないと再認証が必要になるため、サイトを運営する中で再認証をするたびに BASE Developers でコールバックURLのbidを変更する作業が発生します。

アプリ申請にあまり手間をかけたくない場合は1の方法、サイト運営の手間を少しでも減らしたい場合は2の方法がいいかと思います。


「BASE Developers」内のアプリ登録画面


The BASE側でのアプリ情報取得

BASE APIの申請が通ったら、BASE Developers にて該当のアプリを開き、以下の情報を控えておきます。

  • client_id
  • client_secret
  • client_id (検索API用)
  • client_secret (検索API用)

「BASE Developers」内のアプリ情報画面


a-blog cms側でのOAuth2認証

a-blog cmsの管理画面 > The Base API 連携 の設定画面を開き、上記で控えておいた情報を入力->保存します。
また、ページにアクセスするたびにAPIへのアクセスをすると制限がかかりますので、必ずキャッシュ時間を設定してください。


管理画面「The Base API 連携」の設定


保存後、再度同じページにアクセスして 認証 ボタンをおして認証します。ボタンを押すと、The BASE側で認証画面が出てくると思います。
BASEにログインしている場合は認証するアカウントがあっているか確認し、認証してください。ログインしていない場合はメールアドレスとパスワードをいれて認証してください。
認証後、自動的にリダイレクトされa-blog cmsの管理画面に戻ってきます。
認証に成功しました と表示されていれば連携成功です。

複数ブログで商品表示する場合はそれぞれのブログで認証してください。
1ブログにつき1アプリの登録をしていればそれぞれの情報を入力して認証します。
1つのアプリを複数ブログで使用する場合は、BASE Developers にてアプリのコールバックURLのbidを変更しながら認証します。

モジュールIDを作成する

a-blog cmsのモジュールを設定します。以下3つのモジュールが用意されています。モジュールID化してご利用ください。
表示設定はそれぞれ設定するようにしてください。
商品表示用のスニペットはモジュールの表示設定画面にあります。

  • 商品一覧(Base_Items)
  • 商品検索(Base_Search)
  • 商品詳細(Base_Detail)

Base_Searchについて注意点

  • 表示設定 にある ショップIDには、The BASEのショップURLのサブドメインを設定してください。
  • BASE側のプラグインで「シークレット EC」が入っている場合は検索できなくなってしまうため注意してください。
  • 条件設定 の引数のキーワードのチェックは入れるようにしてください。URLコンテキストのキーワード情報を取得できるようにしておきましょう。

Base_Detailの使用例

まずは商品IDを登録するエントリーのカスタムフィールドを用意します。
カスタムフィールドメーカー で商品IDを登録するカスタムフィールドを用意しておきます。
今回はエントリーのフィールドを使用すると想定して解説していきます。カテゴリーやブログのフィールドを使用する場合は読みかえながら設定してください。
フィールド名は後でモジュール設定に使用するため控えておいてください。

例)エントリーのカスタムフィールド


<table class="acms-admin-table-admin-edit">
  <tr>
    <th>商品ID</th>
    <td>
      <input type="text" name="base_item_id" value="{base_item_id}" class="acms-admin-form-width-small" />
      <input type="hidden" name="field[]" value="base_item_id" />
    </td>
  </tr>
</table>

モジュールIDを作成します。モジュールIDの設定は下記のようにしておきます。

モジュールIDの表示設定

  • フィールドタイプ: 商品IDを登録するフィールドタイプを指定します。今回は「エントリー」を選択します。
  • フィールド名: 商品IDを登録するフィールド名を指定します。今回は「base_item_id」と入力します。

モジュールIDの条件設定

ここでは、エントリーのカスタムフィールドに商品IDを設定しますので、モジュールID設定画面の条件設定にある引数の中の「エントリーID(eid)」にチェックを入れておきます。
URLコンテキストのエントリー情報を取得できるようにしておきましょう。

カートに入れるボタンの設置

商品詳細ページに「カートに入れるボタン」を設置してみましょう。下記ソースコードをエントリーのカスタムフィールド(表側)に貼り付けます。
formタグのaction属性に指定するURLは各ショップによって異なります。実際にBASEのショップページにて確認してください。

<!-- BEGIN_MODULE Base_Detail id="モジュールIDを設定してください" -->
<!-- BEGIN item -->
<!-- BEGIN_IF [{stock}/gte/1] -->
<form name="add-to-cart" action="https://BASEでの実際のショップURL/cart/add/ショップID" method="post" class="c-form-sample" target="_blank">
  <!-- BEGIN_IF [<!-- BEGIN variations:loop -->1<!-- END variations:loop -->/em] -->
  <p class="p-base-entry-sample__amount">
    <label for="amountSelect" class="p-base-entry-sample__amount-label">数量</label>
    <select name="amount" id="amountSelect" class="p-base-entry-sample__amount-select js-sample-amount" data-amount="{stock}">
    </select>
  </p>
  <!-- ELSE -->
  <div class="js-sample-variation">
    <p class="p-base-entry-sample__amount">
      <label for="valiationSelect" class="p-base-entry-sample__amount-label">種類</label>
      <select name="select" id="valiationSelect" class="p-base-entry-sample__amount-select js-sample-variation-index">
        <!-- BEGIN variations:loop -->
        <!-- BEGIN_IF [{variation_stock}/gte/1] -->
        <option value="{variation_id}" data-stock="{variation_stock}">{variation}</option>
        <!-- END_IF -->
        <!-- END variations:loop -->
      </select>
    </p>
    <p class="p-base-entry-sample__amount">
      <label for="amountSelect" class="p-base-entry-sample__amount-label">数量</label>
      <select name="amount" id="amountSelect" class="p-base-entry-sample__amount-select js-sample-variation-amount">
      </select>
    </p>
  </div>
  <!-- END_IF -->
  <input type="hidden" name="id" value="{item_id}">
  <p><button type="submit" class="c-btn">カートに入れる</button></p>
</form>
<!-- ELSE -->
<h3>SOLD OUT</h3>
<!-- END_IF -->
<!-- END item -->
<!-- END_MODULE Base_Detail -->

<!-- 商品選択肢 -->
<script>
  // 種類選択あり
  function amountVariationGetSet() {
    var amountVariation = parseInt($('.js-sample-variation-index option:selected').data('stock'), 10);
    for (var i = 1; i <= amountVariation; i++) {
      $('.js-sample-variation-amount').append('<option value=' + i + '>' + i + '</option>');
    }
  }
  // 種類選択あり:ロード時
  if ($('.js-sample-variation').length) {
    amountVariationGetSet();
  }
  // 種類選択あり:種類変更時
  $('.js-sample-variation-index').change(function() {
    $('.js-sample-variation-amount option').remove();
    amountVariationGetSet();
  });

  // 種類選択なし
  if ($('.js-sample-amount').length) {
    var amount = parseInt($('.js-sample-amount').data('amount'), 10);
    for (var i = 1; i <= amount; i++) {
      $('.js-sample-amount').append('<option value=' + i + '>' + i + '</option>');
    }
  }
</script>

Google スプレッドシート との連携機能


a-blog cms Ver.2.8.0より拡張アプリ「Google Sheets」を利用できるようになります。 a-blog cmsの拡張アプリ「Google Sheets」を使うとお問い合わせフォームなどで送信された内容をGoogle スプレッドシートで作成した任意のスプレッドシートの最後の行に追記することができます。

拡張アプリの導入

拡張アプリ一覧 より Google Sheets の拡張アプリをダウンロードし、zipファイルを解凍します。解凍したフォルダを /extension/plugins/に設置します。



そして、config.server.phpを1にし、拡張アプリからHook処理をかけられるようにします。

define('HOOK_ENABLE', 1);

CMSを設置したサイトにアクセスし、管理画面 > 拡張アプリの順にページを移動し、 Google Sheets をインストールします。


API連携の方法

以下の3つのステップで a-blog cms と Google スプレッドシート を連携します。

  1. ClientID JSON の取得
  2. ClientID JSON を CMS側に登録
  3. フォームIDに書き込みしたいSpreadsheetIDとSheetIDを紐づける

1. ClientID JSON の取得

まずは、Google Cloud Platform にアクセスしてログインしてください。

ログイン後、セレクトメニューをクリックし、プロジェクトを選択します。



任意の名前でプロジェクトを新規作成するか、既に別のAPIをつかっていて設定している場合はプロジェクトを選択します。


次は、サイドバーの「ライブラリ」という項目をクリックし、API ライブラリのページに移動します。そのページにて、Google Sheet APIという項目を検索して有効化してください。





最後にサイドバーの「認証情報」」という項目をクリックし、認証情報」のページに移動します。そこで新たにOAuth クライアント ID を作成します。 アプリケーションの種類として、「ウェブアプリケーション」を設定して、「認証済みのリダイレクトURI」には「ドメイン名/bid/(現在使用しているブログのBID)/admin/app_google_spreadsheet_callback」を設定します。



※新規でプロジェクトを作成した場合、OAuthクライアントID作成前に同意画面の設定を登録する必要があります(2021年3月現在)

アプリケーションの種類を「ウェブアプリケーション」を選択してOAuthクライアントIDを作成してください。



※ablogcms.ioで「認証済みのリダイレクトURI」に正常に登録できない場合は、「OAuth同意画面」のページにある公開ステータスの項目を「テスト」にすれば登録できます(2021年3月現在)

その後、クライアントIDなどの情報が記述されたJSONファイルをダウンロードしましょう。


次にダウンロードしたJSONファイルをサーバーにアップロードします。ドキュメントルート以下にアップロードをするとブラウザからアクセスできてしまいますので、ドキュメントルートより上の階層にアップロードするのが望ましいです。

2. ClientID JSON を CMS側に登録

CMSの管理画面に戻り、サイドバーに「Google Sheets」という項目が増えているので、クリックして Google Sheets のページへ移動します。

そして先ほど設置したJSONファイルへのパスを記述します。絶対パスで記述しましょう。パスを記述後、設定を保存してから、「認証」ボタンをクリックして認証するようにしましょう。

※ablogcms.ioで行う場合は、ルートディレクトリには設置できないため、「themes」フォルダなどにJSONファイルを設置します。 ablogcms.ioでの記述例: /var/www/vhost/xxxxxx.ablogcms.io/html/themes/xxxxxxxx.json


3. フォームIDに書き込みしたいSpreadsheetIDとSheetIDを紐づける

さらにCMSの管理ページで、フォームIDに対して書き込みたい Google Sheets のIDを指定する必要があります。
管理画面 > フォームの順にページを移動し、任意のフォームIDの変更画面に移動すると、「Google スプレッドシート Form 設定」という項目が増えています。


Spreadsheet IDと Sheet ID は、開いている スプレッドシート のURLから調べることができます。

https://docs.google.com/spreadsheets/d/{Spreadsheet ID}/edit#gid={Sheet ID}

設定が完了すれば、お問い合わせフォームから送信された内容を Google スプレッドシート に自動で追加登録できます。下の図のような実行結果になっていれば成功です。


拡張アプリを使ってフォームの内容をSlackで通知する

a-blog cms Ver.2.8.0から拡張アプリ「Slack」を利用いただけます。 a-blog cmsの拡張アプリ「Slack」を使うとフォームからデータが送信された段階でそのフォームのデータを加工し、Slackに通知することができます。例えばフォームから「資料請求」などがあれば「資料請求がありました。」などとslackの好きなチャンネルに通知できます。

下準備

以下の3つのステップでa-blog cms とSlackを連携します。

  1. Slackへの登録
  2. Webhook URL の取得
  3. a-blog cmsの拡張アプリ Slackに Webhook URL を登録

1. Slackへの登録

Slackのアカウントをお持ちでない方は下記のURLにてアカウントを作成しましょう。ある程度の機能までは無料で使うことができます。 https://slack.com/

2. Webhook URL の取得

下記のURLにてチャネルを指定して Webhook URL を取得します。ここで登録したチャネル以外のチャネルにもメッセージを飛ばすことはできますので好きなチャネルを指定して作成しましょう。 https://slack.com/services/new/incoming-webhook

3. a-blog cmsの拡張アプリ Slackに Webhook URL を登録

管理ページ > 拡張アプリより「拡張アプリ管理」のページに移動します。そのページより下の図のようにSlackをインストールします。



インストール完了後は、管理ページ >Slack よりSlackの管理ページに移動します。その後、「Webhook URL」という項目がありますので、その項目に先ほど覚えておいた Webhook URL を入力します。 これでa-blog cmsとSlackを連携させる準備は整いました。

注意

config.server.phpでHOOKを有効にしておく必要があります。

define('HOOK_ENABLE', 1);

拡張アプリ Slack の使い方

下の図のように、Slackに通知したいFormIDを指定し、メッセージの送信先チャネルを「Channel」に送信元の名前を「From」に設定します。またメッセージにはFormモジュールの変数と、グローバル変数を使用することができます。


フォームでの送信内容をMailChimp のリストに保存


MailChimpとはマーケティングオートメーションツールで顧客に応じてメールマガジンを送ったりすることができます。

a-blog cms Ver.2.8.0より、拡張アプリ「MailChimp」を利用することで、お問い合わせフォームで登録された内容を MailChimp のリスト上に保存することができるようになります。

下準備

以下の3つのステップでa-blog cmsとMailChimpを連携します。

  1. MailChimpへの登録
  2. API key の取得
  3. a-blog cmsの拡張アプリ MailChimp にApi Keyを登録

1. MailChimpへの登録

MailChimpのアカウントをお持ちでない方はまずはMailChimpに登録してみましょう。無料で始めることができます。

2. API key の取得

下記のURLにて認証トークンを発行できます。 https://us8.admin.mailchimp.com/account/api/ 下の図のように「Create A Key」というボタンをクリックするとAPI keyが発行できるのでこのkeyを覚えておきましょう。


3. a-blog cmsの拡張アプリ MailChimpにAPI key を登録

管理ページ > 拡張アプリ より「拡張アプリ管理」のページに移動します。そのページより下の図のようにMailChimpをインストールします。


インストール完了後は、管理ページ > MailChimp よりMailChimpの管理ページに移動します。その後、「認証トークンの設定」という項目がありますので、その項目に先ほど覚えておいたAPI keyを入力します。 これでa-blog cmsとMailChimpを連携させる準備は整いました。

注意

config.server.phpでHOOKを有効にしておく必要があります。

define('HOOK_ENABLE', 1);

拡張アプリ MailChimpの使い方

  1. Formの権限設定
  2. MailChimpのカスタムフィールドの設定

1. Formの権限設定

フォームIDごとに、MailChimpのどのリストに対してInsert(データの挿入)及びUpdate(データの更新)ができるかを設定できます。例えば、下の画像の場合、フォームIDがcontactFormのフォームは、5124628dadのリストidに対して、Insert(データの挿入)及びUpdate(データの更新)ができるということになります。


2. MailChimpのカスタムフィールドの設定

次は、カスタムフィールドの設定です。ここではa-blog cmsのフォーム側の変数とMailChimp側のカスタムフィールドの紐付けを行います。例えば、一番最初の列では、emailの項目は、MailChimp側のリスト(5124628dad)のemail_addressに対応しています。


なお ListId を調べるにはMailChimpのリスト一覧ページ に移動し、下の画像のように下矢印のアイコンからメニューを表示し「Settings」をクリックして設定画面へ移動します。


そのページの一番下でリストIDが確認できます。



フォームのHTML側の設定

以下のようなHTMLをフォームに設置しておくことで、フォームから値が送信された段階で、送信者のメールアドレスに対して、MailChimpの「定期購読」のステータスが自動でONになります。

<input type="hidden" name="status" value="subscribed">
<input type="hidden" name="field[]" value="status">