Python Wappalyzerライブラリ徹底解説:ウェブサイトの技術スタックを特定する

WebサイトやWebアプリケーションがどのような技術で作られているか気になったことはありませんか?競合サイトの分析、技術トレンドの調査、あるいは単なる知的好奇心から、特定のサイトが使用しているCMS、プログラミング言語、サーバー、JavaScriptライブラリなどを知りたくなる場面は多々あります。

従来、これを調べるにはブラウザのデベロッパーツールを開いてHTMLソースコードやHTTPヘッダーを丹念に確認する必要がありましたが、Wappalyzerというツールを使えば、これらの情報を簡単に、そして網羅的に取得できます。Wappalyzerはもともとブラウザ拡張機能として有名ですが、その強力な技術検出エンジンをPythonプログラムから利用できるライブラリ、それがpython-wappalyzerです。

このブログ記事では、python-wappalyzerライブラリに焦点を当て、そのインストール方法から基本的な使い方、結果の解釈、さらには応用的な活用法まで、詳細に解説していきます。このライブラリを使えば、複数のWebサイトの技術スタック情報をプログラムで効率的に収集・分析することが可能になります。

Wappalyzerとは?

Wappalyzerは、WebサイトやWebアプリケーションで使用されている様々な技術(テクノロジー)を識別するためのツールです。以下のような多岐にわたる情報を検出できます。

  • CMS(コンテンツ管理システム): WordPress, Joomla, Drupal など
  • プログラミング言語: PHP, Python, Ruby, Java など
  • Webサーバー: Nginx, Apache HTTP Server, IIS など
  • JavaScriptフレームワーク/ライブラリ: React, Angular, Vue.js, jQuery など
  • UIフレームワーク: Bootstrap, Foundation など
  • データベース: MySQL, PostgreSQL, MongoDB など
  • アナリティクスツール: Google Analytics, Adobe Analytics など
  • Eコマースプラットフォーム: Shopify, Magento, WooCommerce など
  • CDN(コンテンツ配信ネットワーク): Cloudflare, Amazon CloudFront, Akamai など
  • その他: フォントスクリプト, SEOツール, コンテナ技術 (Dockerなど), PaaS/IaaS (AWS, Azureなど)

Wappalyzerは、WebページのHTMLソースコード、HTTPヘッダー、JavaScript変数、Cookie、URLパターンなどを分析し、既知の技術パターン(フィンガープリント)と照合することで、これらの技術を特定します。これらの技術パターンは、technologies.json(または類似のファイル)に定義されており、コミュニティによって継続的に更新されています。

もともとはブラウザ拡張機能として提供され、閲覧中のページの技術情報を手軽に確認できることから、多くのWeb開発者、デザイナー、マーケターに利用されています。python-wappalyzerは、このWappalyzerの検出ロジックをPython環境で利用できるようにしたものです。

python-wappalyzer のインストール

python-wappalyzerライブラリのインストールは、Pythonのパッケージインストーラであるpipを使って簡単に行えます。ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してください。

pip install python-wappalyzer

あるいは、Python 3 を明示的に指定する場合は次のようにします。

python3 -m pip install python-wappalyzer

注意点:

  • 現在のバージョンの `python-wappalyzer` は Python 3.6 以上 が必要です。古いPython 2をサポートしていた最終バージョンは 0.2.2 でした。
  • このライブラリは内部で lxml ライブラリを使用しています。lxml のインストールが環境によっては難しい場合があります。もし lxml をインストールできない環境であれば、依存関係なしでインストールし、必要なパッケージを手動でインストールする方法も提供されていますが、HTML解析の精度が落ちる可能性があります。
    pip install python-wappalyzer --no-deps
    pip install requests aiohttp cached_property dom_query

インストールが正常に完了すれば、Pythonスクリプトからライブラリをインポートして使用する準備が整います。

基本的な使い方

python-wappalyzer の基本的な使い方は非常にシンプルです。主に以下のステップで構成されます。

  1. 必要なクラス (Wappalyzer, WebPage) をインポートする。
  2. Wappalyzer のインスタンスを作成する。最新の技術定義ファイルを使用するのが一般的です。
  3. 分析したいWebページのURLを指定して WebPage オブジェクトを作成する。
  4. Wappalyzer インスタンスの analyze 関連メソッドを使って分析を実行する。
  5. 結果(検出された技術のセットや詳細情報)を取得する。

以下に具体的なコード例を示します。

単純な技術セットの取得

from Wappalyzer import Wappalyzer, WebPage

# 1 & 2. Wappalyzerインスタンスを作成 (最新の技術定義を使用)
try:
    wappalyzer = Wappalyzer.latest()
except Exception as e:
    print(f"Error initializing Wappalyzer: {e}")
    # エラーハンドリング (例: デフォルトの定義を使用するなど)
    # wappalyzer = Wappalyzer.create()
    exit()

# 3. 分析したいWebPageオブジェクトを作成
target_url = 'https://www.example.com' # 分析したいURLに置き換えてください
try:
    webpage = WebPage.new_from_url(target_url)
except Exception as e:
    print(f"Error fetching webpage {target_url}: {e}")
    exit()

# 4 & 5. 分析を実行し、技術名のセットを取得
try:
    technologies = wappalyzer.analyze(webpage)
    print(f"Detected technologies for {target_url}:")
    print(technologies) # 例: {'Nginx', 'jQuery', 'PHP'}
except Exception as e:
    print(f"Error analyzing webpage: {e}")

カテゴリ情報付きで取得

各技術がどのカテゴリに属するかを知りたい場合は、analyze_with_categories メソッドを使用します。

from Wappalyzer import Wappalyzer, WebPage

try:
    wappalyzer = Wappalyzer.latest()
    target_url = 'https://www.python.org' # 分析したいURL
    webpage = WebPage.new_from_url(target_url)

    # カテゴリ情報を含む辞書を取得
    technologies_with_categories = wappalyzer.analyze_with_categories(webpage)
    print(f"\nDetected technologies with categories for {target_url}:")
    # 出力例 (実際の検出結果とは異なる場合があります):
    # {
    #  'Nginx': {'categories': ['Web servers']},
    #  'Python': {'categories': ['Programming languages']},
    #  'Fastly': {'categories': ['CDN']},
    #  'jQuery': {'categories': ['JavaScript libraries']}
    # }
    import json # 見やすくするためにJSON形式で出力
    print(json.dumps(technologies_with_categories, indent=2, ensure_ascii=False))

except Exception as e:
    print(f"An error occurred: {e}")

バージョンとカテゴリ情報付きで取得

検出された技術のバージョン情報(判明した場合)とカテゴリ情報を同時に取得するには、analyze_with_versions_and_categories メソッドを使用します。

from Wappalyzer import Wappalyzer, WebPage
import json

try:
    wappalyzer = Wappalyzer.latest()
    # WordPressサイトの例 (実際のURLに置き換えてください)
    target_url = 'https://ja.wordpress.org/'
    webpage = WebPage.new_from_url(target_url)

    # バージョンとカテゴリ情報を含む辞書を取得
    tech_details = wappalyzer.analyze_with_versions_and_categories(webpage)
    print(f"\nDetected technologies with versions and categories for {target_url}:")
    # 出力例 (バージョンは検出できない場合 [] になります):
    # {
    #   "WordPress": { "categories": ["CMS", "Blogs"], "versions": ["6.5.2"] },
    #   "PHP": { "categories": ["Programming languages"], "versions": [] },
    #   "MySQL": { "categories": ["Databases"], "versions": [] },
    #   "jQuery": { "categories": ["JavaScript libraries"], "versions": ["3.7.1"] },
    #   "React": { "categories": ["JavaScript frameworks"], "versions": ["18.2.0"] }
    # }
    print(json.dumps(tech_details, indent=2, ensure_ascii=False))

except Exception as e:
    print(f"An error occurred: {e}")

これらの基本的な使い方をマスターすれば、単一のWebサイトの技術スタックを手軽に調査できます。

コアコンポーネントの理解

python-wappalyzer ライブラリの中心となるのは、Wappalyzer クラスと WebPage クラスです。

Wappalyzer クラス

このクラスは、技術検出エンジンそのものです。主な役割は以下の通りです。

  • 技術定義のロード: technologies.json(またはそれに類するファイル)を読み込み、解析して、検出ルールのデータベースを構築します。
  • 分析の実行: WebPage オブジェクトを受け取り、ロードされた技術定義に基づいて分析を実行します。分析メソッド (analyze, analyze_with_categories など) を提供します。
  • インスタンス生成:
    • Wappalyzer.latest(): インターネット上から最新の技術定義ファイルをダウンロードして Wappalyzer インスタンスを生成します。常に最新の情報で分析したい場合に推奨されます。
    • Wappalyzer.create(): ライブラリに同梱されている技術定義ファイルを使用してインスタンスを生成します。オフライン環境や、特定のバージョンの定義ファイルで固定したい場合に使用します。
    • カスタム定義ファイルの利用: 特定の技術定義ファイルパスを指定してインスタンスを生成することも可能です(後述)。

WebPage クラス

このクラスは、分析対象となるWebページを表します。特定のHTTPライブラリ(例: requests, aiohttp)から独立した、シンプルなWebページの表現を提供します。主な役割は以下の通りです。

  • コンテンツの保持: WebページのURL、HTMLコンテンツ、HTTPヘッダー、スクリプトタグ、メタタグなどの情報を保持します。
  • インスタンス生成:
    • WebPage.new_from_url(url, ...): 指定されたURLからWebページを取得し、必要な情報(HTML、ヘッダーなど)を抽出して WebPage オブジェクトを生成します。内部でHTTPリクエストを行います。タイムアウト (timeout) や User-Agent (user_agent)、SSL証明書の検証有無 (verify) などを指定できます。
    • WebPage.new_from_html(url, html, ...): ローカルに保存されたHTMLファイルなど、既にHTMLコンテンツを持っている場合に、URLとHTML文字列から WebPage オブジェクトを生成します。HTTPヘッダー情報も辞書として渡すことができます。
  • 情報のアクセス: Wappalyzer が分析に必要な情報(例: webpage.html, webpage.headers, webpage.scripts など)へのアクセスを提供します。

これらのクラスが連携することで、指定されたWebページの情報(WebPage)を、技術定義データベース(Wappalyzer内)と照合し、使用されている技術を特定する、というプロセスが実現されます。

結果の解釈

python-wappalyzer が返す結果は、使用する分析メソッドによって形式が異なりますが、基本的には検出された技術に関する情報が含まれます。

analyze() の結果

最もシンプルな analyze() メソッドは、検出された技術名のセット (Set) を返します。

{'Nginx', 'jQuery', 'PHP', 'MySQL', 'WordPress'}

セットなので、順序は保証されず、重複する技術名は含まれません。単純にどの技術が使われているかだけを知りたい場合に便利です。

analyze_with_categories() の結果

このメソッドは、技術名をキーとし、その技術が属するカテゴリのリストを値とする辞書 (Dictionary) を返します。

{
    'Nginx': {'categories': ['Web servers', 'Reverse proxies']},
    'jQuery': {'categories': ['JavaScript libraries']},
    'PHP': {'categories': ['Programming languages']},
    'MySQL': {'categories': ['Databases']},
    'WordPress': {'categories': ['CMS', 'Blogs']}
}

各技術がどのような役割を果たしているか(例: CMSなのか、Webサーバーなのか)を理解するのに役立ちます。一つの技術が複数のカテゴリに属することもあります(例: NginxはWebサーバーでもあり、リバースプロキシでもある)。

analyze_with_versions_and_categories() の結果

最も詳細な情報を返すのがこのメソッドです。技術名をキーとし、カテゴリリストとバージョンリスト(検出できた場合)を含む辞書を値とする辞書 (Dictionary) を返します。

{
    'Nginx': {'categories': ['Web servers', 'Reverse proxies'], 'versions': []},
    'jQuery': {'categories': ['JavaScript libraries'], 'versions': ['3.6.0']},
    'PHP': {'categories': ['Programming languages'], 'versions': ['7.4.28']},
    'MySQL': {'categories': ['Databases'], 'versions': []},
    'WordPress': {'categories': ['CMS', 'Blogs'], 'versions': ['5.9.3']}
}

バージョン情報は常に検出できるとは限りません。検出ロジックがバージョン特定のパターンを見つけられなかった場合、'versions' リストは空 ([]) になります。バージョン情報が分かると、例えば特定のバージョンの脆弱性調査などに繋げることができます。

結果を解釈する際には、特にバージョン情報が常に正確であるとは限らない点に注意が必要です。Wappalyzerはパターンマッチングに基づいて推測するため、Webサイト側で意図的に情報を隠蔽していたり、特殊なカスタマイズが施されていたりすると、誤った結果や不完全な結果になる可能性があります。

結果を表形式で表示する例

取得した詳細結果を表形式で見やすく表示するPythonコード例です。(tabulate ライブラリが必要です: pip install tabulate

from Wappalyzer import Wappalyzer, WebPage
from tabulate import tabulate
import json

try:
    wappalyzer = Wappalyzer.latest()
    target_url = 'https://www.djangoproject.com/' # 例
    webpage = WebPage.new_from_url(target_url)
    tech_details = wappalyzer.analyze_with_versions_and_categories(webpage)

    print(f"\nTechnology Stack for {target_url}:\n")

    table_data = []
    headers = ["Technology", "Categories", "Detected Versions"]

    # 辞書をリストのリストに変換
    for tech, details in tech_details.items():
        categories = ", ".join(details.get('categories', []))
        versions = ", ".join(details.get('versions', [])) if details.get('versions') else "N/A"
        table_data.append([tech, categories, versions])

    # 表形式で出力
    print(tabulate(table_data, headers=headers, tablefmt="grid"))

except Exception as e:
    print(f"An error occurred: {e}")

このコードを実行すると、以下のような見やすい表が出力されます。

Technology Categories Detected Versions
PythonProgramming languagesN/A
DjangoWeb frameworksN/A
CloudflareCDN, SecurityN/A
MemcachedCache toolsN/A
PostgreSQLDatabasesN/A
Google Font APIFont scriptsN/A

※ 上記の表はあくまで表示例であり、実際の検出結果とは異なる場合があります。

応用的な使い方と機能

基本的な使い方以外にも、python-wappalyzer はいくつかの応用的な機能を提供しています。

ローカルHTMLファイルの分析

Webサイトから直接取得する代わりに、ローカルに保存されたHTMLファイルや、プログラムで生成したHTMLコンテンツを分析することも可能です。WebPage.new_from_html() を使用します。

from Wappalyzer import Wappalyzer, WebPage
import json

# 分析したいHTMLコンテンツ (例)
html_content = """
<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <meta name="generator" content="WordPress 5.9" />
</head>
<body>
    <h1>Hello with jQuery and WordPress</h1>
    <script>
        // Some inline script potentially indicating a framework
    </script>
</body>
</html>
"""
# 元のURL情報 (相対パス解決などに影響する可能性があるため指定推奨)
original_url = 'http://example.com/local_page.html'
# ヘッダー情報 (必要であれば辞書で指定)
headers = {'Server': 'Apache', 'X-Powered-By': 'PHP/7.4'}

try:
    wappalyzer = Wappalyzer.latest()
    # HTMLコンテンツからWebPageオブジェクトを作成
    webpage = WebPage.new_from_html(url=original_url, html=html_content, headers=headers)

    tech_details = wappalyzer.analyze_with_versions_and_categories(webpage)
    print("\nDetected technologies from local HTML:")
    print(json.dumps(tech_details, indent=2, ensure_ascii=False))
    # 期待される出力例: {'jQuery': {...}, 'WordPress': {...}, 'Apache': {...}, 'PHP': {...}}

except Exception as e:
    print(f"An error occurred: {e}")

カスタム技術定義ファイルの利用

特定のバージョンの技術定義ファイルを使いたい場合や、自作の定義ファイルを使いたい場合は、Wappalyzer インスタンス生成時にファイルパスを指定できます。

from Wappalyzer import Wappalyzer

# カスタム定義ファイルのパス (例)
custom_tech_file = '/path/to/your/technologies.json'

try:
    # ファイルパスを指定してWappalyzerインスタンスを作成
    wappalyzer = Wappalyzer.latest(technologies_file=custom_tech_file)
    # または Wappalyzer.create(technologies_file=custom_tech_file)

    # 以降の分析処理...

except FileNotFoundError:
    print(f"Error: Custom technologies file not found at {custom_tech_file}")
except Exception as e:
    print(f"An error occurred: {e}")

リクエストパラメータのカスタマイズ

WebPage.new_from_url() を使用する際に、HTTPリクエストの挙動をカスタマイズできます。

  • タイムアウト設定: timeout 引数で秒数を指定します (デフォルトは30秒)。
  • User-Agent設定: user_agent 引数でカスタムUser-Agent文字列を指定できます。デフォルトはライブラリ固有のものです。
  • SSL証明書検証の無効化: verify=False を指定すると、SSL証明書の検証をスキップします(セキュリティリスクがあるため注意が必要です)。
  • プロキシ設定: proxies 引数に辞書形式でプロキシ情報を渡すことができます (例: {'http': 'http://proxy.example.com:8080', 'https': 'https://proxy.example.com:8080'})。
from Wappalyzer import WebPage

target_url = 'https://target-site.com'
custom_user_agent = 'MyCustomAnalysisBot/1.0'
proxies = {'https': 'https://user:pass@proxy.example.com:8080'}

try:
    webpage = WebPage.new_from_url(
        target_url,
        timeout=10, # タイムアウトを10秒に設定
        user_agent=custom_user_agent, # カスタムUser-Agent
        verify=True, # SSL検証を有効 (デフォルト)
        # proxies=proxies # プロキシを使用する場合
    )
    # webpageオブジェクトを使った分析処理...
    print(f"Successfully fetched {target_url} with custom settings.")

except Exception as e:
    print(f"Error fetching webpage with custom settings: {e}")

コマンドラインインターフェース (CLI)

簡単な分析であれば、Pythonスクリプトを書かずにコマンドラインから直接実行することも可能です。

python -m Wappalyzer https://www.example.com

これにより、検出された技術情報がJSON形式で標準出力に出力されます。いくつかのオプションも利用可能です。

  • --update: 最新の技術定義ファイルをダウンロードして使用します。
  • --user-agent <AGENT>: カスタムUser-Agentを指定します。
  • --timeout <SECONDS>: リクエストのタイムアウト時間を指定します。
  • --no-verify: SSL証明書の検証をスキップします。
python -m Wappalyzer --update --timeout 15 https://github.com

ユースケース

python-wappalyzer は、その自動化能力により、様々な分野で活用できます。

  • 競合分析: 競合他社のWebサイトがどのような技術スタックで構築されているかを調査します。これにより、競合の技術選定の傾向、強みや弱み(例: 古いバージョンのライブラリを使用しているなど)を把握し、自社の戦略立案に役立てることができます。例えば、特定のECプラットフォームやCRMを利用している競合が多い場合、それが業界標準となっている可能性を示唆します。
  • 市場調査・技術トレンド分析: 特定の業界や分野の多数のWebサイトを分析し、広く使われている技術(プログラミング言語、フレームワーク、CMSなど)のシェアやトレンドを把握します。例えば、新しいJavaScriptフレームワークの採用率がどのように変化しているかなどを追跡できます。
  • セキュリティリサーチ: 特定の技術(例: 特定バージョンのCMSやライブラリ)を使用しているWebサイトのリストを作成し、既知の脆弱性を持つ可能性のあるサイトを特定する初期調査に利用できます。ただし、倫理的な観点と法律を遵守し、許可なく脆弱性スキャンなどを行うべきではありません。
  • リードジェネレーション: 特定の技術(例: 特定のマーケティングオートメーションツール、CRM、Eコマースプラットフォームなど)を使用している企業をリストアップし、自社製品やサービスの潜在顧客リストを作成するのに役立ちます。例えば、特定のCRMを使用している企業に対して、連携可能な自社ツールを提案するなどのアプローチが考えられます。
  • 開発・移行計画: 自社で管理している複数のWebサイトの技術スタックを定期的に棚卸しし、古くなった技術のアップデート計画や、新しい技術への移行計画を立てる際の基礎データとして活用します。
  • 学術研究: Web技術の普及度や変遷に関する研究において、大規模なWebサイト群の技術データを収集・分析するためのツールとして利用できます。

Pythonライブラリであるため、他のデータ処理ライブラリ(Pandasなど)やデータベース、Webフレームワーク(Flask, Djangoなど)と組み合わせることで、より高度な分析やアプリケーション開発が可能です。例えば、収集した技術データをダッシュボードで可視化したり、特定の技術変化をトリガーに通知を送るシステムなどを構築できます。

制限事項と考慮点

python-wappalyzer は非常に便利なツールですが、利用にあたってはいくつかの制限事項と考慮点を理解しておく必要があります。

  • 検出精度: Wappalyzerの検出は、HTML、ヘッダー、スクリプトなどに含まれる既知のパターンに基づいています。サイト側がこれらのパターンを意図的に隠蔽したり、標準的でない実装をしていたりする場合、技術を検出できなかったり、誤った技術を検出したりする可能性があります。特に、高度にカスタマイズされたシステムや、バックエンドだけで動作する技術の検出は難しい場合があります。バージョン情報も常に正確とは限りません。
  • 動的コンテンツへの対応: JavaScriptによって動的に生成・変更されるコンテンツに含まれる技術パターンは、単純なHTML取得だけでは検出できない場合があります。ライブラリは基本的なスクリプトタグのsrc属性なども見ますが、複雑なSPA(Single Page Application)などで後からロードされるライブラリなどは見逃す可能性があります。(より高度な分析には、ヘッドレスブラウザなどが必要になる場合があります。)
  • 技術定義ファイルの更新依存: 検出能力は、Wappalyzerの技術定義ファイル(technologies.json)の網羅性と最新性に依存します。新しい技術や、既存技術の新しいバージョンに対応するパターンが定義ファイルに追加されるまで、それらを検出することはできません。Wappalyzer.latest() を使用することで最新の定義を利用できますが、それでもタイムラグは存在します。
  • パフォーマンス: 多数のWebサイトを分析する場合、各サイトへのHTTPリクエストとコンテンツの解析には時間がかかります。特に、応答の遅いサイトや大量のデータを含むサイトがあると、全体の処理時間が長くなる可能性があります。非同期処理などを検討する必要があるかもしれません。
  • リソース消費: 短時間に大量のリクエストを特定のサーバーに送信すると、対象サーバーに負荷をかける可能性があります。また、自身のネットワーク帯域やメモリも消費します。分析対象のサイト数が多い場合は、適切な待機時間を設ける、リクエスト数を制限するなどの配慮が必要です。
  • 倫理的・法的側面: Webサイトの技術情報を収集する行為自体は、一般的に問題視されることは少ないですが、その情報をどのように利用するかについては注意が必要です。特に、収集した情報に基づいて脆弱性スキャンを行ったり、セキュリティ上の弱点を悪用したりすることは絶対に避けるべきです。また、サイトの利用規約によっては、自動化されたアクセスやスクレイピングが禁止されている場合もあります。常に良識と法律の範囲内で利用することが重要です。
  • Wappalyzer APIとの違い: Wappalyzerは公式にWeb APIも提供しています。このAPIは、Wappalyzer側でクロールと分析を行い、結果をJSONで返すサービスです(無料枠あり、超過分は有料)。python-wappalyzer ライブラリは、自身のマシン上で分析を実行するため、API利用料はかかりませんが、分析のための計算リソースやネットワーク帯域は自己負担となります。どちらを利用するかは、目的、予算、分析規模に応じて選択します。

これらの点を理解した上で、python-wappalyzer を活用することが、効果的かつ責任ある利用につながります。

まとめ

python-wappalyzer は、WebサイトやWebアプリケーションの技術スタックをプログラムから効率的に特定するための強力なPythonライブラリです。簡単なインストールと直感的なAPIにより、特定のURLやローカルのHTMLファイルから、使用されているCMS、フレームワーク、ライブラリ、サーバーソフトウェアなどの情報を抽出できます。

基本的な使い方から、カテゴリやバージョン情報を含めた詳細な分析、リクエストのカスタマイズ、コマンドラインでの利用など、幅広い機能を提供しています。これにより、競合分析、市場調査、セキュリティリサーチ、リードジェネレーションなど、多様な目的に応用することが可能です。

一方で、検出精度や動的コンテンツへの対応、技術定義ファイルの更新依存性といった制限事項も存在します。また、利用にあたっては、対象サイトへの負荷や倫理的・法的側面にも配慮する必要があります。

これらの特性を理解し、適切に活用することで、python-wappalyzer はWeb技術に関する洞察を得るための貴重なツールとなるでしょう。ぜひ、あなたのプロジェクトや分析業務に取り入れてみてください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です