提问者:小点点

如何从Shopify Python API获取所有产品ID


我已经创建了一个私人shopify应用程序。这可以得到几乎所有的信息与产品id。但我需要一个选项,以获得所有产品的API商店的产品id。我已经尝试了下面的选项

shopify.Product.find()

但它只显示了前50种产品。但是我的商店有2.4k产品。


共3个答案

匿名用户

截至2019-07年的更新:这将不再有效,因为它已被弃用,并随后从Shopify API中删除。

此答案中详细说明了替换。

原始答案如下

Shopify返回资源列表的分页响应。每页的默认资源数为50,默认页面为1。因此,您的请求相当于以下内容:

shopify.Product.find(limit=50, page=1)

Shopify允许您将每页限制提高到250。下面是我用来获取所有给定资源的助手函数:

def get_all_resources(resource, **kwargs):
    resource_count = resource.count(**kwargs)
    resources = []
    if resource_count > 0:
        for page in range(1, ((resource_count-1) // 250) + 2):
            kwargs.update({"limit" : 250, "page" : page})
            resources.extend(resource.find(**kwargs))
    return resources

你这样使用它:

products = get_all_resources(shopify.Product)

您甚至可以传入参数。您的问题专门询问产品ID-如果您将查询限制为仅返回ID,这将快得多(因为它不必引入任何产品变体):

product_ids = get_all_resources(shopify.Product, fields="id")

请注意,如果您有2.4k产品,这可能需要一些时间!

文档:https://help.shopify.com/api/reference/product

匿名用户

Shopify API中的分页接口已更改,API 2019-07版中删除了旧的“限制页面”分页方式。

换句话说,@Julien接受的答案在这个api版本和更高版本中都不起作用。

我重新创建了接受答案的功能,使用了基于相对光标的分页的新方法:

def get_all_resources(resource_type, **kwargs):
    resource_count = resource_type.count(**kwargs)
    resources = []
    if resource_count > 0:
        page=resource_type.find(**kwargs)
        resources.extend(page)
        while page.has_next_page():
            page = page.next_page()
            resources.extend(page)
    return resources

匿名用户

Lennart-Rolland响应的扩展。

如他所述,首选答案不再适用于2019-07版api。

我无法让他的代码示例工作,因为一个错误列表不具有函数has_next_page()。

因此,我编写了一个使用“Link”标题rel='next'分页的示例。

def get_all_resources(resource):
    page_info = str()
    resources = list()
    while True:
        resources.extend(resource.find(limit=250, page_info=page_info))
        cursor = shopify.ShopifyResource.connection.response.headers.get('Link')
        if 'next' in cursor:
            page_info = cursor.split(';')[-2].strip('<>').split('page_info=')[1]
        else:
            break
    return resources