普段「確認くん」を使っていますので、クライアントのIPアドレスやユーザエージェントを返すAPIを作成しました。
機能追加型APIではTor判定も行っています。
●APIって何
私の解釈ですが、
リクエストに対して、HTMLを返すのがWEBサーバ
リクエストに対して、汎用的なデータ(JSON、XML等)を返すのがAPIサーバ
と考えています。(違ったらごめんなさい)
ですから、RESTを使ったAPIサーバが脚光を浴びていますが、ApacheでもNGINXでも、TOMCATでもIISでもAPIサーバの構築は可能です。
Apache+CGIは、リクエストがバンバン入るようなサービス向きの手法ではありませんが、APIの理解を進めるうえでの第一歩として、Apache+PHPでのAPI構築を行っていきたいと思います。
●APIソース
ファイル名はkakunin.phpとして、パーミッションを755にしました。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$client_ip = $_SERVER['REMOTE_ADDR']; //IPアドレスの取得
$user_agent = $_SERVER['HTTP_USER_AGENT']; //UAの取得
$response_data = array(
'client_ip' => $client_ip,
'user_agent' => $user_agent
);
// Content-Type を JSON に設定
header('Content-Type: application/json');
// 配列をJSONにエンコード
echo json_encode($response_data);
} else {
// GET 以外のメソッドが使用された場合はエラーメッセージを返します
http_response_code(405);
echo json_encode(array('message' => 'Method Not Allowed'));
}
json_encode関数が思っていた以上に優秀で使いやすい!
●実行結果
次のようにJSON形式で、クライアントのIPアドレスとユーザエージェントを取得することができました。
コマンドプロンプトからの取得もできます
API ドキュメント (DocはGPT先生から提供してもらいました)
概要
この API は、クライアントの IP アドレスやプロキシの有無などの情報をレスポンスとして返します。
公開リンク
機能追加型APIのリンクは こちらです。レスポンス
レスポンスのフォーマット
レスポンスは JSON 形式で返されます。
jsonCopy code{
"client_ip": "string",
"user_agent": "string",
"proxy_ip": "string",
"host_name": "string",
"request_method": "string",
"uri": "string",
"query_string": "string",
"protocol": "string",
"https_flag": "boolean",
"is_private_ip": "boolean",
"is_proxy": "boolean"
}
レスポンスパラメータ
client_ip
(string): クライアントの IP アドレス。user_agent
(string): クライアントのユーザーエージェント。proxy_ip
(string): プロキシの IP アドレス。プロキシ経由の場合のみ存在します。host_name
(string): クライアントのホスト名。request_method
(string): リクエストメソッド。uri
(string): リクエストされた URI。query_string
(string): クエリ文字列。protocol
(string): 使用されているプロトコル。https_flag
(boolean): HTTPS 接続が使用されているかどうかのフラグ。is_private_ip
(boolean): クライアントの IP アドレスがプライベートIPかどうかのフラグ。is_proxy
(boolean): プロキシ経由の接続かどうかのフラグ。torを使用している場合、trueになります。
サンプルリクエスト
curl https://tansunohazama.sakura.ne.jp/cgi/api/kakunin.php
サンプルレスポンス
jsonCopy code{
"client_ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36",
"proxy_ip": "",
"host_name": "example.com",
"request_method": "GET",
"uri": "/api/info",
"query_string": "",
"protocol": "HTTP/1.1",
"https_flag": false,
"is_private_ip": true,
"is_proxy": false
}