Amazonアソシエイト(アフィリエイト)の広告をクリックしたときの動きを考えてみた。

Amazonアソシエイトの広告がクリックされたときの動きを考えてみました。サイトを見ている人が広告をクリックして商品を購入したら、紹介料として数パーセントの手数料がもらえる仕組みです。Amazonのサイトが表示されるまでを絵で書くと以下のようになるかと思います。

①.顧客がサイトにアクセスする(リクエスト)。
②.ブラウザに結果が表示される(レスポンス)。
③.顧客が画面上の広告をクリックする。
④.Amazonのサイトにアクセスする(リクエスト)。
⑤.ブラウザに結果が表示される(レスポンス)。

これをHTTP通信を踏まえて考えてみました。①から⑤の順で書いてみます。

顧客がAmazonのサイトにまだログインしていないとき

■①顧客がサイトにアクセスする。

ブラウザがHTTPで自分のサイトにアクセスします。HTTPのリクエスト行には GET メソッドを使います。

GET /index.html HTTP/1.1

■②ブラウザに結果が表示される。

自分のサイトから画面表示のHTMLがブラウザに返されます。HTTPのステータス行は「200 OK」です。

HTTP/1.1 200 OK

■③顧客が画面上の広告をクリックする。

Amazonアソシエイトでは、Amazonアソシエイトプログラムにサインインして広告のHTMLコードを取得します。取得したHTMLコードを自分のサイトに貼り付けます。このHTMLコードの中にはアソシエイトIDが埋め込まれており顧客がAmazonの広告をクリック際に、ブラウザはアソシエイトIDをAmazonのサイトに送ります。以下はAmazonアソシエイトプログラムで広告のHTMLコードを取得したときのスナップショットです。

この広告を顧客がクリックします。

■④Amazonのサイトにアクセスする。

ブラウザは GET メソッドでAmazonのサイトにアクセスします。その際にクエリストリング(「?tag=xxx」のところ)を付与して連携します。xxxはアソシエイトIDが入ります。

GET /index.html?tag=xxx HTTP/1.1
Referer:(自分のサイトのURL)

※Amazonの場合、顧客が広告をクリックした時のリンク先URLは「https://www.amazon.co.jp/?tag=・・」となっているようです。

■⑤ブラウザに結果が表示される。

Amazonのサイトではリクエストを受付けセッションを新たに発行します。セッションはセッションIDで管理しています。Amazonのサイトからログイン画面表示のHTMLがブラウザに返されます。

HTTP/1.1 200 OK
Set-Cookie:(発行したセッションIDをクッキーに格納)

顧客はログインのアカウント/パスワードを入力し、再度、Amazonのサイトに情報を送ります。Amazonのサイトでは認証を行いOKであれば、そのセッションを有効にします。
※厳密に言うと、認証前のセッションIDと認証後のセッションIDはセキュリティを考慮すると別のものになっていると思います。認証前は仮のIDで認証後のセッションIDを本来のものとして使う。

これ以降、顧客がAmazonのサイトにアクセする際はブラウザがセッションIDをクッキーに設定して送信するようになります。AmazonのサイトではセッションIDとアソシエイトIDの紐付けを持ちます(ココが重要)

顧客がAmazonのサイトにログイン済みだったとき

■①〜③までは「顧客がAmazonのサイトにまだログインしていないとき」と同じです。

■④Amazonのサイトにアクセスする。

ログイン済みであるためブラウザは認証OKだった際に取得したセッションIDをすでに保持しています。そのためセッションIDをクッキーに設定してアクセスします。

GET /index.html?tag=xxx HTTP/1.1
Referer:(自分のサイトのURL)
Cookie:(認証OKの際にSet-Cookieで受け取ったセッションIDを格納)

■⑤ブラウザに結果が表示される。

AmazonのサイトではセッションIDで認証を行うため(ログイン画面表示のHTMLではなく)商品サイトのHTMLを返します。その際、クッキーの有効期限を延長しています。
※クッキーの有効期限を延長する際にセッションIDを使いまわしているか、新たなセッションIDを発行しているか、どちらかかと思います。

HTTP/1.1 200 OK
Set-Cookie:(セッションIDを格納、クッキーの有効期限を延長)

なおAmazonアソシエイトの場合、クッキーの有効期限は24時間です(再訪問期間と言われているものです)。

顧客が商品を購入したら?

顧客はAmazonの商品サイトを見ていて気に入った商品があれば購入します。ブラウザはカートに入れられた商品をHTTPの POST メソッドでAmazonのサイトに送ります。その際のリクエストは以下となります。

POST ・・
Cookie:(セッションIDを格納)

ブラウザはセッションIDをクッキーに設定してAmazonのサイトにアクセスしています。クッキーが有効な間(再訪問期間の間)であれば、商品を購入したときのセッションIDに紐付くアソシエイトIDを持つ方に紹介料が支払われることになります。

なお、広告に掲示した商品が特定の本だったとして、顧客が購入した商品がその本でなくても(Amazonの商品サイトを見ていて他の商品を購入したとしても)、紹介料としての報酬は発生します。広告のHTMLコードにはアソシエイトIDとともに商品の情報も埋め込まれていると思うのですが(そもそも商品によって画像が違う)、Amazonのサイトに導いてくれた方には紹介料を渡しているようです。

顧客が他のサイトを踏んでしまったとき

以下の絵です。すでにAmazonのサイトにログイン済みで、(①)→(②)→③→④→⑤となった場合です。

ログイン済みのためブラウザはセッションIDをすでに保持しています。この状態で顧客が他のサイトのAmazonアソシエイトの広告をクリックすると、、

GET /index.html?tag=yyy HTTP/1.1
Referer:(他のサイトのURL)
Cookie:(認証OKの際にSet-Cookieで受け取ったセッションIDを格納)

HTTP/1.1 200 OK
Set-Cookie:(セッションIDを格納、クッキーの有効期限は延長)

というふうになります。AmazonのサイトではセッションIDで認証するため商品サイトを返しますが、リクエスト時のクエリストリングのアソシエイトIDが他のサイトの方のものになり(「?tag=yyy」のところ)、セッションIDに紐づくアソシエイトIDの書き換えが行われるものと思われます。つまり後で踏まれたサイトのほうが優先され顧客が商品を購入した場合は、そちら(他のサイト)に報酬が支払われることになります。

本当はこれらの動きはパケットキャッチャして確かめればよいのですが、AmazonのサイトはHTTPSで暗号化されているのでキャプチャしても中身が読めません。ですので、この記事は推定で書いています。。

Google AdSenseでサイトは審査不能になったときの対応

Google AdSenseを申請して「サイトは審査不能」と言われてしまったときに、いったいなんの対応をすればいいのか悩むと思います。以下がGoogleから「サイトは審査不能」と連絡が来たときのメールの一部です(図1)。

図1

文面には、

  • サイトがダウンしている
  • 表示できない状態
  • YouTube や Blogger などの AdSense ホスト パートナーからお申し込みいただいた場合
  • 利用できない
  • 見つからない

とあるけど、実際に自分でサイトを確認するとブラウザにちゃんと表示できるし、サーバーがダウンしていたという情報もレンタルサーバーの提供元にも載っていないし、「YouTube や Blogger などの AdSense ホスト パートナー」からの申込にも心当たりないし(していないし)、なにを言っているの?と思ってしまいます。僕も「サイトは審査不能」と判定された一人であり、僕が対応したことを書いておきます。

正直、僕はなにもせず再申請をしてしまおうかとも思いました。理由は「ちゃんと表示できているから」です。とはいえ、ネットで調べてみて他の方の対応と見比べ、これが一番理屈に叶うと思ったコトをしてみました。

Google Search Consoleで確認する。

「Search Console」とは、サイトがGoogleにどのように認識されるかを確認し、検索結果でのサイトのパフォーマンスを最適化できるGoogleが提供しているWEB上のツールです。このSearch Consoleのなかに「Fetch as Google」という機能があります。Fetch as Googleでは、ウェブサイトのページがGoogleでどのように表示されるかを確認することができます。これを試してみました。Fetch as Googleにある「取得してレンダリング」のボタンを押下。以下が結果です(図2)。

図2

「一時的にアクセスできません」となっていました。でも、ブラウザからはちゃんとアクセスできるし表示もできます。この判定ですが、人が見たときの見栄え(表示)の話ではなくて、サイトを巡回しているGoogleのロボット(クローラー)がサイトを解析できているか?ということによる判定のようです。どうやらクローラーにサイト構造が伝わってないみたいでした。。

[広告]


クローラーについて調べてみたところ、robots.txtが必要とのことなので早速、用意しました。サイトはWordpressで作成していたのですが、明示的にrobots.txtを作成してWordpressが配置されているルートディレクトリの直下に置きます(「wp-admin」や「wp-content」ディレクトリと同じ階層です)。robots.txtは以下のようにしました。

==============================
(robots.txtの中身)
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

Sitemap: https://サイトのURL/index.php?xml_sitemap=params=
==============================

再度、Fetch as Googleの「取得してレンダリング」を実行したところ、緑のチェックがついてステータスが「一部」となっており大丈夫?なのかが少し気がかりです(図3)。

図3

本来であれば以下の図4のようにステータスは「完了」になるのだけれど。。

図4

図3の「一部」のところにカーソルをあわせてクリックすると、サイトがGoogleにどのように認識されているかが表示されて、確認することができます。その表示の下に「Googlebot はこのページの一部のリソースを取得できませんでした。取得できなかったリソースは次のとおりです」との文言が載っていました(図5)。どうやら、これらのリソースが取得できないので「一部」となってしまったようです。

図5

これらリソースですが、調べてみたら以下のようです。

https://pagead2.googlesyndication.com
→ Adsense申請時に「head部に貼り付けてください」とGoogleに言われたURLのサーバっぽい。

https://googleads.g.doubleclick.net
→ Google Analytics に関連したサーバーらしい。

二つともGoogleと関連するサーバーなので、どうしようもなく無視することにしました。これ以上は他にできないので、この状態でAdSenseの再申請をしました。再申請までにあけた期間は1日です(朝に「サイトは審査不能」の通知が来て、翌日の夜に再申請をしました)。その結果は・・

図6

「お客様のサイトが AdSense に接続されました」とGoogleから通知が来ました(やったー)。この通知も再申請の翌日でした。「サイトは審査不能」で困っている人がいたら、試しにSearch Consoleで自分のサイトを確認してみてください。