ページ本文へ移動
炭火ブログ

MENU

ねこ ねこ

Amazonと楽天APIの併記は規約違反?楽天で商品リンクを自作する

Amazonが用意してくれているAPIを利用し、商品を紹介するリンクをPHPで作っています。これに合わせて楽天のリンクも掲載したいと思いました。AmazonのAPIは30日間で10個の販売実績がないとAPIが使えなくなります。以前は30日間に1個だけの販売実績が必要だった上、今は存在しない画像付きのリンクが用意されていたので、APIが使えなくなると画像付きのリンクに書き換え、1つ買っていただくのを待てばよかったのですが、現在ではAPIが使えなくなったら復活するのは無理かもしれません。

楽天APIの方は細かい条件は無いようで、登録者は最初から使えるようです。30日間で10個売れるように祈っているだけではなく、もし楽天のAPIにAmazonの商品リンクを併記できるなら助かるなと考えました。

まずはAmazon、楽天両APIの利用規約を読み、どちらかのAPIで取得した商品情報に両方のリンクを表示させられるか確認します。

目次
  1. Amazonと楽天のAPI利用規約
  2. 規約の確認は身を助ける
  3. 楽天APIを使って商品リンクを作る
  4. functions.phpに記述するPHPコード
  5. コードの説明

Amazonと楽天のAPI利用規約

結論から申し上げるとよく見る一つの画像、一つの商品名にAmazontと楽天の商品リンクを表示するのは規約上できないと判断しました。以下に楽天とAmazonのAPI利用についての規約の内で他社のコンテンツリンクに該当する部分を抜き出しました。

(4)ウェブサービスの使用によって楽天アフィリエイト以外の方法で収入を得ること(当社が明示的に許可した場合を除く)

(5)楽天アフィリエイトの成果対象となる商品またはサービス(ウェブサービスによるものを含むがこれに限られない)について、楽天アフィリエイト以外のアフィリエイトプログラムを利用すること(当社が明示的に許可した場合を除く)

(6)ウェブサービスを使用して当グループと競合しまたは競合するおそれのあるサービスを提供すること

楽天ウェブサービス規約 - 第10条(禁止行為)

(a)プログラム・コンテンツを、エンドユーザに送り、アマゾン・サイトにおける売上を発生させる目的に限定して使用し、いかなるプログラム・コンテンツに対してまたはこれに関連してリンクしたり、アマゾン・サイト以外のサイトのいかなるページにも直接送客したりせず(ただし、乙のサイトのうちプログラム・コンテンツに密接に関連しない部分には、アマゾン・サイト以外のサイトへのリンクを含むことができます。)、(b)プログラム・コンテンツを、アマゾン・サイトの関連の商品詳細ページまたは他の関連ページにのみにリンクさせ、他のページにはリンクさせないものとします。

アソシエイト・プログラムIPライセンスおよび利用要件

他の販売サイトに誘導してはいけないとはっきり書かれているので、特別に許可を得ない限りは希望の商品リンクは作れないと分かりました。もしもアフィリエイトのかんたんリンクなどは特別に許可を得ているのでしょう。自社の商品を販売するために費用や人材を用意してAPIを維持管理しているのですから、それを利用して競合他社の商品を販売するのを許可しないのは当然でしょう。

規約の確認は身を助ける

規約は常に更新され、更新があればメールで教えてくれます。常に目を通し自身に規約違反が無いのかを気にしています。こういった規約で気をつけるのは今までと同じことをしているのに、ある日規約違反で処分が下るおそれがあることです。現在許されているのは規約に違反していないからではなく、規約違反が知られていないだけかもしれないのです。

あくまで仮定の話ですが、今までは千円以下の支払いを問題なく受けていた。ある商品紹介ページが多くの反響を呼び、今まで経験したことがないくらいの売上を達成し支払いを待っていると、規約違反なので支払いできません、かつアカウントは取り消しますと処分を受けてしまった。

今まで何も言わなかったのはおかしいと思っても、規約上間違った処分ではありません。千円以下の支払いのサイトを全部調査するのに人員は割けないが、高額支払いは少数なのでチェックはできます。規約違反があれば規約に従い支払いはされません。繰り返しますが実際の話ではなく仮定の話ですが、規約を遵守する努力は自分の身を助けます。

楽天APIを使って商品リンクを作る

Amazonとの併記はできないけれど楽天の商品リンクを表示できるようにします。まずは新規アプリ登録のページで登録をします。自身のサイトアドレスとドメインを入力します。QPSについては私の場合はローカル環境でWordPressで作成した静的ファイルをホスティングサービスにアップロードしているので「1」と入力し、PHPコードにAPI仕様ののインターバルを1.1秒取るようにしています。

APIテストフォームを見ると「itemid」を使用すると個別の販売ページを指定できるようです。「itemid」はソースコードのみに記述されているので検索するか、便利なツールを作成してくれている方がいらっしゃるので使わせていただいています。取得した「itemid」とAPIでは製造者が取得できないので製品のメーカーを「maker=""」として以下の形式で入力します。

[rakuten temid="rakuten:10001001" maker="Rakuten"]

functions.phpに記述するPHPコード

functions.phpに以下のコードを加えればショートコードで楽天の商品リンクが表示されます。以下のコードに加えて取得したjsonデータのキャッシュとAPI利用のインターバル時間を1秒以上開けるコードの追加が望ましいです。

<?php
/**
 * 楽天市場 商品紹介ショートコード
 *
 * 使用例: [[rakuten itemid="rakuten:10001001" maker="Rakuten"]]
 *
 * @param array $atts ショートコード属性
 *   - itemid : 楽天アイテムコード(例: rakuten:10001001)
 *   - maker  : メーカー名(任意の文字列)
 * @return string 生成した HTML 文字列
 */
function rakuten_ad_shortcode($atts)
{
    // ショートコード属性のデフォルト値
    $atts = shortcode_atts(
        array(
            'itemid' => '',
            'maker'  => '',
        ),
        $atts,
        'rakuten'
    );
    $item_id = sanitize_text_field($atts['itemid']);
    $maker   = sanitize_text_field($atts['maker']);

    if (empty($item_id)) {
        return '<!-- rakuten shortcode: itemid が指定されていません -->';
    }
    // -------------------------------------------------------
    // 楽天市場 API 設定
    // -------------------------------------------------------
    $application_id = '各自のアプリケーションID';
    $affiliate_id   = '各自のアフィリエイトID';
    $access_key     = '各自のアクセスキー';
    $api_url = add_query_arg(
        array(
            'format'        => 'json',
            'itemCode'      => $item_id,
            'affiliateId'   => $affiliate_id,
            'applicationId' => $application_id,
            'accessKey'     => $access_key,
        ),
        'https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20260701'
    );
    // -------------------------------------------------------
    // API リクエスト(WordPress HTTP API 使用)
    // -------------------------------------------------------
    $response = wp_remote_get($api_url, array(
        'timeout' => 10,
        'headers' => array(
            'Origin'  => '実際のサイトアドレス(末尾のスラッシュなし)',
            'Referer' => '実際のサイトアドレス(末尾のスラッシュあり)',
        ),
    ));
    if (is_wp_error($response)) {
        return '<!-- rakuten shortcode: API リクエスト失敗: ' . esc_html($response->get_error_message()) . ' -->';
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE || empty($data['Items'][0]['Item'])) {
        return '<!-- rakuten shortcode: API レスポンスの解析に失敗しました -->';
    }
    // -------------------------------------------------------
    // データ取得
    // -------------------------------------------------------
    $item = $data['Items'][0]['Item'];
    //商品名
    $itemName = isset($item['itemName']) ? $item['itemName'] : '';
    //alt用短い商品名
    $limit = 20;
    $shortName = '';
    if (mb_strlen($itemName) >= $limit) {
        $shortName = mb_substr($itemName, 0, $limit);
        $shortName = $shortName . '…';
    }
    //商品アフィリエイトリンク
    $itemUrl = isset($item['affiliateUrl']) ? $item['affiliateUrl'] : '';
    //商品画像
    $itemImage = isset($item['mediumImageUrls'][0]['imageUrl']) ? $item['mediumImageUrls'][0]['imageUrl'] : '';
    $itemImage = str_replace("128x128", "400x400", $itemImage);
    // -------------------------------------------------------
    // 出力 HTML
    // -------------------------------------------------------
    if (empty($itemUrl) || empty($itemName)) {
        return '<!-- rakuten shortcode: 商品情報が取得できませんでした -->';
    }
    $html = '<a class=a1 href="' . esc_url($itemUrl) . '" target="_blank" rel="sponsored noopener"><div><img src=' . esc_url($itemImage) . ' alt="' . esc_attr($shortName) . '" width=200 height=200></div><div><div>' . esc_html($itemName) . '</div><div>' . esc_html($maker) . '</div>楽天市場</div></a>';

    return $html;
}
add_shortcode('rakuten', 'rakuten_ad_shortcode');

コードの説明

楽天商品APIはリクエストの発信元のドメインが登録されているものと同じかチェックします。ローカル環境でコードを動作させるために登録しているサイトであることを知らせなくてはいけません。そこで、「API リクエスト(WordPress HTTP API 使用)」の処理でサイトの情報を送ります。当サイトの場合は以下のように記述します。

// -------------------------------------------------------
// API リクエスト(WordPress HTTP API 使用)
// -------------------------------------------------------
$response = wp_remote_get( $api_url, array(
    'timeout' => 10,
    'headers' => array(
        'Origin'  => 'https://sumibi-blog.com',
        'Referer' => 'https://sumibi-blog.com/',
    ),
) );

APIか取得できる画像は最大で128x128pxと小さいです。最大で200x200pxの商品画像を表示させたいので最小でも400x400pxの画像が欲しいので、手段を調べるとサイズの大きい画像が用意されているらしく、アドレスの画像サイズ部分を変更すると400x400pxの画像が表示されました。

$itemImage = str_replace("128x128", "400x400", $itemImage);

楽天アフィリエイトは審査がなく、商品APIは誰でも使えるのでありがたいと感じました。

まんがでわかる はじめての楽天アフィリエイト: 不安ゼロから始める、あなたの初報…
まんがでわかる はじめての楽天アフィリエイト: 不安ゼロから始める、あなたの初報酬ストーリー
副業ナビゲーター MAKIRON 著
Amazon.co.jp

最後までお読みいただき、誠にありがとうございます。