cl1p.net - The internet clipboard
Login/Sign Up
cl1p.net/sn
cl1p.net/sn
Login/Sign Up
This cl1p will be deleted in in 30 days.
Copy
#!/bin/env python3 import base64, datetime, json, requests, time url = 'https://stacker.news/api/graphql' sess = requests.Session() def getItems(start, end, sub): query = "fragment ItemFields on Item { id createdAt user { name } text } query SubItems($sub: String, $sort: String, $cursor: String, $type: String, $name: String, $when: String, $from: String, $to: String, $by: String, $limit: Limit) { items(sub: $sub sort: $sort cursor: $cursor type: $type name: $name when: $when from: $from to: $to by: $by limit: $limit) { cursor items { ...ItemFields } } }" vars = {"operationName":"SubItems","variables":{"sort":"top","type":"all","when":"custom","from":start,"to":end,"limit":999},"query":query} if sub != None: vars['variables']['sub'] = sub items = [] cursorTime = None while True: if cursorTime != None: s = '{"offset":%d,"time":"%s"}' % (len(items), cursorTime) vars['variables']['cursor'] = base64.b64encode(s.encode('utf-8')).decode('utf-8') # print(vars) x = sess.post(url, json=vars) j = json.loads(x.text) try: items.extend(j['data']['items']['items']) except: print(x.text) exit(0) # print('got %d items, total %d' % (len(j['data']['items']['items']), len(items))) cursor = j['data']['items']['cursor'] if cursor != None: # print('cursor %s %s' % (cursor, base64.b64decode(cursor).decode('utf-8'))) cursorTime = json.loads(base64.b64decode(cursor).decode('utf-8'))['time'] else: break items = sorted(items, key=lambda item: item['createdAt']) # print('total %d items' % len(items)) return items sub = None # all subs sub = 'Stacker_Sports' for year in range(2025, 2026): for month in range(1, 9): t = time.strptime('%.4d-%.2d-01 00:00:00' % (year, month), '%Y-%m-%d %H:%M:%S') d = datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, tzinfo=datetime.timezone.utc) start = str(int(d.timestamp()) * 1000) if d.month == 12: d = d.replace(day=31) else: d = d.replace(month=d.month+1, day=1) - datetime.timedelta(days=1) d = d.replace(hour=23, minute=59, second=59) end = str(int(d.timestamp()) * 1000 + 999) items = getItems(start, end, sub) print('year %d, month %d, start %s, end %s, sub %s, total %d' % (year, month, start, end, sub, len(items)))