← 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))