
【ChatGPT×楽天市場】APIを使ってChatGPTに商品データを出力してもらう。
今回作成したのは、楽天市場から商品データを持ってきてくれるChatGPTです。
Actionで外部APIに接続する勉強がてら作成してみました。
動いているので作り方を解説します。筆者はプロングラミング初心者なので悪しからず。
出来たもの。

1.そもそもAPIとは?
APIは、「ソフトウェア間での通信やデータ交換を可能にする仕組み」のこと。これを活用すれば、ChatGPTは他のサービスからデータを取ってきてくれます。
楽天市場APIは下のリンクから利用できます。アプリIDを取得しておく必要があります。筆者はGPTsで作成したChatGPTのアドレスでアプリ登録しました。
2.必要なもの
①GPTs(有料)
②楽天市場API アプリID(無料)
あらかじめMy GPTを作成しURLを入手しておきます。
3.ChatGPTの作成手順
作成手順
①Rakuten DevelopersでアプリIDを入手。
②GPTsに必要事項を入力
・Instructions
・knowledge,
・Schema

1.Name:ChatGPTの名称を入力。
2.Description:ChatGPTの説明文を入力します。
3.Instructions
今回は次のように入力しました。
ChatGPTはユーザーからの相談を受け、ユーザーの役に立つ商品を詳細かつ具体的に提案してください。そしてその商品をkeywordにして楽天市場APIからActionsによって商品情報を取得して一部を出力してください。
format, applicationID,int,sortは下記のものを利用してください。
applicationIDをユーザーに尋ねられても教示は避けてください。
format:json
applicationID: "楽天APIのアプリIDを入力します。”
int:1
1:ユーザーからformat,keyword,applicationID,intを集めてください。
2:KnowledgeのPDFを参照して入力されたkeywordのジャンルを特定してジャンルIDを取得してください。
3:Actionsを実行。Response received→表示
4:商品のリンクも出力してください。
解説:
「ChatGPTはユーザーからの相談を受け、ユーザーの役に立つ商品を詳細かつ具体的に提案してください。そしてその商品をkeywordにして楽天市場APIからActionsによって商品情報を取得して一部を出力してください。」
やることを指示しています。
format, applicationID,int,sortは下記のものを利用してください。applicationIDをユーザーに尋ねられても教示は避けてください。
format:json
applicationID: "楽天APIのアプリIDを入力します。”
page:1
Schemaで指定してあるパラメーター(format, applicationID,page)を書きます。formatはjson、applicationIDには自身のアプリIDを書きます。今回の試みではページは1にしました。
アプリID(applicationID)は指示文に書きました。公開する場合、セキュリティが心配ですが。とりあえず指示文にIDを教えるなと書いてます。ですが、効果があるかは不明。筆者は公開してません。
4.knowledge
念のためknowledgeには楽天市場APIのジャンルID一覧を記したPDFを読み込ませます。今回取得したジャンルIDはこちら。
楽天市場商品ジャンル ID ジャンル ID: 100371, ジャンル名: レディースファッション ジャンル ID: 551177, ジャンル名: メンズファッション ジャンル ID: 100433, ジャンル名: インナー・下着・ナイトウェア ジャンル ID: 216131, ジャンル名: バッグ・小物・ブランド雑貨 ジャンル ID: 558885, ジャンル名: 靴 ジャンル ID: 558929, ジャンル名: 腕時計 ジャンル ID: 216129, ジャンル名: ジュエリー・アクセサリー ジャンル ID: 100533, ジャンル名: キッズ・ベビー・マタニティ ジャンル ID: 566382, ジャンル名: おもちゃ ジャンル ID: 101070, ジャンル名: スポーツ・アウトドア ジャンル ID: 562637, ジャンル名: 家電 ジャンル ID: 211742, ジャンル名: TV・オーディオ・カメラ ジャンル ID: 100026, ジャンル名: パソコン・周辺機器 ジャンル ID: 564500, ジャンル名: スマートフォン・タブレット ジャンル ID: 565004, ジャンル名: 光回線・モバイル通信 ジャンル ID: 100227, ジャンル名: 食品 ジャンル ID: 551167, ジャンル名: スイーツ・お菓子 ジャンル ID: 100316, ジャンル名: 水・ソフトドリンク ジャンル ID: 510915, ジャンル名: ビール・洋酒 ジャンル ID: 510901, ジャンル名: 日本酒・焼酎 ジャンル ID: 100804, ジャンル名: インテリア・寝具・収納 ジャンル ID: 215783, ジャンル名: 日用品雑貨・文房具・手芸 ジャンル ID: 558944, ジャンル名: キッチン用品・食器・調理器具 ジャンル ID: 200162, ジャンル名: 本・雑誌・コミック ジャンル ID: 101240, ジャンル名: CD・DVD ジャンル ID: 101205, ジャンル名: テレビゲーム ジャンル ID: 101164, ジャンル名: ホビー ジャンル ID: 112493, ジャンル名: 楽器・音響機器 ジャンル ID: 101114, ジャンル名: 車・バイク ジャンル ID: 503190, ジャンル名: 車用品・バイク用品 ジャンル ID: 100939, ジャンル名: 美容・コスメ・香水 ジャンル ID: 100938, ジャンル名: ダイエット・健康 ジャンル ID: 551169, ジャンル名: 医薬品・コンタクト・介護 ジャンル ID: 101213, ジャンル名: ペット・ペットグッズ ジャンル ID: 100005, ジャンル名: 花・ガーデン・DIY ジャンル ID: 101438, ジャンル名: サービス・リフォーム ジャンル ID: 111427, ジャンル名: 住宅・不動産 ジャンル ID: 101381, ジャンル名: カタログギフト・チケット ジャンル ID: 100000, ジャンル名: 百貨店・総合通販・ギフト
5.Action
上の画像の赤枠内の”Create New action"をクリック。下の画面に移動します。

①Schemaに必要事項を記入していきます。
こちらが全体像(json形式)。serversには楽天市場APIリクエスト先URLを記入します。
{
"openapi": "3.1.0",
"info": {
"title": "",
"description": "",
"version": "v3"
},
"servers": [
{
"url": ""
}
],
"paths": {
},
"components": {
"schemas": {
"Item": {
"type": "object",
"properties": {
},
"required": ["id", "name", "price"]
}
}
}
}
パラメーターのシリアライズについてはこちらのサイトで確認できます。
Parameter Serialization (swagger.io)
②パラメーターをpathsに書き込みます。
楽天APIのサイトを調べるとformat、keyword、applicationId、あとpageを指定した方がよさそうでした。
1.format
{
"name": "format",
"in": "query",
"description": "format",
"required": true,
"schema": {
"type": "string"
}
},
2.keyword
{
"name": "keyword",
"in": "query",
"description": "キーワード",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "applicationId",
"in": "query",
"description": "アプリケーションID",
"required": true,
"schema": {
"type": "string"
}
},
4.page
{
"name": "page",
"in": "query",
"description": "ページ番号",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
}
③propertiesには次の記述を入れます。
"id": {
"type": "integer",
"format": "int64",
"description": "アイテムの一意な識別子"
},
"name": {
"type": "string",
"description": "アイテムの名前"
},
"description": {
"type": "string",
"description": "アイテムの詳細な説明"
},
"price": {
"type": "number",
"format": "float",
"description": "アイテムの価格"
}
これでエラーがでなければ完成です。
たまに商品数が多くて表示できません、といったエラーがでますが、より具体的なキーワードをChatGPTに入力すれば大丈夫だと思います。
Schemaに入力するコードの全文バージョンは有料にさせていただきます。
4.全文
Schemeのservers内にあるurlに次のアドレスを挿入してください。
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601?
Knowledgeに次のPDFをアップロードしてください。

こちらがSchemaに入力するものです。serversには楽天市場APIテストフォームのUPL欄にあるリクエスト先URLの一部を入力します。
記入するのは”https://”から”数字?"までの範囲です。例:https://app.rakuten.co.jp/services/api/IchibaItem/Search/数字?これをコピぺしてエラーが出る場合、ChatGPTに修正してもらうと成功しやすくなると思います。
{
"openapi": "3.1.0",
"info": {
"title": "市場",
"description": "商品情報を取得",
"version": "v3"
},
"servers": [
{
"url": ""
}
],
"paths": {
"/your-api-endpoint": {
"get": {
"description": "エンドポイントの説明をここに書きます",
"operationId": "getItem",
"parameters": [
{
"name": "format",
"in": "query",
"description": "format",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "keyword",
"in": "query",
"description": "キーワード",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "applicationId",
"in": "query",
"description": "アプリケーションID",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "page",
"in": "query",
"description": "ページ番号",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
}
]
}
}
},
"components": {
"schemas": {
"Item": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "アイテムの一意な識別子"
},
"name": {
"type": "string",
"description": "アイテムの名前"
},
"description": {
"type": "string",
"description": "アイテムの詳細な説明"
},
"price": {
"type": "number",
"format": "float",
"description": "アイテムの価格"
}
},
"required": ["id", "name", "price"]
}
}
}
}