ジョー・ヒタギの止リ木 | 「ものづくり」や「ものなおし」をするブログ

色々なものを作ったり直したりするブログです。主な話題は日用品・電子機器・エアガンなど。

ジョー・ヒタギ の 止リ木

【はてなブログ】手動で設置したアドセンス広告を一括で削除(置換)する方法

f:id:Jo-Bitaki:20200222133054p:plain:h300

Google AdSenseにはサイト内のスペースを解析し、自動で広告を設置してくれる機能がある。
しかしAIの精度があまり良くないのか、わりと非常識な場所に広告が出る。そのため、当ブログでは自動広告を無効にし手動で広告コードを設置している。

参考:
www.joe-hitagi.com


そうすると、広告の設置場所を変えたいときや広告をいったん撤去したい場合、全部の記事を編集しなければならなくなる。
そうした事態を回避する方策として、広告を任意の場所に自動で挿入するコードが各所で紹介されている(上の記事参照)。しかし、これを導入するには既に設置てある広告コードを削除しなければならず、やはり全記事の編集になる。

また、独自ドメインへの移行時にはアドセンスの再審査が必要になるが、審査中はいったん全ての広告コードを削除しなければ規約違反になる恐れがある。

今回は全記事の広告コードを一度に削除する方法を3通りご紹介する。条件付きではあるが、既存の広告を別の種類の広告に置き換えることも可能である。

正規表現を使用することになるが、それについてもなるべく丁寧に解説したのでぜひ最後までお付き合いいただきたい。

使用するツール

「ReplaceContentText」というコマンドラインツールを使う。

こちらがツール制作者様のサイト。
smdn.jp

このツールは指定した文字列をはてなブログの全記事から検索し、それを別の文字列に置き換えられる大変便利な代物である。正規表現も使用可能(後述)。

使い方

上のサイトに詳細な使用法が載っているため、ここでは補足を中心に述べたい。

以下に置換コマンドの一例を載せる。

C:\xxx\ReplaceContentText.exe -n -i --id Jo-Bitaki --blog-id joe-hitagi.hatenablog.com --api-key xxxxx --from "[検索文字列]" --to "[置換後文字列]" --diff-cmd fc

--idにははてなIDを指定する。

--blog-idに指定するブログIDとは、はてなブログの「詳細設定」→「AtomPub」に書かれているアドレスの下線部である。前後のスラッシュは不要。

f:id:Jo-Bitaki:20200112131429p:plain


オプションの-nは「実際に置換は行わず、置換内容の確認をする」ときに使用する。そのため、まずは-nオプションを入れて置換内容を確認し、問題なければこのオプションを抜いて再度実行することをおすすめする。

-iオプションは置換の実行前にユーザーの承認を求めるもの。確認は記事ごとに必要となる。必須のオプションではないが、私は不安なので入れておいた。
以下、掲載したコードには事故防止のために全て-n-iオプションを入れてある。

--diff-cmd fcは置換される部分(差分)のみを表示するオプション。これを指定しないと記事の全文が表示され、置換部分の確認が難しくなる。
fcコマンドはWindowsの場合に使用し、MacのようなLinux系ならdiffを使う。diffの使い方については前述のツール制作者様のサイトに詳しく書かれている。

実行時に「アクセスが拒否されました」といったエラーが出る場合、コマンドプロンプトを「管理者として実行」すれば解決するはずである。

広告コードの削除(置換)方法

例として以下の広告コードを削除する場合を考える。

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 広告ユニット1 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="xxxxx"
     data-ad-slot="0000000"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>


もしも「見たままモード」のHTML編集で貼り付けた場合、下のように改変されているはずである。

<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 広告ユニット1 -->
<p><ins class="adsbygoogle" style="display: block;" data-ad-client="xxxxx" data-ad-slot="0000000" data-ad-format="auto" data-full-width-responsive="true"> </ins></p>
<script>// <![CDATA[
     (adsbygoogle = window.adsbygoogle || []).push({});
// ]]></script>

<p>タグや空白が挿入されたり、改行が消されたりと不思議な改変をされていることが分かるだろう。この現象のせいで検索・置換が一筋縄ではいかず非常に苦労させられた。

次項からは実際の置換コマンドを3パターンご説明する。
操作内容はただの文字列の検索・置換のため、類似のツールがあればワードプレスなどの他のブログサービスでも利用できるかと思う。

1.コードの一部を置換する

以下のコマンドにより"adsbygoogle""dis_adsbygoogle"のような適当な文字列に置換する方法である。削除というよりは無効化というべきかもしれない。

C:\xxx\ReplaceContentText.exe -n -i --id Jo-Bitaki --blog-id joe-hitagi.hatenablog.com --api-key xxxxx --from "adsbygoogle" --to "dis_adsbygoogle" --diff-cmd fc

広告コードの1行目にある、JavaScriptの読み込みを阻止することで広告の無効化を図っている。
当ブログが独自ドメインへ移行する際には、この方法で再審査を乗り切った。

参考:
www.joe-hitagi.com


この手法のメリットは次の3点である。

  • 正規表現が不要のため操作内容が分かりやすい
  • コードが改変されても対応できる
  • 逆方向に置換するだけで簡単に元に戻せる

特に、最後に挙げた簡単に元通りにできることが大きな利点である。

デメリットは次の2点。

  • 記事内に貼ったあらゆるアドセンスを無効化してしまう(=広告ユニットの区別はできない)
  • 規約違反の恐れがある

規約については以下を参照していただきたい。

support.google.com


私の理解が正しければ、ポリシーの趣旨は次の3点である。

  • 閲覧者に不利益を与えない
  • サイトの評価を不当に釣り上げない
  • 出稿された広告の表示を妨害しない

これに照らせば、本項の改変は直ちに規約違反にはならないと思われる。実際、当サイトが審査に再合格するまでグーグルから警告が届くことはなかった。
しかし規約に関しては何の保証もできないため、安全をとるなら次の方法をおすすめする。

2.特定の広告ユニットを削除する

次に、特定の広告ユニットのみを全記事から削除する方法をご紹介する。一度削除した広告は元に戻せないので注意。

コマンドは以下の通り。

C:\xxx\ReplaceContentText.exe -n -i --id Jo-Bitaki --blog-id joe-hitagi.hatenablog.com --api-key xxxxx --from "<script.+adsbygoogle[\s\S]*?<ins class=\"adsbygoogle\"[\s\S]*?data-ad-slot=\"0000000\"[\s\S]*?>[\s\S]*?</script>" --to "" --diff-cmd fc --regex

こちらのコマンドは、広告コードに見たままモードの改変が加えられていても機能する。

data-ad-slotには削除したい広告ユニットの数字を指定する。これで広告ユニットを一意に特定できる。

--regexは正規表現を使うためのオプションである。
正規表現とは検索対象を「A」や「1」のような特定の1文字に絞るのではなく、「英字」や「数字」のようなある条件を満たすグループとして指定する方法である。
ツール制作者様のサイトに詳細な解説が載っている。

smdn.jp


以下、コマンドに使用した正規表現について解説する。

.は改行文字以外の任意の1文字を表す。
+は「直前の文字の1回以上の繰り返し」を表す。この表現ではできる限り長い文字列を探す。例えば「abcabcd」に対してa.+cで検索した場合、マッチ結果は「abcabc」となる。

\sはスペースや改行文字などの空白文字を表す。特殊文字全般といったところである。

\Sは空白文字以外の文字、すなわち人間が通常の書き物に使う文字全てを表す。

[]は中に囲われた文字のいずれかを表す。つまり、OR(または)を表現する。
[\s\S]とすることで「特殊文字を含むあらゆる文字」を表す。

*は「直前の文字の0回以上の繰り返し」を表す。例えばab*なら「a」、「ab」、「abb」などにマッチする。
この表現はできる限り長い文字列を探すものである。例えば「abbbc」という文字列にab*で検索をかけると「abbb」が取り出される。

?*の後につけることでできる限り短い文字列を探すように変更できる。「abbbc」にab*?で検索をかれば「a」がマッチする。
「abbcabbc」に対してab*cで検索すればすべての文字がマッチし、ab*?cであれば「abbc」とマッチする。

もしも冒頭のコマンドに?をつけなければ、記事内に2個のアドセンス広告があった場合「1つ目の広告コードの先頭~2つ目の広告コードの末尾」まで、間にある記事本文を含めてごっそり削除される恐れがある。

コマンド内の検索文字列で"の直前につけた\はエスケープシーケンスを意味する。コマンド内では"に挟まれたものを一連の文字列として扱うため、\"として「この"はただの文字列の一部であり、コマンドとしての意味はないよ」とプログラムに示す必要がある。

3.特定の広告コードを別の文字列に置換する

削除した広告を再び元に戻したければ、前項のコマンドの置換先文字列に<!--広告ユニット1用スペース-->のような一意に特定できるHTMLコメントを指定すると良い。
ただし、再設置した広告コードはエディタ上では一行になってしまう(後述)。

広告を戻す場合、検索文字列に<!--広告ユニット1用スペース-->を、置換後文字列に広告コードを指定する。
同様にして特定の広告ユニットを別のものに置き換えることもできるだろう。

この時、あらかじめ広告コードを次のように改変しておく。

  • 改行を削除してコード全体を1行に収める
  • "\"でエスケープする
  • 広告コード内の正規表現に使われる文字をエスケープする(--regexオプションを使う場合)

例:

<script async src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script><!-- 広告ユニット1 --><ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"xxxxx\" data-ad-slot=\"0000000\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"></ins><script>\(adsbygoogle = window.adsbygoogle \|\| \[\]\).push\(\{\}\);</script>

このように広告コードは1行になってしまうため、完全に元通りにはできない。改行を\n\r\r\nといった改行文字に置き換えてもエディタ上にそのまま表示されてしまう。「エディタ上での改行」を表すにはどうすればいいのだろうか。

HTMLはPythonとは異なり改行が必須ではないため、広告コードを1行にしても正常に機能する。アドセンスポリシー上の問題もきっとないはず。

最後にエスケープについて述べる。広告コードには(){}[]|が含まれているが、これらはどれも正規表現で使用される。そのため、\(\)\{\}\[\]\|のようにして「正規表現ではなくてただの文字列だよ」と明示する必要がある。
空白はそのままでもいいが、適宜消したほうが見やすいだろう。

おわりに

広告コードの貼り付けは自動化しておいたほうが何かと便利のため、手動広告を除去した後は以下のサイトを参考に設定することをおすすめする。

uxlayman.hatenablog.com

awacafe-tokushima.work

atumetaize.com

clrmemory.com

4番目のサイトで紹介されているカテゴリーを非表示にする方法は、1番目のサイトのツールと組み合わせて使うと良い。

冒頭でも紹介したが、手動広告についてはこちらの記事も参考にしていただきたい。スマホとPCで広告の大きさを自動で切り替えるコードも紹介している。

www.joe-hitagi.com