🛒

Pythonのrequestsを使ってShopifyの GraphQL admin APIを呼び出す

2021/11/01に公開

概要

以前の記事[1]で ShopifyAPI パッケージを使って、Python から GraphQL を呼び出す方法描きました。
Python でよく用いられている requests でも呼び出す方法がわかったので記述します。
curl と呼び出し方が若干異なり、GitHub の issueで解決策が書いてありました。

手順

1. requests をインストール

pip install requests

2. Python でソースコードを記述

サンプルコードを以下の点で編集します。

query のみの場合と、mutation を使う場合で若干書き方が異なります。

  • 環境に合わせて host_name、 password を記述
  • headers を設定
    • curl だと Content-Type は application/graphql だが、Python の requests では application/json と記述しないといけないです
  • json={"query": query}で query を記述

query のみの場合

import requests

# 環境に合わせて記述
host_name = "NAME.myshopify.com"
password = "PASSWORD"

# urlを設定
url = f"https://{host_name}/admin/api/2021-01/graphql.json"

# headersを設定
# 重要: Content-typeはapplication/graphqlではなくapplication/jsonじゃないと動かない
headers = {
    "Content-Type": "application/json",
    "X-Shopify-Access-Token": password,
}

# graphqlのqueryを記述
query = """{
            products(first: 5) {
                edges {
                    node {
                    id
                    handle
                    }
                }
            }
        }"""

# requestする
response = requests.post(
    url,
    json={"query": query},
    headers=headers
)

mutation と variables の場合

mutation と variables の場合を使う場合は、json={"query": query, "variables": variables}のように記述します。以下は id=0000000000000 に新しい tag("qiita")を追加する例です。

import requests

host_name = "NAME.myshopify.com"
password = "PASSWORD"

url = f"https://{host_name}/admin/api/2021-01/graphql.json"

headers = {
    "Content-Type": "application/json",
    "X-Shopify-Access-Token": password,
}

productId = "gid://shopify/Product/0000000000000"
query = """
mutation tagsAdd($id: ID!, $tags: [String!]!) {
  tagsAdd(id: $id, tags: $tags) {
    node {
      id
    }
    userErrors {
      field
      message
    }
  }
}
"""

variables = {"id": productId, "tags": ["qiita"]}

response = requests.post(
    url,
    json={"query": query, "variables": variables},
    headers=headers
)

脚注
  1. https://qiita.com/Msksgm/items/5079977d510caf803952 ↩︎

Discussion