为了账号安全,请及时绑定邮箱和手机立即绑定

Shopify GraphQL入门指南:用Python搭建你的第一个应用

标签:
Python API

如果你是 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 时遇到的难题。

如果这个教程对你有帮助的话,请点个赞,并留下你的评论,

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

0 评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消