実現したいこと
shopifyのAPIを使用してローカル環境から大量のアップロードを行いたいと考えています。
現在、カスタムアプリを作成し、トークンの発行を行い、pythonのスクリプトを実行したところ、
ファイルへアクセスし、最も直近のファイルの名前を取得することは出来ましたが、
肝心のファイルのアップロードのスクリプトを作成してもエラーで実現できません。
ご教授いただけると幸いです。
発生している問題・分からないこと
画像ファイルをアップロードするためのスクリプトをPythonで作成し、
APIを使って一括アップロードしようとしていますが、jpgファイルのアップロードが出来ません。
Admin APIアクセススコープは、write_files、 read_filesとなっているので、カスタムアプリ側の設定の問題はないと考えていますので、pythonの記述がシンプルに間違っているのだと思いますが、解決策がわかりません。
エラーメッセージ
error
1Failed to upload: のみです。
該当のソースコード
python
1import requests 2import os 3import base64 4from pathlib import Path 5 6# Shopify APIの設定 7SHOPIFY_STORE = "ストア名" # Shopifyのストア名 8ACCESS_TOKEN = "アクセストークン" # Shopifyのアクセストークン 9GRAPHQL_URL = f"https://{SHOPIFY_STORE}.myshopify.com/admin/api/2024-07/graphql.json" 10 11# GraphQLクエリ: fileCreate ミューテーションで画像をアップロード 12def upload_image(file_name, file_path): 13 query = """ 14 mutation fileCreate($files: [FileCreateInput!]!) { 15 fileCreate(files: $files) { 16 files { 17 alt 18 id # idを取得 19 # ここに必要な他のフィールドを追加 20 } 21 userErrors { 22 field 23 message 24 } 25 } 26 } 27 """ 28 29 with open(file_path, "rb") as file_data: 30 # ファイルデータをBase64に変換 31 file_content = base64.b64encode(file_data.read()).decode('utf-8') 32 33 variables = { 34 "files": [ 35 { 36 "alt": file_name, # ファイル名をaltテキストとして使用 37 "contentType": "IMAGE", # 修正: IMAGEに変更 38 "originalSource": f"data:image/jpeg;base64,{file_content}", 39 } 40 ] 41 } 42 43 headers = { 44 "Content-Type": "application/json", 45 "X-Shopify-Access-Token": ACCESS_TOKEN, 46 } 47 48 response = requests.post( 49 GRAPHQL_URL, json={"query": query, "variables": variables}, headers=headers 50 ) 51 52 if response.status_code == 200: 53 return response.json() 54 else: 55 return response.text 56 57# 画像ディレクトリのパスを設定 58image_dir = Path("/Users/aaa/Desktop/sample") 59 60# すべての画像ファイルを一括アップロード 61for image_file in image_dir.glob("*.jpg"): 62 file_name = image_file.stem 63 file_path = image_file.as_posix() 64 65 print(f"Uploading {file_name}...") 66 67 result = upload_image(file_name, file_path) 68 69 # アップロード結果を表示 70 if "data" in result: 71 uploaded_id = result["data"]["fileCreate"]["files"][0]["id"] # idを取得 72 print(f"Uploaded: {file_name} with ID -> {uploaded_id}") 73 else: 74 print(f"Failed to upload {file_name}: {result}") 75
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
検索しましたが、APIを使ってのファイルの一括アップロードに関するものは見つけられませんでした。
chatgptでスクリプトの改善を依頼してみましたが、エラーメッセージを指定の表記に変えるスクリプトが追加されただけでした。
補足
こちらは今回の質問とは少しずれてしまいますが、商品写真アップのための質問でしたので、
より効率的な出品方法についてご存知の方がいらっしゃればご教授いただけますと幸いです。
商品を大量に出品する際に画像を先にアップロードして、csvデータで紐付けを行うつもりでしたが、
商品データと画像を同時に一括で多数の商品分をアップロードすることも可能なのでしょうか?
また、今回、ローカル環境からのアップロードですが、サーバーにアップされている画像をURLから取得し、shopifyにアップロードすることも可能でしょうか?
ご教授のほど、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー