こんばんは。
EC-CUBE用のテストデータを登録するためのCSVファイルを作る必要があって、簡単なスクリプト書いたので公開しておきます。
今回は、楽天ランキングAPIのデータを使ってテストデータのCSVを作成し、EC-CUBEのテストデータとして登録する手順を紹介します。
間違ってもそのまま公開しないように!
EC-CUBEのWeb管理ツールで手動でカテゴリ登録する
まず、EC-CUBEのWeb管理ツールでカテゴリを一つたとえば「ゴルフ」を手動で登録します。
登録したカテゴリのIDを管理ツール上で確認します。
ここでは「ゴルフ」のカテゴリIDが「5」だったとします。
楽天ジャンルIDの取得する
楽天のジャンル一覧で「ゴルフ」のジャンルIDを確認します。
ゴルフのジャンルIDは「101077」でした。
楽天ジャンルID(genreId)検索
必要なコードを準備
Simple JSON parser & builder
以下のサイトからJSON解析スクリプトをダウンロードし「jsonparser.rb」とします。ここにも置いておきます。
http://rubyforge.org/snippet/detail.php?type=snippet&id=148
httpclient
画像ファイルを取得するのにhttpclientを利用しているのでインストールします。
$ sudo gem install httpclient
以下のrubyスクリプトをコピーして適当な名前で保存します。
ここでは「itemgen.rb」とします。
ざっくしとした説明です。
- setupメソッドでIDで設定を行う
- csv_formatメソッドでCSV形式を定義する
- rewriteメソッドでCSVの内容を定義する
$KCODE='u' require 'rubygems' require 'httpclient' require 'open-uri' require 'kconv' require 'jsonparser.rb' require "fileutils" require 'jcode' # 初期設定 def setup $developer_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # APIのためのデベロッパID $img_dir = 'img' # 画像保存ディレクトリ名 $item_csv_filename = "item.csv" # 商品CSVファイル名 $genre_id = ARGV[0] # 楽天ジャンルID $category_id = ARGV[1] # カテゴリID $max_page = ARGV[2] # 取得ページ数(1ページ30商品で10ページまであるらしい) end # CVSフォーマット(HashをsortしてArray返してるので注意) def csv_format { 0 => "商品ID", 1 => "商品規格ID", 2 => "規格名1", 3 => "規格名2", 4 => "商品名(必須)", 5 => "公開フラグ(1:公開 2:非公開)(必須)", 6 => "商品ステータス(必須)", 7 => "商品コード", 8 => "通常価格 ", 9 => "販売価格(必須)", 10 =>"在庫数", 11 =>"送料", 12 =>"ポイント付与率(必須)", 13 =>"購入制限", 14 =>"メーカーURL", 15 =>"検索ワード", 16 =>"備考欄(SHOP専用)", 17 =>"一覧-メインコメント(必須)", 18 =>"一覧-メイン画像(必須)", 19 =>"メインコメント(必須)", 20 =>"メイン画像(必須)", 21 =>"メイン拡大画像", 22 =>"カラー比較画像", 23 =>"商品詳細ファイル", 24 =>"詳細-サブタイトル(1)", 25 =>"詳細-サブコメント(1)", 26 =>"詳細-サブ画像(1)", 27 =>"詳細-サブ拡大画像(1)", 28 =>"詳細-サブタイトル(2)", 29 =>"詳細-サブコメント(2)", 30 =>"詳細-サブ画像(2)", 31 =>"詳細-サブ拡大画像(2)", 32 =>"詳細-サブタイトル(3)", 33 =>"詳細-サブコメント(3)", 34 =>"詳細-サブ画像(3)", 35 =>"詳細-サブ拡大画像(3)", 36 =>"詳細-サブタイトル(4)", 37 =>"詳細-サブコメント(4)", 38 =>"詳細-サブ画像(4)", 39 =>"詳細-サブ拡大画像(4)", 40 =>"詳細-サブタイトル(5)", 41 =>"詳細-サブコメント(5)", 42 =>"詳細-サブ画像(5)", 43 =>"詳細-サブ拡大画像(5)", 44 =>"発送日目安", 45 =>"おすすめ商品(1)", 46 =>"詳細-サブコメント(1)", 47 =>"おすすめ商品(2)", 48 =>"詳細-サブコメント(2)", 49 =>"おすすめ商品(3)", 50 =>"詳細-サブコメント(3)", 51 =>"おすすめ商品(4)", 52 =>"詳細-サブコメント(4)", 53 =>"おすすめ商品(5)", 54 =>"詳細-サブコメント(5)", 55 =>"おすすめ商品(6)", 56 =>"詳細-サブコメント(6)", 57 =>"商品カテゴリ(必須)" }.sort_by{|k,v|k} end # CSVの値を定義(フォーマットの列番号に対応。xにはAPIで取得したitemが入る) def rewrite { 4 =>lambda{|x| cut_off(x["itemName"].to_s.toutf8.gsub(/【.[^【]*】/, '').gsub("楽天",''),45)}, #【】は取る 5 =>lambda{|x| "1"}, 6 =>lambda{|x| "0"}, 7 =>lambda{|x| x["itemCode"]}, 9 =>lambda{|x| x["itemPrice"]}, 10 =>lambda{|x| "20"}, 12 =>lambda{|x| x["pointRate"]}, 17 =>lambda{|x| s = cut_off(x["itemCaption"].to_s.toutf8.gsub("楽天",'').gsub('。','。'),50) ; s == "" ? "-" : s}, 18 =>lambda{|x| image_get(x["smallImageUrl"],x["itemCode"] + "_s.gif")}, 19 =>lambda{|x| s = x["itemCaption"].to_s.toutf8.gsub("楽天",'').gsub('。','。') ; s == "" ? "-" : s}, 20 =>lambda{|x| image_get(x["mediumImageUrl"],x["itemCode"] + "_m.gif")}, 57 =>lambda{|x| $category_id} } end def image_get(image_url,save_file_name) hc = HTTPClient.new f = File.open("#{$img_dir}/" + save_file_name, "wb") f.print(hc.get_content(image_url)) f.close save_file_name end def api_call(uri) json_string = '' open(uri){|f| json_string = f.read } parser = JsonParser.new parser.parse(json_string) end def cut_off(text,len) if text != nil text.jlength < len ? text : text.scan(/^.{#{len}}/m)[0] + "…" else '' end end setup # ファイルを掃除しとく FileUtils.remove_entry($img_dir,true) FileUtils.mkdir($img_dir) FileUtils.rm($item_csv_filename, {:force=>true}) File.open($item_csv_filename,'w') do |f| # ヘッダ行を追加 f.puts(csv_format.collect{|col| "\"#{col[1]}\""}.join(',')) (1..$max_page.to_i).each do |page| items = [] ranking_api_url = "http://api.rakuten.co.jp/rws/3.0/json?developerId=#{$developer_id}&operation=ItemRanking&version=2010-08-05&genreId=#{$genre_id}&page=#{page}" # APIを呼び出して戻り値のアイテムをもとにCSV行を作成 obj = api_call(ranking_api_url) exit unless obj["Body"]["ItemRanking"] rakuten_items = obj["Body"]["ItemRanking"]["Items"]["Item"] puts "ページ#{page} から #{rakuten_items.size} 件取得しました。" rakuten_items.each do |item| items << csv_format.collect do |col| i=col[0] rewrite[i] ? rewrite[i].call(item) : "" end end # 出力 items.each do |item| f.puts(item.collect{|col| "\"#{col.to_s.gsub(',','')}\""}.join(',')) end end end
実行する
以下のコマンドで実行します。
パラメータは「ジャンルID カテゴリID 取得ページ数」です。
$ ruby itemgen.rb 101077 5 3
- item.csv
- imgディレクトリ
が生成されます。
画像を配置する
先に画像を配置しておく必要があるので、imgディレクトリ内の全画像を、
「html/upload/save_image/」に配置します。
登録する
Web管理ツールからCSVファイルを登録します。
完了
以上です。いろいろと使えそうな気がしますね。

[...] This post was mentioned on Twitter by naoki yanai, Rubyist Bot and EC情報館, Rubyist Bot. Rubyist Bot said: RT @yanaoki: せっかくなのでブログに書いた → EC-CUBEの商品登録CSVデータを生成するRubyスクリプト http://t.co/AUaDBii via @yanaoki [...]
great…