やらかし先生が語るGoogleの検索結果への露出を80％もダウンさせてしまった原因 〜君がブロックしたもの〜

# Overview

サイトのアップデートを境にGoogleの検索流入が減り、大きなダメージを被りました。
今回はSearch ConsoleのURL検査で問題ないからといって安心できないことを証明します。

# Target reader

- Google Analyticsを扱う方。
- Google AdSenseで収益化している、かつ月間100万PV以上のサイト運営者。

# Prerequisite

- 以下の製品の使い方をある程度理解している方。
    - Google Analytics（以降、GA）
    - Search Console（以降、SC）
    - AdSense


# Body

## What happened?

百聞は一見に如かず。サイトをアップデートしたら急に検索の露出が激減しました。
6,000回程度表示されていたのに、1,000回程度まで大暴落しました。
いや～マジでありえないし:scream:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/c962ace8-2959-2d5e-31e4-eacd033008f7.png)

## Search Consoleは問題ないように見えたが…

こういう変化が起きた場合、まず頼るのがSCですが、主要なページをURL検査しても全く問題ありません。
正常にインデックス登録可能という診断です。カバレッジも変化なし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/8a60b289-b0db-ab36-ad58-28f83a3fe5d5.png)

しかし、パンくずリストが大暴落:sob:（最終日の回復は問題を修正した結果が反映されている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/21ccc27f-31d1-dc6e-9614-5882d6077510.png)

これでページ崩壊が理由であることはわかりました。
サイトはSPAで作っているため、JSが動作してページをレンダリングします。
JSが一通り動作しきることで、ようやく描画するhtmlが完成します。
何らかの理由でJSが最後まで動作できず、ぺらぺらの`index.html`がページのコンテンツと認識された模様。

## どうしてページは崩壊してしまったのか？

CSのURL検査で多数のページをチェックしましたが、正常にレンダリングされ、パンくずリストも正しく認識されます。
だけど、Gooblebotは一向に`index.html`の内容しか把握できていません。
Gooblebotのレンダリング完成待ち時間が短いのかと思い、表示速度も上げましたが一向に改善されません。
正直2週間程度は万策尽きて、完全に打つ手なしになりました。

それでも何とかならないものかと、SCを眺めてはなぜだろうを日々繰り返しました。
そして、URL検査＝＞インデックス崩壊のページを選択＝＞クロール済みのページを表示＝＞その他情報＝＞ページのリソースで読み込み失敗の数がやたら多いことに気が付く。
URL検査したときよりはるかに多いエラーの数、エラーが多くなる原因は...__GAがブロックされていた！！！__:scream:

## どうしてGAのブロックがインデックス崩壊につながったのか？

実はサイトにGAのブロックを検出して、AdSenseを保護する機能をアップデート時に導入しています。
AdSenseを運営してある程度脅威に曝されるとわかりますが、GAなくしてAdSenseを守ることはかなり難しいためです。

GooglebotはGAをブロックするため、何をしたのかGAに反映されていません。
もし、このGooglebotが実はなりすましだったとしたらサイトを防衛できるでしょうか？:fearful:
GoogleはPCのブラウザ向けに、GAへメトリックを送信しない公式のアドオンを提供しています。
https://tools.google.com/dlpage/gaoptout?hl=ja
つまり、誰しもがGAの監視をかいくぐることが可能です。
これは脆弱性につながるとして対策をGoogleに数回提言しましたが、まあ今後も改善されることはないでしょう:weary:
AdSenseを本気で攻撃されたとき、防衛に成功するサイトが存在するだろうか？というレベルです。

保護機能を入れたのは良かったのですが、Gooblebotをブロックしてしまう懸念はありましたが、URL検査を通ったことでマークを外してしまいました:dizzy_face:
ここで学んだことは、__URL検査OKでもGooblebotでOKとは限らず__ということです。

## （おまけ）hostコマンドなしにGooglebotのなりすましを見抜く方法

Googlebot かどうかの確認方法として公式ドキュメントがあります。
https://support.google.com/webmasters/answer/80553?hl=ja

ただし、`host`コマンドを実行できればいいですが、環境によっては`host`コマンドがない場合があります。
この場合、通常DNSを利用してホスト名からIPアドレスを取得しますが、IPアドレスからホスト名を取得する、DNSリバースルックアップを実行する必要があります。

Node.jsだと以下のメソッドになります。
https://nodejs.org/api/dns.html#dns_dnspromises_reverse_ip

```javascript:reversedns.js
import dns from "dns"
const { Resolver } = dns.promises;

(async () => {
    const resolver = new Resolver();
    const hostnames = await resolver.reverse("172.217.31.132");
    console.log(hostnames);
})();
```

実行結果は以下です。

```terminal
[ 'nrt20s08-in-f4.1e100.net' ]
```

まず、`172.217.31.132`のIPアドレスは何者か？
これは以下のURLから取得したIPアドレスです。
https://dns.google/resolve?name=googlebot.com
これは[Google Public DNS](https://dns.google.com/)を利用して、ホスト名`googlebot.com`をlookupしただけです。
コマンドの詳細は以下を参照のこと。
https://developers.google.com/speed/public-dns/docs/doh/json

話を出力結果に戻し、`nrt20s08-in-f4.1e100.net`の答えを探ります。
ググるとすぐに見つかりますが、Googleであることを示しています。
https://support.google.com/faqs/answer/174717

> 1e100.netは、Googleが所有するドメイン名で、ネットワーク内のサーバーを識別するために使用されます。

つまり、ホスト名が`1e100.net`であれば、Googleのサーバーから来ていることは確認できるということです。
ただし、一般ユーザーが利用するGoogle Cloud PlatformやGoogle Apps Scriptのサーバーもこれだとまずいですが…これは今後確認...未定。

# Conclusion

GAのブロックを検出しようとしたら、Googlebotをブロックし、結果としてGoogleの検索露出が激減して人自体が来なくなり、策士策に溺れた話でした:joy:
URL検査の結果を信じれないのなら、結局は数日後のSCを見るしかないという非常な現実がありました。
結局のところSCの定期チェックがすべて、それ以外は気休めでしかなかった。

Webマーケッターの方はGAが生命線ですが、オプトアウトしているユーザーを検知するときは私のような失敗をしないよう気を付けてください。
オプトアウトしているユーザーのGAを強制的に送信することは、GAの規約違反になりますので絶対にやらないように注意してください。

https://marketingplatform.google.com/about/analytics/terms/jp/

> お客様は本サービスに含まれるプライバシー機能（オプトアウトなど）を一切回避してはなりません。

Have a great day!