- ASINをもとにPython(プログラミング言語)でカート価格、手数料をゲットする!
- 手数料をもとに総利益額をゲットする!
- 実行するたびに記録することで推移が見れる!
こんにちは。いーか(@iika246)です。
このたびPythonを使った在庫管理ツールを作成しましたのでソースコードを公開したいと思います。
本記事ではプログラミングの内部解説よりも使用方法について解説します。
mokuji
使用する上での前提条件として…
本コードを動かすには下記が必要になります。
- Amazon大口出品者であること
- AmazonでMWS開発者IDを取得していること
- 自身のPCでPythonが実行できること
Amazon大口出品者であること
まず大口出品者でないと開発者IDをゲット出来ません。そもそもセラーアカウントが必要なのです。
さらに大口出品者になって初めて開発者IDの取得するための申請が可能になります。
ちなみに取得しているかの確認方法として、
「セラーセントラル」→「アプリ&サービス」→「アプリの開発」
こちらにて「MWS開発者ID」が取得出来ているかどうかになります。
Amazonに大口出品者として登録するには月額4900円(税抜)かかります。
自身のパソコンでPythonが実行できる環境であること
Pythonを実行できるようにするには下記2つを実施している必要があります。
- Pythonをインストールしていること
- Pythonを編集できるエディタがあること
Pythonをインストールするには下記よりダウンロードするだけです。
今回作成したソースコードはPython(プログラミング言語)で記述しております。そのためPythonが実行できる環境ではないと使用出来ませんのでご注意下さい。
エディタを用意する方法は下記リンク先、プロゲートさんのページにわかりやすいです。
(HTML&CSSの…とありますが、Pythonだとエディタがあればすぐに始められます)
ソースコードについて
使用する前に…
コードの使用については自己責任でよろしくお願いします。
動作確認は行っておりますが、使用する際は各自の判断でよろしくお願いします。
また、コードの見にくい部分があるかと思いますが、ご了承頂けますよう宜しくお願いします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
import base64 import datetime import hashlib import hmac import requests import six import urllib.parse import openpyxl import datetime from bs4 import BeautifulSoup # この部分を書き換えて下さい。 AMAZON_CREDENTIAL = { #セラーID 'SELLER_ID': 'あなたのセラーID', #開発者情報のAWSアクセスキー 'ACCESS_KEY_ID': 'AWSアクセスキーを入れる', #開発者情報のクライアント機密情報 'ACCESS_SECRET': 'クライアント機密情報を入れる', #日本だと下記で固定 'MarketplaceId': 'A1VC38T7YXB528', } #ここは書き換えない DOMAIN = 'mws.amazonservices.jp' ENDPOINT = '/Products/2011-10-01' # この部分を書き換えて下さい。 #手数料取得 def get_fee(fee_asin,fee_price,fee_fba): #タイムスタンプの初期設定 timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') #MWS API 必須パラメータ初期設定 data = { 'FeesEstimateRequestList.FeesEstimateRequest.1.MarketplaceId': AMAZON_CREDENTIAL['MarketplaceId'], 'FeesEstimateRequestList.FeesEstimateRequest.1.IdType' : 'ASIN', 'FeesEstimateRequestList.FeesEstimateRequest.1.IdValue' : fee_asin, 'FeesEstimateRequestList.FeesEstimateRequest.1.IsAmazonFulfilled' : fee_fba, 'FeesEstimateRequestList.FeesEstimateRequest.1.Identifier' : 'request1', 'FeesEstimateRequestList.FeesEstimateRequest.1.PriceToEstimateFees.ListingPrice.CurrencyCode' : 'JPY', 'FeesEstimateRequestList.FeesEstimateRequest.1.PriceToEstimateFees.ListingPrice.Amount' :fee_price, 'AWSAccessKeyId': AMAZON_CREDENTIAL['ACCESS_KEY_ID'], 'Action': 'GetMyFeesEstimate', 'SellerId': AMAZON_CREDENTIAL['SELLER_ID'], 'SignatureMethod': 'HmacSHA256', 'SignatureVersion': '2', 'Timestamp': timestamp, 'Version': '2011-10-01' } #リクエスト作成 query_list = list() for k, v in sorted(data.items()): query_list.append('{}={}'.format(k, urllib.parse.quote(v, safe=''))) query_string = "&".join(query_list) canonical = "{}\n{}\n{}\n{}".format( 'POST', DOMAIN, ENDPOINT, query_string ) h = hmac.new( six.b(AMAZON_CREDENTIAL['ACCESS_SECRET']), six.b(canonical), hashlib.sha256) signature = urllib.parse.quote(base64.b64encode(h.digest()), safe='') url = 'https://{}{}?{}&Signature={}'.format( DOMAIN, ENDPOINT, query_string, signature) #レスポンス取得 response = requests.post(url) soup = BeautifulSoup(response.content.decode(), "lxml") #返り値初期化 result_get_fee = dict() try: for script in soup(["script","style"]): script.decompose() text=soup.get_text() #amount=手数料の数字部分、全て返す result_get_fee = [line.strip() for line in text.splitlines()] except Exception as err_item: # tryが失敗したとき.. result_get_fee = 'itemを取得できませんでした' return result_get_fee #ASIN使ったデータ取得 def get_data(search_code): timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') data = { 'AWSAccessKeyId': AMAZON_CREDENTIAL['ACCESS_KEY_ID'], 'Action': 'GetCompetitivePricingForASIN', 'SellerId': AMAZON_CREDENTIAL['SELLER_ID'], 'SignatureMethod': 'HmacSHA256', 'MarketplaceId': AMAZON_CREDENTIAL['MarketplaceId'], 'SignatureVersion': '2', 'Timestamp': timestamp, 'Version': '2011-10-01', 'ItemCondition': 'NEW', 'ExcludeMe': 'true', 'ASINList.ASIN.1': search_code } query_list = list() for k, v in sorted(data.items()): query_list.append('{}={}'.format(k, urllib.parse.quote(v, safe=''))) query_string = "&".join(query_list) canonical = "{}\n{}\n{}\n{}".format( 'POST', DOMAIN, ENDPOINT, query_string ) h = hmac.new( six.b(AMAZON_CREDENTIAL['ACCESS_SECRET']), six.b(canonical), hashlib.sha256) signature = urllib.parse.quote(base64.b64encode(h.digest()), safe='') url = 'https://{}{}?{}&Signature={}'.format( DOMAIN, ENDPOINT, query_string, signature) response = requests.post(url) soup = BeautifulSoup(response.content.decode(), "lxml") # print(soup.prettify()) items = soup.find_all('asin') result_dict = dict() try: item_data = soup.find('getcompetitivepricingforasinresult', asin=search_code) # print('item_data', item_data) # asinを取得 try: result_asin = item_data.asin.text except Exception as err_asin: print(err_asin) result_asin = 'ASINを取得できませんでした' # 価格を取得 try: result_price = int(round(float(item_data.amount.text))) except Exception as err_price: print(err_price) result_price = '価格を取得できませんでした' result_dict = [result_price] except Exception as err_item: # print(err_test) result_test = 'itemを取得できませんでした' return result_dict if __name__ == '__main__': #エクセルファイルの保存先 filename ='C:\\test\\data.xlsx' book = openpyxl.load_workbook(filename) sheet = book.worksheets[0] sheet_price = book.worksheets[1] get_date = datetime.date.today() get_time = datetime.datetime.today() #仕入れ在庫シートの編集 get_asin = [] for row in sheet.rows: get_asin.append( row[1].value ) del get_asin[0] #最初の「ASIN」という文字列を削除 k = 2 #出力する行の設定 j = 6 #出力する列の設定 total = 0 #総額を取り込む変数 gross_profit = 0 #見込粗利益 for output in get_asin: #「仕入れ在庫」シート内のASINを使ってデータ取得 asin_data = get_data(output) sheet.cell(row = k, column= 6, value=asin_data[0]) sheet.cell(row = k, column= 7, value=sheet.cell(row=k,column=5).value * sheet.cell(row=k,column=6).value) total += sheet.cell(row = k, column = 7).value #手数料取得、計算 profit = 0 get_cart = str(sheet.cell(row = k, column = 6).value) text = "\n".join(line for line in get_fee(output,get_cart,'true') if line) test = [] test = text.splitlines() sheet.cell(row = k, column= 8, value=int(float(test[3]))) sheet.cell(row = k, column= 9, value=int(float(test[1])) - int(float(test[3]))) sheet.cell(row = k, column= 10, value=sheet.cell(row = k, column = 6).value - sheet.cell(row = k, column = 4).value - int(float(test[1]))) profit = sheet.cell(row = k, column=10).value * sheet.cell(row = k ,column=5).value gross_profit += profit #出力先の行を下へ移動する k = k+1 #在庫総額シートの出力 i = sheet_price['E2'].value #日付 sheet_price.cell(row=i, column=1, value= get_date) #時刻 sheet_price.cell(row=i, column=2, value= '{0:%H}:{0:%M}:{0:%S}'.format(datetime.datetime.now())) #在庫総額の出力 sheet_price.cell(row=i, column=3, value=total) #在庫見込利益総額の出力 sheet_price.cell(row=i, column=4, value=gross_profit) #在庫記録位置の設定 sheet_price.cell(row= 2,column=5,value= i+1) #シート保存 book.save(filename) |
初期設定について
Pythonをインストールしただけでは残念ながらエラーになります。
ここからさらにモジュールと呼ばれるモノをインストールする必要があるのです。方法は下記サイトに詳しく載っております。
流れとしては下記のとおり。
1 2 3 4 5 6 7 8 |
pip install base64 pip install datetime pip install hashlib pip install hmac pip install requests pip install six pip install urllib.parse pip install BeautifulSoup |
※必要なコマンド一覧
使用するエクセルについて
エクセルの保存先は下記になっています。
私の場合Cドライブに「test」というフォルダを作成、その中に「data.xlsx」というファイル名でエクセルを作成しておりましたので上記のようになっております。
各自の好きな場所へ変更行っても問題ありません。
エクセルファイルは下記のように作成して頂くことで動作します。
エクセルでの入力方法は仕入れ在庫シートの下記の3カ所さえ入力しておけば動作します。
- ASIN
- 仕入れ価格
- 仕入れ個数
カタログ名、仕入れ先、備考欄はデータ入力されないので必要であれば入力願います。
参考サイト
MWS APIの使用方法、カート価格取得方法は下記記事を参考にさせて頂きました。ありがとうございました。
Amazon MWS を使ってASINから商品情報を取得するPythonコード
Amazon マーケットプレイス Webサービス(MWS)リファレンスガイド