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

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

新規登録して質問してみよう
ただいま回答率
85.37%
GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Shopify

Shopifyとは、ECサイト向けのプラットフォームを提供している企業。さらに、その企業が提供するオンラインストアやPOSシステムを指します。高いデザイン性とカスタマイズ性が評価され、世界各国のネットショップで使用されています。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

141閲覧

shopifyのAPIを使って大量のファイルのアップロードを行いたい

gelsea

総合スコア43

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Shopify

Shopifyとは、ECサイト向けのプラットフォームを提供している企業。さらに、その企業が提供するオンラインストアやPOSシステムを指します。高いデザイン性とカスタマイズ性が評価され、世界各国のネットショップで使用されています。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2024/09/25 18:22

実現したいこと

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にアップロードすることも可能でしょうか?
ご教授のほど、よろしくお願いいたします。

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

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

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

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

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

poto568

2024/09/26 01:22

「Failed to upload: のみです。」は書いてある通りの意味でしょうか。 (file_name やら result に相当する部分は何も出力されていないということ?) とりあえず取ってきた値を入れたつもりの変数とか、requestsを投げて返ってきた response とかを片っ端からprintするとかデバッガで見るとかすると何か分かる かもしれません。 追加で情報がある場合はコメント欄ではなく質問を編集してください。 shopifyのことは知らないので、あとは有識者の回答を期待してください。
guest

回答1

0

自己解決

GraphQL Admin APIのfileCreateを再度確認し、実行しましたら画像のアップロード自体ができました!
こちらの例では単一ファイルのアップロードのみですが、これから自力で複数ファイルのアップロードに修正していこうと思いますが、誰かの参考になればと思い、残させて頂きます。

upload.py

import requests
import json

Shopify APIエンドポイントのURL

url = "https://ショップネーム.myshopify.com/admin/api/2024-07/graphql.json"

ヘッダーの設定

headers = {
"Content-Type": "application/json",
"X-Shopify-Access-Token": "トークンを記載"
}

GraphQLクエリの定義

query = """
mutation fileCreate($files: [FileCreateInput!]!) {
fileCreate(files: $files) {
files {
id
fileStatus
alt
createdAt
}
}
}
"""

Input variablesの設定

variables = {
"files": [
{
"alt": "Fallback text for an image", # 画像に対する代替テキスト
"contentType": "IMAGE", # JPEG画像の場合のコンテンツタイプ
"originalSource": "画像URL" # 指定された画像のURL
}
]
}

リクエストのボディを構成

body = {
"query": query,
"variables": variables
}

POSTリクエストを送信

response = requests.post(url, headers=headers, data=json.dumps(body))

レスポンスの表示

print(response.json())

投稿2024/09/26 07:49

gelsea

総合スコア43

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問