あめのて

活字を垂れ流す

Amazon の Product Advertising API でライトノベルの新着ランキングを取得して自動でWordPressブログを更新してみる

スポンサーリンク

Amazon の Product Advertising API を使ってみたくて、自動ブログ更新システムを組んでみました。

自動で作成した記事がこちら
↓↓↓
2016/02/14 人気ライトノベル | EBOOKS

1日1回、cronでプログラムを走らせて記事を作成しているので、自動アフィリエイトサイトって感じになっています。
完全自動で、このようなライトノベルまとめ記事を作成できました。
何故かたまにタイトルしか取得できてなかったりしますが、まあこれぐらいならいいでしょう。

簡単に作業の流れを書くので、参考にどうぞ。

アソシエイトタグ・アクセスキー・シークレットキーを取得する

まず、 Product Advertising APIを利用するのに必要な文字列たちを集めます。
まあ、会員登録とかの作業ですしネット上にもいっぱい情報があるので、それらを参考にして取得してください。

例えば以下のページとか。 www.panzee.biz

www.panzee.biz

リクエストURLを作成する

Product Advertising API の仕組みは、GETでリクエストURLを作成しXML形式のデータを受け取るようになっています。
リクエストには価格やカテゴリなど、強力な絞り込み検索を与えることができます。
XMLを受け取ってしまえば、あとはどうとでもなるのですが、このリクエストURLの作成がめちゃくちゃややこしくて面倒なんです。
ですがまあ、コピペしてしまえば理解する必要もないので、以下のページを参考にペタペタ作っていきましょう。

あ、ちなみに今回はPHPです。

「Amazon API」の使い方を紹介します!最安値やランキング取得できるよ④-リクエストURLの作成(PHP)と結果(XML)の確認-

<?php

define("Associate_tag", "*****"); // アソシエイトタグ
define("Access_Key_ID", "******************"); // アクセスキー
define("Secret_Access_Key", "**************************************"); // シークレットキー

// リクエストのパラメータ作成
$params = array();
$params["Service"]          = "AWSECommerceService"; //必須パラメーター(なのに選択肢はこれしか無い)
$params["AWSAccessKeyId"]   = Access_Key_ID;
$params["Version"]          = "2013-08-01";          //バージョン指定(現在これが最新なので更新されそうもない)
$params["MinimumPrice"]     = "300";                 //300円以上(タダ同然だとアフィリエイト収入もないので)
$params["AssociateTag"]     = Associate_tag;      
$params["Operation"]        = "BrowseNodeLookup";    //nodeIDで取得するときの指定(後述)
$params["BrowseNodeId"]     = 2410280051;            //ライトノベル(電子書籍)のnodeID
$params["ResponseGroup"]    = "NewReleases";         //新着ランキングを取得

$base_request = ItemSearch($params);
echo "<a href=\"" . $base_request . "\" target=\"_blank\">結果</a>";

//パラメータ渡したらXMLを返してくれるファンクション
function ItemSearch($params = array()){
  $baseurl = "http://ecs.amazonaws.jp/onca/xml";

  //以下なんやかんや処理
  $base_request = "";
  foreach ($params as $k => $v) {
      $base_request .= "&" . $k . "=" . $v;
  }
  $base_request = $baseurl . "?" . substr($base_request, 1);
  $params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
  $base_request .= "&Timestamp=" . $params['Timestamp'];
  $base_request = "";
  foreach ($params as $k => $v) {
      $base_request .= '&' . $k . '=' . rawurlencode($v);
      $params[$k] = rawurlencode($v);
  }
  $base_request = $baseurl . "?" . substr($base_request, 1);
  $base_request = preg_replace("/.*\?/", "", $base_request);
  $base_request = str_replace("&", "\n", $base_request);
  ksort($params);
  $base_request = "";
  foreach ($params as $k => $v) {
      $base_request .= "&" . $k . "=" . $v;
  }
  $base_request = substr($base_request, 1);
  $base_request = str_replace("&", "\n", $base_request);
  $base_request = str_replace("\n", "&", $base_request);
  $parsed_url = parse_url($baseurl);
  $base_request = "GET\n" . $parsed_url['host'] . "\n" . $parsed_url['path'] . "\n" . $base_request;
  $signature = base64_encode(hash_hmac('sha256', $base_request, Secret_Access_Key, true));
  $signature = rawurlencode($signature);
  $base_request = "";
  foreach ($params as $k => $v) {
      $base_request .= "&" . $k . "=" . $v;
  }
  $base_request = $baseurl . "?" . substr($base_request, 1) . "&Signature=" . $signature;
  
  return $base_request;
}

こんな感じで、パラメータを与えてURLを作成し、XMLの結果を取得します。
上記のコードをコピペして、タグとかキーとか埋めて貰えば取得できると思います。たぶん。おそらく。
(僕は無責任なのでネット上に公開するコードをテストしていません)
最後にechoで出してるaタグのリンクから、XMLが正しく取得出来ているか確認してください。

パラメータで指定したnodeIDは、AmazonのカテゴリーページURLのどこかにあります。
Kindleライトノベル以外のnodeIDを取得したい時は、カテゴリーページのURLからそれっぽい数列を探してみましょう。
いくつかそれっぽいのがありますが、とりあえず全部試してみればどれか当たります。
面倒な人は検索すれば出てきます。(そのほうがいい)

ていうかnodeIDっていう名称は間違っていると思う。

記事を作成しWordPressに投稿

取得したXMLから、記事を作成してWordPressに投稿します。
上記で取得したXMLには、商品画像や商品説明がないので、ItemSearch関数を使いまわして改めて取得します。

<?php

// リクエストのパラメータ作成
$params = array();
$params["Service"]          = "AWSECommerceService";
$params["AWSAccessKeyId"]   = Access_Key_ID;
$params["Version"]          = "2013-08-01";
$params["AssociateTag"]     = Associate_tag;
$params["Operation"]        = "ItemLookup";  //ASINで商品取得するよって意味
$params["ResponseGroup"]    = "Large";       //とりあえずいっぱい取得してくるっていう意味

$body = ""; //記事本文(phpでも宣言しないと気持ち悪い)

$xml = simplexml_load_string(file_get_contents($base_request));  //$base_requestは上で取得したやつ
foreach($xml->BrowseNodes->BrowseNode->TopItemSet->TopItem as $top_item) {
  $params["ItemId"] = $top_item->ASIN; //ASINで商品を指定
  $item_request = ItemSearch($params); //上で作った関数
  $amazon_xml=simplexml_load_string(file_get_contents($item_request));
  $item = $amazon_xml->Items->Item; //必要な階層だけにしておく
  
  //本文作成
  $body .= "<h2>".$top_item->Title."</h2>"; //タイトル
  $body .= '<a href="'.$item->DetailPageURL.'"><img src="'.$item->LargeImage->URL.'"></a>';  //画像リンク
  $body .= '<p>'.$item->ItemAttributes->Author.'</p>'; //作者名
  $body .= '<p>'.$item->EditorialReviews->EditorialReview->Content.'</p>'; //商品説明
}

//ワードプレスに投稿
require_once('/home/hoge/hoge/wp-load.php');  //ワードプレスのwp-load.phpを読み込む(とりあえずフルパスで書いておくと安心)
$post_value = array(
  'post_title' => date("Y/m/d")." 人気ライトノベル",// 投稿のタイトル。
  'post_content' => $body, // 投稿の本文。
  'post_status' => 'publish' // 公開ステータス。
);
wp_insert_post($post_value);  //ワードプレスの関数

こんな感じでたぶん動く、と思います。責任は取りません。

まとめ

実はこれをツイッターのbotと連動させたりとかまだまだ色々ややこしいことはやってるんですけど、とりあえず今日はここまで。
あー、つかれた。

広告を非表示にする