アフィリエイト基盤の全面改修 — PA-API 非依存の3ボタンカードと FANZA サイドバー実験
Amazon に締め出された日
2026年4月10日、とあるまとめ媒体のアフィリエイトブロックを手書き HTML から Cocoon 純正の [amazon asin="X"] ショートコードへ移行しようとした。書籍1冊あたり15行が1行になる。見た目はきれいだった。
そこで AssociateNotEligible に当たった。
Your account does not currently meet the eligibility requirements
to access the Product Advertising API.
Amazon の PA-API は、アクセス維持に 180日以内の成約3件以上 を要求する。75クリックでは成約が足りなかった。ショートコードは管理者にだけ見えるエラーカードとして描画され、読者向けの商品表示は素のテキストリンクに退化した。
復旧を待つ選択肢はゼロ。 Amazon の機嫌に依存しない仕組みを作るしかない。
3ボタンカードのアーキテクチャ
API 依存ゼロで動く手書き HTML カードを設計した。
┌─────────────────────────────────────┐
│ [書影画像] タイトル │
│ 著者 │
│ [Amazon] [楽天] [DMM] │
└─────────────────────────────────────┘
画像ソース(API 不要)
| ストア | 画像ソース | 認証 |
|---|---|---|
| Amazon | m.media-amazon.com/images/P/{ASIN}.jpg | 不要 |
| 楽天 | thumbnail.image.rakuten.co.jp/...?_ex=400x400 | App ID(検索時のみ) |
| DMM | pics.dmm.com/mono/hobby/{cid}/{cid}pl.jpg | 不要 |
Amazon の画像 CDN(m.media-amazon.com/images/P/{ASIN}.jpg)は、有効な ASIN なら認証なしで書影を返す。これが PA-API フリー構成の土台になる。
アフィリエイトリンクの形式
| ストア | URL パターン | トラッキング |
|---|---|---|
| Amazon | amazon.co.jp/dp/{ASIN}/?tag=netouyo01-22 | ✅ アソシエイトタグ |
| 楽天 | hb.afl.rakuten.co.jp/hgc/{AFF_ID}/?pc={target} | ✅ アフィリエイト ID |
| DMM | al.dmm.com/?lurl={target}&af_id=netouyo-990 | ✅ アフィリエイト ID |
楽天ブックス API による書籍キュレーション
手入力の ASIN は信用しない。実際、6記事中2記事で ASIN が間違っていた(4101104409 は「石油の世紀」ではなく「不毛地帯」だった)。以後は楽天の BooksTotal Search API で選書する。
url = f'https://app.rakuten.co.jp/services/api/BooksTotal/Search/20170404'
f'?format=json&keyword={topic}&applicationId={APP_ID}&hits=3&sort=sales'
これで(タイトル・著者・ISBN・書影)の検証済みタプルが手に入る。ASIN の当てずっぽうは終わり。
DMM 検索 URL 形式の発見
DMM の検索 URL は自明でない。5パターン試した。
| パターン | 結果 |
|---|---|
book.dmm.com/search/?keyword=X | ❌ トップへリダイレクト |
book.dmm.com/list/?search_keyword=X | ❌ トップへリダイレクト |
www.dmm.com/search/-/list/?searchstr=X | ❌ 404 |
www.dmm.com/search/=/searchstr=X/ | ✅ 200 OK |
book.dmm.com/search/index/?k=X | ❌ リダイレクト |
正解は -/list/? ではなく =/。どこにもまともに文書化されていない DMM 独自の URL スキーマだ。
REST API の一括処理
その媒体の既存6記事を、WordPress REST API の一括処理で更新した。
- 取得: 各投稿の生コンテンツを取得(
?context=edit) - 抽出: 旧アフィリエイトブロックを抽出(正規表現による境界検出)
- 再構築: 新しい3ボタンカード HTML で組み直す
- 書き戻し: 更新後のコンテンツを POST
リクエスト間隔 0.3 秒で、6記事のバッチ全体が約8秒で完了した。
ブランド表記の正規化(おまけ)
全記事を開いたついでに、ブランド表記の置換も走らせた。
- 全公開記事で
NT Media→NT編集部 - REST API 経由の
str.replace()一括パスで適用
FANZA サイドバーウィジェット(A-lite MVP)
収益実験として、300×300 の商品カードを2枚縦積みした追従サイドバーウィジェットを設置した。
- 上段: DMM.com のホビー/フィギュア(美少女フィギュア、
mono/hobbyAPI) - 下段: FANZA videoa ランキング1位(
digital/videoaAPI)
DMM API 画像の罠
DMM の mono/hobby エンドポイントが返す imageURL には list と small しかなく、large キーがない。だが URL の {cid}ps.jpg → {cid}pl.jpg 置換で 600px 画像が取れる。API ドキュメントには書かれていない。
設置方法
ウィジェット HTML は Cocoon の「サイドバースクロール追従」ウィジェットエリア(カスタム HTML ウィジェット)へ手貼りした。ウィジェット管理用の REST API はなく、Cocoon のウィジェットエリアは WP REST から素直には触れない。
Cocoon ショートコードを使えなかった理由
Cocoon の [amazon asin="X"] ショートコードはエレガントだ。1行で商品データを自動取得し、Amazon+楽天+DMM ボタン付きの美しいカードを描画する。
だが PA-API アクセスが前提になる。資格がないと——
- カードは
product-item-errorの div として描画される - 管理者には「AssociateNotEligible」エラーが見える
- 読者には素の「Amazonで詳細を見る」テキストリンクしか出ない
教訓:収益に直結する UI を、サードパーティ API の稼働状況に依存させない。 CDN 画像を使った手書き HTML は不格好だが、壊れない。
結果
| 指標 | Before | After |
|---|---|---|
| 動作するアフィリエイトリンク | 2/8 記事 | 8/8 記事 |
| 1冊あたりのストア数 | 1(Amazon のみ) | 3(Amazon+楽天+DMM) |
| 書影画像 | 0 | 記事あたり3枚 |
| PA-API 依存 | あり | なし |
| FANZA サイドバー | なし | 追従ウィジェット(2商品) |
| ブランド表記 | 混在 | NT編集部に統一 |
今後
- PA-API の復活: Amazon の成約が3件に達すれば PA-API は自動で再有効化される。その時点で Cocoon ショートコードへ戻す選択肢もあるが、手書きシステムは恒久フォールバックとして十分機能する
- 楽天アフィリエイトの計測確認: 現在は
hb.afl.rakuten.co.jpラッパーを使用。クリックが楽天のダッシュボードに正しく計上されているか要確認 - FANZA サイドバーのローテーション: 現在は静的(手動選定)。Phase 2 では cron+DMM API で週次自動ローテーション
--humanizeリントモード:validate_mdx.pyに AI 臭検出(冷徹、浮き彫りにする、紐解く 等)を追加する
追記(2026-07-19): 立ち上げ期に英語で書いていた記事を、内容そのままに日本語へ改稿した。