開発情報・ナレッジ

投稿者:SPIRERS ナレッジ向上チーム 2022年9月16日 (金)

IPアドレスとユーザーエージェント自動取得するサンプルプログラム

標準機能では、IPアドレスとユーザーエージェントをサイト側から自動取得することができません。(ver.2.20時点)
サイト側から登録する際に、IPアドレスとユーザーエージェントを取得し、更新させるPHPのサンプルプログラムを紹介します。
参考になれば幸いです。

前提

DBのフィールドについて、
IPアドレスは、テキスト、ユーザーエージェントは、テキストエリアで作成をお願いします。
ユーザーエージェントは、最大文字数は半角512文字になるため、テキストエリアフィールドで作成いただく形となります。

サンプルプログラム

PHP
<?php
//------------------------------
// 設定値用モジュール
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue(""));
define("API_ROLE",$SPIRAL->getEnvValue("")); // ロールによるAPI権限が不要の場合
define("APP_ID",$SPIRAL->getEnvValue(""));
define("DB_ID",$SPIRAL->getEnvValue(""));

//------------------------------
// 設定値用モジュール
//------------------------------
$commonBase = CommonBase::getInstance();
// ステップのセット
// 登録ブロックの場合
$formComplete = $SPIRAL->getRegistrationForm("ブロックの識別子"); // 登録フォームブロックの識別名を登録
// 更新ブロックの場合
// $formComplete = $SPIRAL->getUpdateForm("ブロックの識別子"); // 更新フォームブロックの識別名を登録


// 完了画面での処理
if($formComplete->isCompletedStep()){    
    $record = $SPIRAL->getRecordValue();
    $dataPATCH = array(
      "IPを保存するフィールドの識別子" => $_SERVER["REMOTE_ADDR"],
      "ユーザーエージェントを保存するフィールドの識別子" => $_SERVER['HTTP_USER_AGENT'],
    );
    $appInsert = $commonBase->apiCurlAction("PATCH","/apps/".APP_ID."/dbs/".DB_ID."/records/".$record['item']['_id'],$dataPATCH);
    if(isset($appInsert['item'])){
      $SPIRAL->setTHValue("insert", true);
    }else{
      $SPIRAL->setTHValue("insert", "error");
      $SPIRAL->setTHValue("errorText", "IP,UAの更新に失敗しました。");
    //   $SPIRAL->setTHValue("errorText", print_r($appInsert,true));
    }
}


//------------------------------
// 共通用モジュール
//------------------------------

class CommonBase
{
	/**
	 * シングルトンインスタンス
	 * @var UserManager
	 */
	protected static $singleton;
    

	public function __construct()
	{
		if (self::$singleton) {
			throw new Exception('must be singleton');
		}
		self::$singleton = $this;
	}

	/**
	 * シングルトンインスタンスを返す
	 * @return UserManager
	 */
	public static function getInstance()
	{
		if (!self::$singleton) {
			return new CommonBase();
		} else {
			return self::$singleton;
		}
	}

    
	/**
	 * V2用 API送信ロジック
	 * @return Result
	 */
	function apiCurlAction($method, $addUrlPass, $data = null)
	{
        
		$header = array(
			"Authorization:Bearer " . API_KEY,
			"Content-Type:application/json",
			"X-Spiral-Api-Version: 1.1",
		);
		if(API_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".API_ROLE));
		}

		// curl
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_URL, API_URL . $addUrlPass);
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

		if ($method == "POST") {
			curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
		}
		if ($method == "PATCH") {
			curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
		}
		if ($method == "DELETE") {
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
		}
		if ($method == "GET") {
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
		}
		$response = curl_exec($curl);
		if (curl_errno($curl)) echo curl_error($curl);
		curl_close($curl);

		return json_decode($response, true);
	}
}

利用方法

設置するPHPは、登録・更新フォームを設定するページにセットしてください。
サンプルプログラムは、完了画面に遷移時に動作するプログラムとなります。
API_KEY ,API_ROLE ,APP_ID, DB_ID など複数ページで使用箇所は、PHP環境変数への設定を推奨しております。
基本の設定は下記になります。
API_KEY
6行目
アカウント管理で発行したAPIキーをセットしたPHP環境変数の変数名
API_ROLE
7行目
アプリロールの識別名をセットしたPHP環境変数の変数名
アプリロールによる権限設定をしない場合は未入力
APP_ID
8行目
更新するアプリのIDをセットしたPHP環境変数の変数名
DB_ID
9行目
更新するDBのIDをセットしたPHP環境変数の変数名

下記は、PHP環境変数を使った書き方になります。
環境変数を使用しない場合は、下記を使用せずに直接識別名もしくは IDを設定してください。
$SPIRAL->getEnvValue("")
次にどのフォームブロックかを判定する箇所を修正します。
16行目 - 19行目の箇所になります。
// 登録ブロックの場合
$formComplete = $SPIRAL->getRegistrationForm("ブロックの識別子"); // 登録フォームブロックの識別名を登録
// 更新ブロックの場合
// $formComplete = $SPIRAL->getUpdateForm("ブロックの識別子"); // 更新フォームブロックの識別名を登録
使用しないブロックタイプの設定は、コメントアウト(*)してください。
* 文字の先頭に「//」をつけることでコメントアウトできます。
使用するブロックタイプの設定として、「ブロックの識別子」となっている箇所を、使用するブロックの識別子に変更します。

最後に、更新するフィールドと値を指定をします。
25行目 - 28行目の箇所になります。
$dataPATCH = array(
    "IPを保存するフィールドの識別子" => $_SERVER["REMOTE_ADDR"],
    "ユーザーエージェントを保存するフィールドの識別子" => $_SERVER['HTTP_USER_AGENT'],
);
どちらかのみ取得する場合などは、使用しないフィールドをコメントアウトしてください。

・注意点
APIが失敗した場合にIPアドレスおよびユーザーエージェントが入っていないゴミデータが生成される可能性がありますので、ご注意ください
確実に取得したい場合は、IPアドレスが登録されていないレコードは、登録エラーにする等の処理が必要となります。

完了画面に以下のコードを設定することで、APIの処理失敗時にユーザ側でエラーメッセージを表示することもできます。
Thymeleaf
<th:block th:if="${cp.result.value['insert']} ne 'error'">
    <p style="text-align: center;">完了しました。</p>
</th:block>
<th:block th:if="${cp.result.value['insert']} eq 'error'">
    <p style="text-align: center;" th:text="${cp.result.value['errorText']}">text</p>
</th:block>

hidden を使って取得

API を使用せずに hidden を使って、登録される方法もご紹介します。
入力フォームに hidden 値として、IPアドレス と ユーザーエージェントをセットする方法になります。
PHP
<?php
$SPIRAL->setTHValue("ipVal", $_SERVER["REMOTE_ADDR"]);
$SPIRAL->setTHValue("uaVal", $_SERVER['HTTP_USER_AGENT']);
HTML - 入力
<!--/* IPアドレス(ipField) */--> 
<sp:input-field name="f0xx"></sp:input-field> 
<input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:value="${cp.result.value['ipVal']}">
 <!--/* ユーザーエージェントフィールド(uaField) */--> 
<sp:input-field name="f0xx"></sp:input-field> 
<input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:value="${cp.result.value['uaVal']}">
f0xx に関しては、各フィールドのフィールドIDに変更が必要です。

・注意点
hidden を使用する場合、開発者ツール等で改ざんされるリスクがございます。
精緻なものでない前提での取り扱いをお願いいたします。

最後に

設定後は動作確認を必ず行い、動作に問題がないか確認をしてください。
不具合やほかのやり方が知りたい等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
解決しない場合はこちら コンテンツに関しての
要望はこちら