2012 年 8 月 4 日 土曜日
Google Apps Scriptには、
が用意されている。UrlFetch Servicesは、指定したUrlからレスポンスを抽出するサービスで、Xml ServicesはXmlを解析するサービス。この2つで何ができるのかというと…。
そう、巷に溢れている様々なWebサービスAPIをApps Scriptから利用できるということだ。このエントリーでは、Google Apps Scriptと楽天商品検索APIを使い、MTブログ形式のログを生成するプログラムを作ってみる。
生成したログをブログにアップロードすることで、簡単にアフィリエイトサイトが作れる!というものだが、できあがるサイトは商品リンクを羅列した、何の価値も無いサイトなので注意して欲しい。
Apps Scriptの公式ドキュメントには、Apps Scriptでコーディングするのはノンプログラマでも問題無いと書かれているが、マクロやスプレッドシート関数、プログラミングの基本的な部分(for()ループやswitchなど)を理解していると習得しやすいとも書かれている。
楽天商品検索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を利用するヒントとして見ていただきたい。
このエントリーのトラックバックURL:
http://www.bmoo.net/archives/2012/02/312746.html/trackback
[…] […]