← back to Dw Discovery
fetch_admin.py
27 lines
import sys,json,urllib.request,time
tok=sys.argv[1]; store="designer-laboratory-sandbox.myshopify.com"
url=f"https://{store}/admin/api/2024-10/graphql.json"
Q='''query($c:String){ products(first:200, after:$c, sortKey:CREATED_AT, reverse:true){
pageInfo{hasNextPage endCursor}
edges{ node{ title handle status publishedAt productType vendor tags createdAt
featuredImage{ url } variants(first:3){ edges{ node{ sku price availableForSale } } } } } } }'''
def call(c):
req=urllib.request.Request(url,data=json.dumps({"query":Q,"variables":{"c":c}}).encode(),
headers={"X-Shopify-Access-Token":tok,"Content-Type":"application/json"})
return json.load(urllib.request.urlopen(req))
out=[]; cur=None; pages=0
while len(out)<5000 and pages<30:
r=call(cur)
if "errors" in r: print("ERR",json.dumps(r["errors"])[:200]); break
pr=r["data"]["products"];
for e in pr["edges"]:
out.append(e["node"])
pages+=1
if not pr["pageInfo"]["hasNextPage"]: break
cur=pr["pageInfo"]["endCursor"]; time.sleep(0.6)
json.dump(out,open('/tmp/admin_products.json','w'))
from collections import Counter
print(f"fetched {len(out)} products over {pages} pages")
print("status mix:",Counter(p['status'] for p in out))
print("published mix:",Counter('pub' if p['publishedAt'] else 'unpub' for p in out))