🧠 概要:
概要
この記事では、プログラミング初心者向けに、Keepa APIを使用してAmazon商品のASINから商品データ(タイトル、価格、画像など)をGoogle Apps Script(GAS)で自動的に取得する方法を詳しく解説しています。手動で情報を収集する手間を削減し、業務効率化を目指す内容です。
要約
- 目的: Keepa APIを活用して、Amazon商品のデータを自動取得。
- 対象読者: プログラミング初心者。
- 主な流れ:
- Keepa APIの基礎知識とAPIキーの取得方法。
- ASINからのデータ取得方法の解説。
- GASを使った自動化の手順。
- 記事で得られること:
- 商品タイトル、JANコード、画像URLの自動取得。
- Keepaの価格推移グラフへのリンクの自動挿入。
- BuyBox価格、最安値の計算と入金額の推定。
- 注意点:
- APIの使用回数制限について。
- 手数料や送料は概算であること。
- スプレッドシートの準備: ASINを入力する欄の作成。
- コード例: GASのエディタを使い、具体的なコードを示しながら解説。
- 結論: Keepa APIを利用することで、効率的に商品の情報を集めることができる。
この記事ではプログラミング初心者に向けてkeepaAPIを使ってAmazon商品のASINから商品データ(タイトル・価格・画像など)をGAS(Google App Script)を使って自動で取得する方法を初心者の方に向けて分かりやすく解説いたします。keepaAPIを使えば通常は手作業で集めなければいけない情報もプログラムで自動で取得することが可能になります。これによりリサーチ作業の効率化や自動化の第一歩を踏み出すことが出来ます。また実際に動かしてみて分かる「keepaAPIの注意点」や「つまづきやすいポイント」などもご紹介していきます。
プログラミング初心者の方でもこの記事を読めば
-
keepaAPIの基礎知識
-
APIキーの取得方法
-
ASINを使った商品のデータを取り出す方法
-
GASを使った自動化ができる
と、一連の流れを体験していただけます。「難しそう」と感じる方もひとつずつゆっくりと進めていきましょう。
この記事を読んで得られること
この記事ではAmazonのID(ASIN)を使ってKeepa API × Google Apps Script(GAS)を活用し、商品情報をスプレッドシートに自動取得する方法を初心者向けにわかりやすく解説します。
出来るようになること
この記事を読んでいただくと以下のようなことが出来るようになります。初めて聞く言葉もあるかと思いますが難しくないのでひとつずつ進めていきましょう。
-
ASINから商品タイトル・JANコード・画像URLを自動取得
-
Keepaの価格推移グラフへのリンクをスプレッドシートに自動挿入
-
BuyBox価格や最安値、さらに想定入金額(手数料控除後)を自動計算
ひとつずつ丁寧に解説していきますので一緒に進めてみてくださいね。
keepa(キーパ)とは
keepaとはAmazon商品の価格履歴やランキング、在庫状況などを見ることが出来るサービスです。せどりや物販、商品リサーチに役立つツールとして有名です。keepaAPIを使えばプログラムから直接色んなデータを取得することが出来ます。
keepaAPIとは
APIとは、アプリやサービス同士がデータをやり取りする仕組みのことです。APIは Application Programming Interface(アプリケーション プログラミング インターフェイス) の略で、簡単に言うと 「アプリとやり取りするための窓口」 のようなイメージです。例えば、プログラムから・「この商品のタイトルを教えて」・「最新の価格を教えて」
とリクエストを送ると、Keepaがデータを返してくれる仕組みになっています。このやり取りを可能にするために必要なのが、Keepa API(Keepaの窓口) ということになります。
keepaAPIは無料で使える?
keepaグラフをウェブ上で見るのは無料で行えますがkeepaAPIを使用するには有料プランへの登録が必要となります。月額と年額の2種類ありまず試してみたい方は月額プランへの加入をお勧めします。
keepaAPI登録方法
こちらからkeepaのホームページを開きます。右上の「ログイン/アカウントの登録」をクリック。
次のウィンドウでアカウント登録に必要な情報「ユーザー名」「パスワード」「メールアドレス」を入力し【アカウント登録】の青いボタンをクリックします。
すると次にこのようなウィンドウが出てきます。
登録したメールアドレスに「Welcome to Keepa.com!」というタイトルでメールが届いてるはずなので開いてリンクをクリックします。するとkeepaのページに戻ります。最初にクリックした右上の「ログイン/アカウント登録」の所があなたのユーザー名になっているはず!これでkeepaの登録はOKです。
有料プラン申し込み方法
先ほどの画面右上のユーザー名に変わったところにマウスポインタを持っていくとメニューが開きますそこから「サブスプリクション」をクリックしてください。開いた画面の左側【SUBSCRIBE】という青いボタンをクリックします。するとクレジット番号など登録する画面に行きますので必要な情報を入力してください。これで登録は完了です。
APIキー取得
有料プランに登録したらAPIキーを取得することが出来ます。keepaの画面で上に並んでいるメニューから操作していきます。
-
上のメニューから「アプリ」をクリック
-
サブメニューから「keepa API」をクリック
-
YOUR ACCSECEから中間に記載の「Private API access key」をコピー
こちらがあなたのAPIキーになります。これは他人に見られないよう大切に保管してください。
keepaAPIを使用するときの注意点
・API使用回数には制限がある(クレジット制)
keepaAPIはクレジット制になっていて使用するたびにクレジットが減っていきます。大量の処理を行うと利用制限がかかってしまうことがあるので注意が必要です。
・手数料や送料は概算
keepaAPIでは「想定される販売手数料」が提供されますが、これはあくまで概算です。Amazomの手数料は商品カテゴリや価格によって変わります。(ビューティカテゴリは変動します。)keepaAPIはこの細かい変動までカバーしていないので注意が必要です。
GASで実際にデータを取得してみよう
ここからは実際にGASを使ってkeepaAPIからAmazon商品のデータを取得してみましょう。取得するのは下の3つの基本情報です。
-
商品のタイトル
-
商品画像のURL
-
JANコード(バーコード)
この時に使うのがASINというAmazomの商品を識別するための番号です。ASINについては後ほど詳しくご紹介しますね。
スプレッドシートの準備をしよう
今回はスプレッドシートに手動で入力したASINから情報を取得していくためASINを入力する欄を作ります。今回はB列に記入していくことにします。続いてC列にはJANコードを入力する欄、D列には
動作確認のコードを書いてみよう
まずはGASの準備から。スプレッドシートに情報を記入していくのでスプレッドシートの拡張機能からエディターを開きましょう。
やり方は
-
Googleスプレッドシートを新規作成
-
メニューの「拡張機能」→「Apps Script」をクリック
エディタが開けたら次に動作確認のコードを書いていきます。まずコード全体はこちら
function textKeepaAPI() { const apiKey = 'ご自身のAPIキーを入力'; const asin = 'B0CQN6FYLN'; const url = `https://api.keepa.com/product?key=${apiKey}&domain=5&asin=${asin}&history=0`; const response = UrlFetchApp.fetch(url); const json = JSON.parse(response.getContentText()); if(json.products && json.products.length > 0){ const product = json.products[0]; Logger.log("商品タイトル:"+product.title); Logger.log("JANコード:"+product.ean); }else{ Logger.log("商品が見つかりませんでした。"); }}
まず初めにkeepaのAPIキーを設定します。先ほど取得したkeepaAPIのキーを記入してください。
const apiKey = 'ご自身のAPIキーを入力';
次にASINを入力してみます。ASINとはAmazonが販売する書籍以外の商品を管理するための識別コードになり10桁の英数字で表記されています。取得方法はいくつかありますが簡単な方法をご紹介いたします。
・商品ページの登録情報から取得
リサーチしたい商品の下の方に「登録情報」というところがありますのでそこにASINと表記されています。(Amazom商品には掲載がないこともあります)
・商品URLから取得
商品ページのURLの中にも記載されています。AmazonのFire TV Stickだと
https://amazon.co.jp/Amazon-Fire-TV-Stick-HD-大画面でフルHDの楽しさを簡単に-ストリーミングメディアプレイヤー/dp/B0CQN6FYLN/ref=zg_bs_g_amazon-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
このB0から始まる10桁の英数字がASINになります。
const asin = 'B0CQN6FYLN';
では次にkeepaAPIへアクセスするためのURLを作ります。
const url = `https://api.keepa.com/product?key=${apiKey}&domain=5&asin=${asin}&history=0`;
-
keepaのエンドポイント
-
keepaAPIにアクセスするためのAPIキー
-
Amazomのどこの国かを設定し(日本は”domain=5”)
-
取得したい商品のASINの指定
-
商品価格の履歴が必要かを指示(”0”=取得しない、”1”=取得する)
次にkeepaAPIへリクエストを送り受け取ったデータを取り出していきます。
const response = UrlFetchApp.fetch(url);const json = JSON.parse(response.getContentText());
そして取得したデータから商品情報を取り出していきます。
keepaAPIのレスポンスの商品情報は「products」という配列に入っています。配列の中にデータが入っているかをチェックしデータが入っていればあその中から「商品タイトル(product.title)」と「JANコード(product.ean)」が表示されるかを確認します。
if(json.products && json.products.length > 0){ const product = json.products[0]; Logger.log("商品タイトル:"+product.title); Logger.log("JANコード:"+product.ean); }else{ Logger.log("商品が見つかりませんでした。"); }
商品データを取得していく
動作確認のコードが書けたので本格的にコードを書いていきたいと思います。全体の流れとしては
-
スプレッドシートに入力されたASINを読み込む
-
ASINごとにkeepaAPIにアクセスする
-
商品情報を取得して整理する
-
価格データから「入金金額」を計算する
-
取得した情報をスプレッドシートに入力する
この流れで進めていきたいと思います。
スプレッドシートからASINを読み込む
今回はスプレッドシートに入力されたASINから情報を取得してくるのでまずはスプレッドシートの準備をします。
B列にASINを入力しC列にはJANコード、D列に商品画像、E列に商品タイトルを入力していきます。
最初にkeepaAPIキーを設定しスプレッドシートを指定してB2以降に入力されたASINを順に読み込んでいきます。
function fechKeepaData() { const apiKey = 'ag3vii6rnphnsk3ud0q724ml0kecrrjipejahnn7l53sm32iaukhoulu56auf5qo'; const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const asinValues = sheet.getRange("B2:B").getValues().flat().filter(String);
ASINから商品情報を取り出していく(JANコード、商品タイトル、商品画像)
次に取得したASINの内容を一つずつ取り出していく処理をします。for文でASINの長さだけ繰り返しkeepaAPIへアクセスするためのURLを作ります。
for(let i = 0;i < asinValues.length; i++){ const asin = asinValues[i]; const url = `https://api.keepa.com/product?key=${apiKey}&domain=5&asin=${asin}&history=1`;
エラーが出た時にも最後まで処理が進むようtry{}で囲み最後にどのエラーがあったのかを出力するためにcatch(e){}を使ってどこでエラーが出たのかを出力させます。
try{ const xxxxxxxxxxxxxxxxxxxx const xxxxxxxxxxxxxxxxxxxxxxx ・ ・ ・ ・}catch(e){ Logger.log(`エラー発生(ASIN:${asin} : ${e}`);}
その中に引き続きコードを書いていきます。まずは先ほど作ったアドレスを使用してkeepaAPIへアクセスし、帰ったきた情報をjsonの中に格納します。
try { const response = UrlFetchApp.fetch(url); const json = JSON.parse(response.getContentText());
以前、ASINの情報は「products」という配列の中に入っているとお伝えしました。ここでその中の情報を取り出して「product」という変数に入れていきます。
if(json.products && json.products.length > 0){ const product = json.products[0];
productの中に入っている「JANコード(ean)」と「商品タイトル(title)」を取得していきます。ここでは情報が入っていなかった場合「JANなし」や「タイトルなし」と表示させたいのでnull 合体演算子を使用しています。
const jan = product.ean ?? "JANなし"; const title = product.title ?? "タイトルなし";
null 合体演算子とはproduct.eanがnullやundefinedだった時に??の右側のタイトルなしやJANなしを表示させることが出来ます。
次に商品画像を取得する処理を書いていきたいと思います。画像のレスポンスは画像のURLが画像ファイル名の一覧でまとめて入ってきます。その中の一番最初の画像だけ取り出し画像URLを作成し、データが入ってなかったら「画像なし」と表示させるようにしていきます。
画像ファイル名の一覧はこのような感じで入っています。
"81h2dF3BfFL._AC_SL1500_,61bGgZRrmCL._AC_SL1000_,71TKhQfsXPL._AC_SL1500_"
このカンマ(,)ごとに区切って配列にしていき、最初のひとつ目 [0] を取り出していきます。
const imageUrlRaw = product.imagesCSV?.split(",")[0];
画像が入っていなければ「画像無し」を返し、入っていれば先ほど取り出したひとつ目のファイル名をhttps://images-na.ssl-images-amazon.com/images/I/に付け足すことで画像のURLを作成することが出来ます。
const imageUrl = imageUrlRaw?.[0]?`https://images-na.ssl-images-amazon.com/images/I/${imageUrlRaw}`:"画像無し";
次にグラフを表示させるコードを書いていきます。こちらはシンプルで取得したASINをURLに追加するだけになります。
const graphUrl = `https://keepa.com/#!product/5-${asin}`;
ASINから価格の取得を行う
では次に価格の取得を行っていきます。まずはproductの中にcsvがあるかどうかをチェックし、なければ空のオブジェクトを返すコードを書きます。
const csv =product.csv ?? {};
そして、新商品の価格はcsv[“1”]、BuyBoxはcsv[“5”]で取得します。こちらもなければ空の配列を返すようにしていきます。
const newPriceHistory = csv["1"] ?? [];const buyBoxPriceHistory = csv["5"] ?? [];
次にgetLatestValidPrice()という関数を別で定義し、その関数から最新の価格を取得していきます。
const latestNewPrice =getLatestValidPrice(newPriceHistory);const latestBuyBoxPrice =getLatestValidPrice(buyBoxPriceHistory);
function getLatestValidPrice()関数を別で定義していきたいと思います。csvで入ってくる価格は末尾が最新の価格になるので後ろから順番に見て行って数値として有効な価格(0より大きい数字)が入っていればそれを返すという関数になります。このkeepaの価格データは(価格1、時間1、価格2、時間2・・・・・・)のように価格は二つおきに並んでいるので
for(let i =dataArray.length - 1; i >= 0; i -= 2)
(i -= 2)とすることで価格だけを取り出すことが出来ます。全体のコードはこちら。
function getLatestValidPrice(dataArray){ if(!Array.isArray(dataArray)) return null; for(let i =dataArray.length - 1; i >= 0; i -= 2){ const price = dataArray[i]; if(typeof price === "number" && price >0){ return price; } } return null;}
ではここから最安値+送料の価格、手数料を引いた入金金額を出していきます。今回は送料を仮に400円と仮定して宣言します。
const shippingFee = 400;
BuyBoxの価格が取得できればそちらを採用し、なければ最新の価格に送料を足したものを採用、どちらもなければnullと返すよう定義します。
let finalPrice = null if(typeof latestBuyBoxPrice === "number" && latestBuyBoxPrice > 0){ finalPrice = latestBuyBoxPrice;}else if(typeof latestNewPrice === "number" && latestNewPrice > 0){ finalPrice = (latestNewPrice + shippingFee );}else{ finalPrice = null; }
そして販売手数料を引いた入金金額も知りたいのでその金額も入力できるようにします。今回は手数料が15%引かれる想定にしています。finalPriceが取得できない場合には「計算不可」と出力されるようになっています。
const payout = typeof finalPrice === "number" ? finalPrice *0.85 : "計算不可";
価格表示のポイントはこちら
-
優先順位:BuyBox価格 > 新品価格+送料
-
入金額は、販売価格の85%で計算(手数料15%想定)
-
「価格が取得できないケース」も想定してフォールバックを用意
スプレッドシートに記載していく
まず書き込んでいく行を指定します。B2から書き込みますのでi + 2にします。
const row = i + 2;
次にC列にJANコード、E列に商品タイトルを記入するように指定します。
sheet.getRange(`C${row}`).setValue(jan);sheet.getRange(`E${row}`).setValue(title);
そして商品画像をD列に表示させるコードを書きます。この時画像のURLが取得できていれば画像を表示させ、なければ「画像無し」と記入します。この時、setFormula()を使ってIMAGE関数をD列に表示させるようにしています。setValue()は文字や数値などの中身を入力するときに使用しsetFormula()は=で始まる関数を入力するときに使います。
if(imageUrl === "画像無し"){ sheet.getRange(`D${row}`).setValue("画像無し");}else{ sheet.getRange(`D${row}`).setFormula(`IMAGE("${imageUrl}")`);}
次にグラフを表示させますがF列に表示するように設定します。グラフも「=HYPERLINK」関数を使うのでsetFormula()で入力していきます。
sheet.getRange(`F${row}`).setFormula(`=HYPERLINK("${graphUrl}", "グラフ")`);
そして最後、価格の入力を行います。G列には以前求めたfinalPrce(BuyBoxの価格もしくは最新の価格に送料を足したもの)が入っていればそちらを入力し、なければ「取得不可」と入力します。
sheet.getRange(`G${row}`).setValue(finalPrice ?? "取得不可");
次にfinalPriceに数値が入っていればpayout(手数料を引かれた入金額)を入力し、nullなど数値以外が入力されたときに「計算不可」と表示させるようにします。こうすることで価格が取れなかった場合も代わりの値を入力することが出来ます。
sheet.getRange(`H${row}`).setValue(typeof finalPrice === "number" ? payout : "計算不可");
コード全体
function getLatestValidPrice(dataArray){ if(!Array.isArray(dataArray)) return null; for(let i =dataArray.length - 1; i >= 0; i -= 2){ const price = dataArray[i]; if(typeof price === "number" && price >0){ return prige; } } return null;} function fechKeepaData() { const apiKey = 'ご自身のkeepaAPIキー'; const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const asinValues = sheet.getRange("B2:B").getValues().flat().filter(String); for(let i = 0;i < asinValues.length; i++){ const asin = asinValues[i]; const url = `https://api.keepa.com/product?key=${apiKey}&domain=5&asin=${asin}&history=1`; try { const response = UrlFetchApp.fetch(url); const json = JSON.parse(response.getContentText()); if(json.products && json.products.length > 0){ const product = json.products[0]; const title = product.title ?? "タイトルなし"; const jan = product.ean ?? "JANなし"; const imageUrlRaw = product.imagesCSV?.split(",")[0]; const imageUrl = imageUrlRaw?.[0]?`https://images-na.ssl-images-amazon.com/images/I/${imageUrlRaw}`:"画像無し"; const graphUrl = `https://keepa.com/#!product/5-${asin}`; const csv =product.csv ?? {}; const newPriceHistory = csv["1"] ?? []; const buyBoxPriceHistory = csv["5"] ?? []; const latestNewPrice =getLatestValidPrice(newPriceHistory); const latestBuyBoxPrice =getLatestValidPrice(buyBoxPriceHistory); const shippingFee = 400; let finalPrice = null; if(typeof latestBuyBoxPrice === "number" && latestBuyBoxPrice > 0){ finalPrice = latestBuyBoxPrice; }else if(typeof latestNewPrice === "number" && latestNewPrice > 0){ finalPrice = (latestNewPrice + shippingFee ); }else{ finalPrice = null; } const payout = typeof finalPrice === "number" ? finalPrice *0.85 : "計算不可"; const row = i + 2; sheet.getRange(`C${row}`).setValue(jan); sheet.getRange(`E${row}`).setValue(title); if(imageUrl === "画像無し"){ sheet.getRange(`D${row}`).setValue("画像無し"); }else{ sheet.getRange(`D${row}`).setFormula(`IMAGE("${imageUrl}")`); } sheet.getRange(`F${row}`).setFormula(`=HYPERLINK("${graphUrl}", "グラフ")`); sheet.getRange(`G${row}`).setValue(finalPrice ?? "取得不可"); sheet.getRange(`H${row}`).setValue(typeof finalPrice === "number" ? payout : "計算不可"); }else{ Logger.log(`商品が見つかりませんでした:${asin}`); } }catch(e){ Logger.log(`エラー発生(ASIN:${asin} : ${e}`); } }}
今回のコードの注意点
keepaAPIで価格を取得するには限界があります。送料や手数料など正確に取得できないデータもありますので、もっと正確な数値が欲しい場合にはAmazomのAPI(Amazon Selling Partner API、通称「SP-API」)を利用するのがいいと思います。
ですが、Amazonセラーに登録しておかなければいけなかったり、審査があったりと使うのにハードルが高いところはデメリットとして挙げられます。ご自身の状況に合わせて使い分けするのが良いかなと思います。
まとめ
いかがでしたでしょうか。AmazonのID(ASIN)を使ってKeepa API × Google Apps Script(GAS)を活用し、商品情報をスプレッドシートに自動取得する方法をお伝えいたしました。今回のコードは「価格情報取得」の基本形として応用もしやすいので、ぜひご自身の作業に合わせてカスタマイズして使ってみてくださいね!
また記事に不明点などありましたらコメントやXもやっていますのでお気軽に質問してくださいね。
本記事を読んで「良かった!」と思っていただけましたら「いいね」を押していただけますと今後のモチベーションにもつながりますのでぜひともよろしくお願いします!
最後までお読みいただき、ありがとうございました。
Views: 0