WASM ツール系サイトが AdSense 審査に落ちたので徹底対策した話
はじめに
マインクラフトのシード値を入力するとバイオームや構造物をブラウザ上で表示できるツール「MC Seed View」を個人開発して運営しています。
技術スタックは Vanilla JS + Cubiomes WASM + Supabase + Cloudflare Pages というシンプルな構成です。C で書かれた Cubiomes ライブラリを WebAssembly にコンパイルし、Canvas 上にバイオームマップを描画しています。
アクセスが増えてきたので Google AdSense を申請したところ、「有用性の低いコンテンツ」 で見事にリジェクトされました。しかも結果が返ってくるまで約 2 週間。気軽にリトライできません。
この記事では、WASM/Canvas 中心のツール系サイトが AdSense 審査に通るために行った対策を共有します。
リジェクト理由の分析
AdSense のリジェクトメールには「有用性の低いコンテンツ」としか書かれておらず、具体的な原因はわかりません。自分なりに分析した結果、以下の仮説に至りました。
仮説 1: Googlebot にコンテンツが見えていない
MC Seed View のメインコンテンツは WASM が Canvas に描画したバイオームマップ です。Googlebot は JavaScript を実行できますが、Canvas の中身をテキストとして認識できません。つまり、サイトのメインバリューである地図データが Googlebot には完全に見えていない可能性があります。
仮説 2: 静的テキストコンテンツが少なすぎる
メインページ (index.html) はツール UI 中心で、説明テキストが少ない状態でした。ブログ記事は 50 本ほどありましたが、11 本が 300 語未満のいわゆる "thin content" でした。
仮説 3: 法的ページが不足
プライバシーポリシーや利用規約がフッターのモーダルダイアログで表示されていました。独立した URL を持たないため、Googlebot がクロールできていない可能性がありました。
対策の全容
分析結果をもとに、以下の 4 つの対策を実施しました。
対策 1: 法的・情報ページを独立 HTML として作成
フッターモーダルに埋め込まれていた法的情報を、それぞれ独立した HTML ファイルに切り出しました。
-
privacy.html— プライバシーポリシー (633 語) -
terms.html— 利用規約 (548 語) -
contact.html— お問い合わせ (426 語、Google フォーム連携) -
about.html— サイト紹介 (913 語、機能一覧・対応バージョン表込み)
AdSense の審査では、これらのページが独立した URL で存在し、十分な文量があることが重視されるようです。
対策 2: thin content ブログ記事の拡充
全ブログ記事の語数を計測したところ、11 本が 300 語未満でした。
242 minecraft-enchanting-guide.html
269 biome-finder-tips.html
269 minecraft-diamond-tips.html
273 nether-fortress-blaze-guide.html
277 ruined-portal-loot.html
280 witch-hut-guide.html
288 pillager-outpost-raid.html
288 shipwreck-treasure-map.html
292 minecraft-xp-farm-guide.html
293 bastion-remnant-guide.html
297 igloo-basement-secret.html
これらを全て 600 語以上に拡充しました。単に文量を増やすのではなく、各記事に以下のような実用的なセクションを追加しています。
- 構造物の出現条件やバイオーム制約
- 攻略手順 (ステップ形式)
- アイテムドロップ率や仕様データ
- MC Seed View のツールページへの内部リンク (CTA)
拡充後の語数は 594〜872 語になりました。
対策 3: 8 言語の多言語対応
MC Seed View はもともと 8 言語対応 (EN/JA/KO/ZH-CN/ZH-TW/TH/VI/ID) のアプリです。しかし法的ページやブログ記事は英語版のみでした。
以下の多言語化を実施しました。
法的ページ: 4 ページ × 8 言語 = 32 ファイルを生成。日本語版は手動翻訳、他言語は i18n.js の翻訳データから Python スクリプトで一括生成しました。
ブログ記事: 拡充した 11 記事 × 8 言語 = 88 ファイルを更新。英語版をベースに、lang 属性・canonical URL・アセットパスを言語別に調整するスクリプトで一括処理しました。
リダイレクト: ルートの法的ページ (/privacy.html など) に localStorage ベースの言語リダイレクトスクリプトを追加。ユーザーの言語設定に応じて /ja/privacy.html などへ自動遷移させます。
対策 4: SEO メタデータの強化
全ページに以下のメタデータを追加・更新しました。
-
canonicalURL - Open Graph / Twitter Card メタタグ
- JSON-LD 構造化データ (
Articleスキーマ) -
hreflang属性 (多言語 SEO) -
sitemap.xmlへの法的ページ追加
実装のポイント
フッターリンクの動的言語切替
法的ページへのリンクは言語によって異なる URL を指す必要があります。app.js の _initLegalLinks() で、現在の言語設定に応じてリンク先を動的に切り替えるようにしました。
function _initLegalLinks() {
const lang = localStorage.getItem('seedmap_lang') || 'en';
const prefix = lang === 'en' ? '' : `/${lang}`;
const pages = ['privacy', 'terms', 'contact', 'about'];
pages.forEach(page => {
const el = document.getElementById(`footer-${page}-link`);
if (el) el.href = `${prefix}/${page}.html`;
});
}
ブログ記事の一括拡充
11 本の記事を手動で編集するのは手間なので、Python スクリプトで一括処理しました。各記事の <div class="article-body"> 内のコンテンツを正規表現で検索・置換しています。
pattern = r'(<div class="article-body">)(.*?)(\n\s*</div>\s*</article>)'
match = re.search(pattern, content, re.DOTALL)
if match:
new_content = content[:match.start()] + \
'<div class="article-body">' + expanded_body + \
'\n </div>\n </article>' + \
content[match.end():]
多言語ファイル生成の自動化
英語版 HTML をテンプレートとして、言語ごとにパスと属性を調整するスクリプトを書きました。
LANG_HTML = {'ja': 'ja', 'ko': 'ko', 'zh-CN': 'zh-Hans', ...}
for lang in LANGS:
content = en_content
content = content.replace('lang="en"', f'lang="{LANG_HTML[lang]}"')
content = content.replace('href="../src/', 'href="../../src/')
# canonical URL, OG URL なども同様に置換
対策前後のサイト構成比較
| 項目 | 対策前 | 対策後 |
|---|---|---|
| 法的ページ | モーダル表示 (クロール不可) | 独立 HTML 4 ページ + 多言語 32 ファイル |
| 300 語未満のページ | 11 本 | 0 本 |
| 最小ブログ記事語数 | 242 語 | 594 語 |
| 多言語法的ページ | なし | 8 言語 × 4 ページ |
| sitemap エントリ | ツール + ブログ | + 法的ページ 4 件追加 |
WASM ツール系サイト固有の注意点
WASM/Canvas ベースのサイトで AdSense を申請する際、一般的な Web サイトとは異なる注意点があります。
Googlebot はCanvasの中身を読めない。 サイトのメインバリューがCanvas描画であっても、Googlebot が認識できる 静的テキストコンテンツ を別途用意する必要があります。ブログ記事やガイドページがその役割を果たします。
ツール UI だけではコンテンツとして評価されない。 入力フォームと Canvas しかないページは、AdSense の審査基準では「有用性が低い」と判定されがちです。ツールの使い方や関連情報をテキストで補完することが重要です。
言語リダイレクトに注意。 localStorage ベースのリダイレクトは Googlebot には効きません。Googlebot は常にルートの英語版をクロールするため、英語版の充実が最優先です。
まとめ
WASM ツール系サイトの AdSense 対策をまとめると、以下の 3 点に集約されます。
- 法的ページを独立 URL で用意する — モーダルやインラインではなく、独立 HTML として
- 静的テキストコンテンツを充実させる — Googlebot が読めるテキストを十分に提供する
- 全ページ 300 語以上を確保する — thin content は容赦なくリジェクト理由になる
AdSense の審査は結果が返るまで約 2 週間かかるため、一発で通すつもりで対策を徹底することをおすすめします。
この記事が同じ悩みを抱えている個人開発者の参考になれば幸いです。
この記事の対策を施した結果についても、判明次第追記予定です。