如果你是 GraphQL 完全新手,并且需要为你的商店创建一个用 Python 编写的 Shopify 应用,这份指南就是为你而写的。
来源:ChatGPT,
Shopify 从 2024 年 10 月 1 日起实施了 GraphQL 的要求,使得任何使用 REST Admin API 的应用变成“遗留”系统并被视为过时。任何使用 REST API 的应用将无法正常运行,你需要改用 GraphQL。
2024年10月上旬,我的客户要求我对之前为他创建的一个销售欧洲进口的大型机械的Shopify商店做一些修改。该商店的价格以欧元标示,我编写了一个脚本来计算过去九天内欧元兑美元的最大汇率,并自动更新商店里每个产品的价格(超过300个,包括变体)。因为与原设备制造商的业务问题,商店已经停用近一年。当我尝试运行我基于REST的脚本来更新产品价格时,却发现它不起作用!经过一番调查,我发现REST API已经被弃用,现在只能使用GraphQL。
所以我决定投入时间学习GraphQL并进行必要的改动。但我花了好几个痛苦的小时在Shopify文档上挣扎。试图对Shopify商店发起最基本的API调用。那次令人沮丧的经历促使我写了这篇文章。
什么是 GraphQL 呢?GraphQL 是一种用于 API 的数据查询和操作语言,它允许你精确地获取所需的数据和数据类型。它是传统 REST API 的一种替代方案。你仍然可以使用 HTTP GET 或 POST 方法来与 GraphQL 交互。GraphQL 客户端发送给服务器的查询明确指出了所需的具体数据及其类型。响应始终基于查询提供一致的结构化数据。GraphQL 很灵活,因为它允许你在基于 JSON 的查询中添加新的字段。使用 GraphQL 时,所有查询都通过单一端点进行。
使用 GraphQL 访问 Shopify 商店的方法你可以通过以下任意一种或两种方法来访问数据存储。
- HTTP GET/POST,带有正确格式的头。
- Shopify SDK,选择你想要使用的编程语言(如Python等)。
你需要能够登录到Shopify商店的管理后台,作为开发人员,你需要被批准为Shopify商店的“应用开发人员”。对于Shopify合作伙伴来说,这意味着你需要被批准为“合作者”。你需要从Shopify商店的管理员或店主那里获取一个“合作者请求码”,才能申请成为合作者。这在Shopify商店管理后台的“用户和权限”菜单选项下。需要为合作者配置商店权限。
登录到您的 Shopify 商店管理后台。如果您是 Shopify 合作伙伴,可以登录到合作伙伴账户,选择商店,然后登录。
在 Shopify 商店的管理后台(网址:https://admin.shopify.com/store..)中选择“应用和销售渠道”选项。点击页面右上角的“开发应用”链接。需要注意的是,“私有应用”现在被叫做“自定义应用”了。点击页面右上角的“创建应用”按钮。在对话框中,输入“应用名称”(你喜欢的任何名称),并从下拉列表中选择一个“应用开发者”(如果有多个开发者供选择的话)。
来自: Shopify
在你成为‘应用开发者’并被批准后,并且为Shopify商店创建了一个‘自定义应用’,你就可以获得API凭证了。在你刚创建的自定义应用的开发页面中,点击‘API凭证’标签,然后选择‘设置管理API权限’。我发现以下管理API权限范围有效。你可以尝试使用更少的权限范围,如果可能的话,建议这么做。当你完成权限设置后,点击右上角的‘保存’按钮。
写内容, 查看内容,
查看客户,
查看订单,
写产品, 查看产品,
写库存, 查看库存,
查看分析数据
在你的自定义应用的‘应用开发’页面,再次进入‘API凭证’标签。在‘访问令牌’部分,你会看到一条信息,显示“你还没有任何访问令牌。要获取管理API访问令牌,请先安装应用。”点击‘安装应用’。
来源:Shopify
一个新的部分将会出现,并带有“管理API访问令牌”的标签。点击“一次性显示令牌链接”,复制令牌,并将其保存在一个安全的地方。我们将其称为“API_TOKEN”。
来源:Shopify.
此外,在该页面下方名为“API密钥和秘钥”的部分,你会看到“API密钥”和“API秘钥”。复制这些密钥并将其保存在安全的地方。之后将分别将它们称为“API_KEY”和“API_SECRET_KEY”。以下的示例中不会用到这些密钥,你可能在其他场合也不会用到这些密钥。它们可能是一些过时的API密钥。
来源:Shopify
接下来你需要商店的名字。这可能会有点棘手,具体要看你的域名设置。我发现一种方法是,当你登录到商店的后台管理时,URL 中的这部分位于“https://admin.shopify.com/store/”和“/settings”之间就是你的商店名字。例如,如果你的 URL 是:
https://admin.shopify.com/store/我的商店名称/设置/apps/开发应用/123456789012/概览
然后你的店名是“my-store-name”,从现在起我们都将称它为‘STORE_NAME’。在Shopify文档中,你会看到许多类似的别名,例如‘shop_name’。
您需要在HTTP请求中使用API的发布版本号,格式为YYYY-MM。您可以在“可用的发布说明”页面上找到版本号。我们称之为“GRAPH_QL_VER”,其格式为YYYY-MM。
端点是指你将要发送HTTP GET或POST请求的URL地址。使用STORE_NAME和GRAPHQL_VER,将它们与剩余的URL部分拼接在一起,从而形成GRAPHQL_ENDPOINT。
https://STORE_NAME.myshopify.com/admin/api/GRAPHQL_VER/graphql.json
商店管理后台的GraphQL API端点
Python中的GET/POST请求以下是一个使用Python的requests模块来执行HTTP POST请求的GraphQL查询示例。
# 作者: Mark W Kiehl
# 公司名称: Mechatronic Solutions LLC
# http://mechatronicsolutionsllc.com/
# 定义您的Shopify商店的API密钥和密码
API_TOKEN = 'shpat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 这应该放在头部: 'X-Shopify-Access-Token': 'shpat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# 商店名称是商店管理页面URL中'https://admin.shopify.com/store/'和'/settings'之间的部分。
# 例如: https://admin.shopify.com/store/my-store-name/settings/apps/development/123456789012/overview -> "my-store-name"
STORE_NAME = "my-store-name"
# 定义端点版本,格式为YYYY-MM。查看版本: https://shopify.dev/docs/api/release-notes#available-release-notes
GRAPHQL_VER = "2024-10"
# 根据STORE_NAME和GRAPHQL_VER定义Shopify商店的GraphQL端点。
GRAPHQL_ENDPOINT = "https://" + STORE_NAME + ".myshopify.com/admin/api/" + GRAPHQL_VER + "/graphql.json"
def shopify_graphql_query_request_products():
"""
使用GraphQL查询HTTP POST从Shopify商店获取前五个产品。
需要全局变量: API_TOKEN 和 GRAPHQL_ENDPOINT
"""
import json
# pip install requests
import requests
if not isinstance(API_TOKEN, str): raise Exception("API_TOKEN is not defined")
if not isinstance(GRAPHQL_ENDPOINT, str): raise Exception("GRAPHQL_ENDPOINT is not defined")
# 定义GraphQL HTTP POST的头部
headers = {
'Content-Type': 'application/graphql', # 必须是: 'application/graphql',而不是: 'application/json'
'X-Shopify-Access-Token': f'{API_TOKEN}',
}
def query_shopify(query:str=None, headers:str=None, endpoint:str=None, verbose:bool=False):
"""
使用Python requests模块执行Shopify GraphQL查询以进行HTTP POST请求。
"""
if verbose:
print("query:", query)
print("headers:", headers)
print("endpoint", endpoint)
response = requests.post(GRAPHQL_ENDPOINT, data=query, headers=headers)
return response.json()
products_query = '''
query {
products(first: 5) {
edges {
node {
id
handle
}
}
pageInfo {
hasNextPage
}
}
}
'''
data = query_shopify(query=products_query, headers=headers, endpoint=GRAPHQL_ENDPOINT)
print(json.dumps(data, indent=2))
if __name__ == '__main__':
shopify_graphql_query_request_products()
Python SDK
你也可以使用 Python(或其他)SDK 来访问产品信息。不过,我认为 Shopify 的 Python SDK 文档简直是糟糕透了。下面的例子会让你能够执行 GraphQL 查询。从那一点开始,你可以参考通用的 HTTP API 文档,继续你的操作。
# Written by: Mark W Kiehl
# Company: Mechatronic Solutions LLC
# http://mechatronicsolutionsllc.com/
# 定义您的Shopify商店的API密钥和密码
API_TOKEN = 'shpat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 此密钥应包含在头信息中:'X-Shopify-Access-Token': 'shpat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# 商店名称是商店管理页面URL中“https://admin.shopify.com/store/”和“/settings”之间的部分。
# 示例:https://admin.shopify.com/store/my-store-name/settings/apps/development/123456789012/overview -> "my-store-name"
STORE_NAME = "my-store-name"
# 定义端点版本,格式为YYYY-MM。详情请参阅:https://shopify.dev/docs/api/release-notes#available-release-notes
GRAPHQL_VER = "2024-10"
# 根据STORE_NAME和GRAPHQL_VER定义您的Shopify商店的GraphQL端点。
GRAPHQL_ENDPOINT = "https://" + STORE_NAME + ".myshopify.com/admin/api/" + GRAPHQL_VER + "/graphql.json"
def shopify_graphql_query_py_api_products():
"""
https://github.com/Shopify/shopify_python_api
"""
import shopify
products_query = '''
query {
products(first: 5) {
edges {
node {
id
handle
}
}
pageInfo {
hasNextPage
}
}
}
'''
with shopify.Session.temp(GRAPHQL_ENDPOINT, GRAPHQL_VER, API_TOKEN):
shopify.GraphQL().execute("{ shop { name id } }")
# 获取产品。
result = shopify.GraphQL().execute(products_query)
print(result)
# {"data":{"products":{"edges":[{"node":{"id":"gid://shopify/Product/1629753868406","handle":"art-900"}},{"node":{"id":"gid://shopify/Product/1646300790902","handle":"feeding-wheel"}},{"node":{"id":"gid://shopify/Product/1646328119414","handle":"cutting-tool-insert-screw"}},{"node":{"id":"gid://shopify/Product/1893900583030","handle":"art-900-plus"}},{"node":{"id":"gid://shopify/Product/2005773484150","handle":"art-900-big-plus"}}],"pageInfo":{"hasNextPage":true}}},"extensions":{"cost":{"requestedQueryCost":5,"actualQueryCost":5,"throttleStatus":{"maximumAvailable":2000.0,"currentlyAvailable":1995,"restoreRate":100.0}}}}
如果 __name__ == '__main__':
pass
shopify_graphql_query_py_api_products()
总结
我希望这篇简短但详细的教程能帮助其他开发者更快地上手,就像我一样。这篇教程特别针对我在使用 GraphQL 时遇到的难题。
如果这个教程对你有帮助的话,请点个赞,并留下你的评论,
共同学习,写下你的评论
暂无评论
作者其他优质文章