質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

652閲覧

APIでの取得ができない【Python】

oblada

総合スコア52

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/13 11:32

オープンロジのAPIを利用して在庫数を取得したいのですが、サイトのヘッダー情報が取得されます。
https://api.openlogi.com/doc/api.html

import requests import json TOKEN = '取得したトークン' URL = 'https://api.openlogi.com' params = {} params['X-Api-Version'] = '1.5' params['Authorization'] = 'Bearer' + ' ' + TOKEN params['id'] = 1 response = requests.get(URL, params)

おそらくparamsの所が間違っていると思うのですが、
APIを初めて利用するため、これ以上わかりませんので
教えていただけないでしょうか?
商品ごとの在庫数を取得したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

X-Api-VersionとAuthorization はリクエストヘッダとして付与する必要があります。
(参照:オープンロジのドキュメント)

したがってX-Api-VersionとAuthorizationは、headers引数に指定する必要があると思います。

※下記を正常に動かすには、あらかじめOPENLOJIのページで、商品マスタに適当な商品が登録されている必要があります。
(下記IDで指定している「1」はその登録したIDに書き換えてください)
なお、APIでリクエストする際のIDの形式は、「ユーザーID-「I」+商品画面の商品一覧に表示されているIDを6桁にパディングしたもの」になっているようです。

商品IDについて

例:ユーザーIDが「ZZ542」、画面上のIDが「1」の商品の場合 → APIで指定するIDは、「ZZ542-I000001」

import requests TOKEN = '取得したトークン' URL = 'https://api.openlogi.com/api/items' headers = {} headers['X-Api-Version'] = '1.5' headers['Authorization'] = 'Bearer' + ' ' + TOKEN params = {} params['id'] = 'ZZ542-I000001' # <---(APIアカウントID-「I」+商品ID6桁padding) response = requests.get(URL, params=params, headers=headers) print(response.json())

投稿2021/04/13 11:55

編集2021/04/15 11:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oblada

2021/04/13 12:45

ありがとうございます。 取得した内容は変わったのですが、 その後「result = response.json()」で実行すると 下記のエラーが表示されます。 Expecting value: line 1 column 1 (char 0) こちらは内容がhtmlだからと思うのですが、 このままhtmlで扱って行くのでしょうか? それともjsonに変換する方法があるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/13 13:32

URLが誤っていたため修正し、一部追記しました。
oblada

2021/04/14 01:53

ありがとうございます。 修正してresultを実行すると下記が表示されます。 {'items': []} 商品IDも登録したものです。
退会済みユーザー

退会済みユーザー

2021/04/15 05:29

idがあっているならば取得できるはずなんですが、こちらでは、正しいidを入力した場合そのように({'items': []})なる事象を再現できませんでした。 オープンロジの公式に問い合わせた方が早いかも知れません。
oblada

2021/04/15 09:59

何度もありがとうございます。 1つ目に登録した商品のIDは'1'だけでしょうか? 1つだけ商品を登録して上のコードをコピペして実行しているだけなんですけどね。 オープンロジにも問い合わせたのですが、Pythonでの対応はできないと言われたので、他の言語でも良いので教えてほしいと言っているところです。
退会済みユーザー

退会済みユーザー

2021/04/15 10:34 編集

具体的な商品IDは「1」等の単純な数字ではなく 「APIのアカウントID」+「-」(半角ハイフン)」+「I」+「6桁の0パディングした数字」になっているようです。 たとえば質問者さんのオープンロジAPIのアカウントID(オープンロジの管理画面の右上に表示されているID)が「ZZ542」ならば 商品マスタの商品一覧でIDが「1」となっている商品の 実際の商品IDは "ZZ542-I000001" 商品マスタの商品一覧でIDが「99」となっている商品の 実際の商品IDは "ZZ542-I000099" となっていると思われます。 なおオープンロジAPIについて調べましたが、IDを個別に指定せずに、商品マスタに登録されている全商品の一覧を取得するやり方について記述されているページを見つけることはできませんでした。
oblada

2021/04/15 11:32

できました! ありがとうございます!!! いくつか教えいただきたいことがあるのですが、 1、公式ページに商品IDの例としては書かれいるのですが、 教えていただいたようなパターンについて書かれていないので 自分で見抜かないといけないということでしょうか? 2、エンドポイントとして「https://api.openlogi.com」が書かれていますが、 その後ろに「api/items」が必要なのはどこに書かれているのでしょうか? 3、例えば100個の商品を抽出する場合は、 カンマ( , )区切りで商品IDを100個並べないといけないということでしょうか? 何度もありがとうございます。
退会済みユーザー

退会済みユーザー

2021/04/15 12:19 編集

1. → これについては、結果としてその通り(自分で見抜かないといけない)ということになります。 実は私が最初に回答を書いたときはブラウザの管理画面経由ではなく、API(POST)で商品を登録しており、登録したときにAPIから返ってくるIDを指定して商品データの呼び出しコードをテストしていたので、 「管理画面上もIDはアカウントID+I+数字の形式で表示されているはず」 だと思い込んでいました。 しかし、実際にブラウザで管理画面に飛んで見たところ、管理画面上はIDが単純な数字だったので、結果として説明不足となってしまいました。すみません。 2.APIドキュメント(https://api.openlogi.com/doc/api.html#tag/items)の右側で、「GET /items と書かれているところの下矢印」(v)をクリックすると、その情報にアクセスするためのAPIエンドポイント(URL)が表示されます。 (下の図の赤丸のところをクリックします) https://teratail-v2.storage.googleapis.com/uploads/contributed_images/5cd2ce769d96e23dbfba48e7cfe396ac.jpeg 3.for文をつかって、あらかじめidを列挙したリストを作成しておくやり方があります。 (idを6桁にするにはstr.zfill()を使う) 例) item_ids=[] params = {} for i in range(100):  item_ids.append("ZZ542-I"+str.zfill(str(i),6)) params["id"] = ",".join(item_ids) response = requests.get(URL, params=params, headers=headers) print(response.json()) ※「ZZ542」はご自身のアカウントIDに置き換えてください。 ※forの次の行のインデントは全角スペースになっているので半角スペースに直してください。 オープンロジAPIは、どうも商品マスタ一覧や入庫済みの倉庫内商品一覧を簡単に出力させるための仕組みを用意していないようです。 このことから、商品全体は別のデータベースで管理しておき、倉庫への入出庫管理の部分だけオープンロジAPIで扱う、という使い方が想定されていると思われます。 ネットを調べてみてもオープンロジに関する技術的資料がかなり少なく、難易度は高いという印象です。
oblada

2021/04/16 05:47

詳しく解説いただきましてありがとうございます。 1と2は経験不足なので仕方がないです。 3の取得の仕方を教えていただきましてありがとうございます。 APIは初めの内は情報が少ないと難しいと思いました。 わざわざアカウントを作成して試していただきましてありがとうございました。 深く感謝いたします。
退会済みユーザー

退会済みユーザー

2021/04/16 10:52 編集

僭越ながら、この質問の後にご自分で立てられた同じ内容の質問が、上記の回答を自己回答として解決済みとなっているのを拝見しました。 差し支えなければ、本質問も、同様にクローズしていただけますようお願い致します。 (なお、自己解決となっている先の低評価は私がつけたものではありません)
oblada

2021/04/17 10:47

何しに低評価するのかわかりませんけどね。 モチベーションを下げるだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問