【Google Apps Script】楽天商品検索APIでアフィリエイトサイト簡単作成ツールを作ってみる: 逆引きGoogle Apps Script

2012 年 8 月 4 日 土曜日

Google Apps Scriptには、

が用意されている。UrlFetch Servicesは、指定したUrlからレスポンスを抽出するサービスで、Xml ServicesはXmlを解析するサービス。この2つで何ができるのかというと…。

そう、巷に溢れている様々なWebサービスAPIをApps Scriptから利用できるということだ。このエントリーでは、Google Apps Scriptと楽天商品検索APIを使い、MTブログ形式のログを生成するプログラムを作ってみる。

生成したログをブログにアップロードすることで、簡単にアフィリエイトサイトが作れる!というものだが、できあがるサイトは商品リンクを羅列した、何の価値も無いサイトなので注意して欲しい。

用意するもの

  • Googleアカウント(Gmail、Google Appsアカウントどちらでも可)
  • サポートされているウェブブラウザ。Google Chrome、Mozilla Firefox、Safari等。
  • 楽天アフィリエイトID
  • 楽天デベロッパーID

Apps Scriptの公式ドキュメントには、Apps Scriptでコーディングするのはノンプログラマでも問題無いと書かれているが、マクロやスプレッドシート関数、プログラミングの基本的な部分(for()ループやswitchなど)を理解していると習得しやすいとも書かれている。

用意しなくても良いもの

  • エディタ。オンラインエディタが用意されている。
  • プラットフォーム。Google SitesまたはGoogleスプレッドシートにプロジェクトを作成することができる。

楽天商品検索APIについて

楽天商品検索APIについて詳しくは、下記を参照して欲しい。

楽天商品検索API

楽天商品検索APIは、楽天市場の商品(共同購入商品・オークション商品・フリマ商品・楽天オークションの個人間オークション商品は除く。)の情報を取得することが可能なAPIです。デベロッパーはキーワードでの商品検索をはじめ、ショップ別・ジャンル別の絞込み検索も可能となります。

ソースコード

Google Apps ScriptプロジェクトはSites、スプレッドシートどちらでも作成することができるが、生成するログはスプレッドシートに出力するので、ここではスプレッドシートにプロジェクトを作成している。

まずはRESTリクエストUrlを定義しておく。

// 楽天商品検索API
var rakutenItemSearchUrl = "http://api.rakuten.co.jp/rws/3.0/rest?" + 
                       "developerId=yourdeveloperid&operation=ItemSearch&version=2010-09-15" + 
                       "&affiliateId=youraffiliateid" + 
                       "&keyword=[keyword]&sort=-reviewCount&page=[page]";

リクエストに対するXMLレスポンスを解析する。

function getXml_(area) {
  var response = UrlFetchApp.fetch(baseUrl+area);
  var xml = Xml.parse(response.getContentText(), false);
  return xml;
}

次に、XMLから指定した属性の値を取り出す関数を用意しておく。

function getValue_(xml, element){
  if (xml == undefined){
    return "";
  }
  var els = xml.getElement().getElements(element);
  return els[0].getText();
}

重複した商品が出力されることがよくあるので、商品名で重複チェックする関数を用意。

// 重複データがないか確認
function hasDuplicate_(ary, value){
  for(var i = 0; i < ary.length; i++){
    if (ary[i][0] == value){
      return true;
    }
  }
  return false;
}

さて、いよいよこのプロジェクトの肝である、楽天商品検索APIにRESTリクエストを送信して、レスポンスを解析した結果をスプレッドシートに出力するコードを掲載する。

function createRakutenItem(){
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getActiveSheet();
  for(var i=1; i<=2; i++){
    // シート名で検索する
    var sheetName = spread.getSheetName();
    var response = UrlFetchApp.fetch(rakutenItemSearchUrl.replace("[keyword]", encodeURI(sheetName)).replace('[page]', i));
    var xml = Xml.parse(response.getContentText(), false); 
    // Body -> Items -> Item
    var body = xml.getElement().getElement("Body").getElement();
    var items = body["Items"]["Item"];
    for(item in items){
      var lastRow = sheet.getLastRow()+1;
      var itemName = items[item]["itemName"].getText();
      
      // check duplicate
      var values = sheet.getRange("B1:B"+lastRow).getValues();
      if (hasDuplicate_(values, itemName)){
        continue;
      }
      sheet.getRange('A'+(lastRow)).setValue("AUTHOR: ");
      sheet.getRange('B'+(lastRow)).setValue("AUTHORNAME");
      sheet.getRange('A'+(lastRow+1)).setValue("TITLE: ");
      sheet.getRange('B'+(lastRow+1)).setValue(itemName);
      sheet.getRange('A'+(lastRow+2)).setValue("STATUS: ");
      sheet.getRange('B'+(lastRow+2)).setValue("Publish");
      sheet.getRange('A'+(lastRow+3)).setValue("ALLOW COMMENTS: ");
      sheet.getRange('B'+(lastRow+3)).setValue("0");
      sheet.getRange('A'+(lastRow+4)).setValue("CONVERT BREAKS: ");
      sheet.getRange('B'+(lastRow+4)).setValue("0");
      sheet.getRange('A'+(lastRow+5)).setValue("ALLOW PINGS: ");
      sheet.getRange('B'+(lastRow+5)).setValue("0");
      sheet.getRange('A'+(lastRow+6)).setValue("PRIMARY CATEGORY: ")
      sheet.getRange('B'+(lastRow+6)).setValue("楽天");
      sheet.getRange('A'+(lastRow+7)).setValue("CATEGORY: ")
      sheet.getRange('B'+(lastRow+7)).setValue("楽天"); 
      sheet.getRange('A'+(lastRow+9)).setValue("DATE: ")   
      sheet.getRange('B'+(lastRow+9)).setValue(Utilities.formatDate(new Date(), "JST", "MM/dd/yyyy HH:mm:ss"));
      sheet.getRange('A'+(lastRow+10)).setValue('------');
      sheet.getRange('A'+(lastRow+11)).setValue('BODY:');
      sheet.getRange('A'+(lastRow+12)).setValue(''+
                                                ''+
                                                '

'+ itemName+'

'+ '

価格:'+items[item]['itemPrice'].getText()+'円

'+ '

商品の概要

'+ '

'+items[item]['itemCaption'].getText()+'

'); sheet.getRange('A'+(lastRow+13)).setValue('-----'); sheet.getRange('A'+(lastRow+14)).setValue('EXTENDED BODY:'); sheet.getRange('A'+(lastRow+16)).setValue('-----'); sheet.getRange('A'+(lastRow+17)).setValue('EXCERPT:'); sheet.getRange('A'+(lastRow+19)).setValue('-----'); sheet.getRange('A'+(lastRow+20)).setValue('KEYWORDS:'); sheet.getRange('A'+(lastRow+22)).setValue('-----'); sheet.getRange('A'+(lastRow+25)).setValue('--------'); } } }

最後に、拡張メニューを追加しておく。

// Menu
function onOpen() {
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [{name: '楽天商品検索', functionName: 'createRakutenItem'}];
  spread.addMenu('API', menuEntries);
}

以上。上記のソースコードをすべて貼り付けて、シート名を例えば「入浴剤」とする。そして拡張メニュー「API > 楽天商品検索」をクリックすると、「入浴剤」シートに、入浴剤の検索結果がMTログ形式で出力される。

あとは、出力されたログをMTログ形式に対応したブログサービスにインポートするだけだ。おそらく、ブログ開設から50ページくらいの商品ページを作るのに5分もかからないだろう。

少しだけコードの解説

32行目では、シート名を取得しており、ここで取得したシート名を検索キーとしている。

var sheetName = spread.getSheetName();

33行目では、1行目で定義しておいたUrlにリクエストを投げている。Urlパラメータのkeywordにはシート名、pageは2回ループして30件ずつ、合計60件取得するように調整している。

var response = UrlFetchApp.fetch(rakutenItemSearchUrl.replace("[keyword]", encodeURI(sheetName)).replace('[page]', i));

36行目では、取得したXMLをパースしている。

 var xml = Xml.parse(response.getContentText(), false); 

繰り返しになるが、このスクリプトで生成したログだけでサイトを作っても、そのサイトには何の価値も無い。あくまでApps ScriptからWebサービスAPIを利用するヒントとして見ていただきたい。

関連記事

コメント / トラックバック 1 件

コメントをどうぞ

トラックバック

このエントリーのトラックバックURL:

http://www.bmoo.net/archives/2012/02/312746.html/trackback