fetch-workshop-self-run-detail.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """Record exact read requests; no collection, publishing or business writes."""
  2. import concurrent.futures
  3. import json
  4. import runpy
  5. from pathlib import Path
  6. ROOT = Path(__file__).resolve().parents[1]
  7. read = runpy.run_path(str(ROOT / 'scripts/workshop-self-run-evidence.py'))['read']
  8. base = ROOT / 'work/workshop-self-run-20261110/evidence'
  9. def existing_or_read(name, endpoint, request):
  10. p = base / (name + '.json')
  11. if p.exists():
  12. return json.loads(p.read_bytes())
  13. return read(name, endpoint, request)
  14. def job(item):
  15. name, endpoint, request = item
  16. d = existing_or_read(name, endpoint, request)
  17. return {'name': name, 'ok': d.get('ok'), 'error': d.get('error')}
  18. if __name__ == '__main__':
  19. jobs = []
  20. reviews = json.loads((base / 'banmian-reviews.json').read_bytes())['records']
  21. for i, row in enumerate(reviews):
  22. jobs.append((f'review-{i+1:02}', 'library', {'op': 'detail', 'entity': 'reviews', 'id': row['record_id']}))
  23. products = ['jd:100005702440', 'jd:100034276081', 'jd:100151245426', 'jd:100004189813', 'jd:100017748144', 'jd:100051133922', 'jd:100090896362']
  24. for i, pid in enumerate(products):
  25. jobs.append((f'product-{i+1:02}', 'library', {'op': 'detail', 'entity': 'products', 'id': pid}))
  26. for entity in ['prices', 'specs']:
  27. jobs.append((f'product-{i+1:02}-{entity}', 'library', {'op': 'browse', 'entity': entity, 'filters': {'productId': pid}, 'limit': 50}))
  28. social = ['bilibili:BV1Ce4y1y7ae', 'bilibili:BV1KvxL6REnb', 'xiaohongshu:6a20e1cb0000000008030f1e',
  29. 'xiaohongshu:6a43a84e000000001702b983', 'xiaohongshu:6a1e81c5000000003701e466',
  30. 'bilibili:BV1uS25BuEPa', 'bilibili:BV12rkfBmEu5', 'xiaohongshu:6a1d6cbd0000000038020669',
  31. 'xiaohongshu:653c86840000000025017ba3', 'bilibili:BV13p8K62EZW']
  32. for i, rid in enumerate(social):
  33. jobs.append((f'social-{i+1:02}', 'library', {'op': 'detail', 'entity': 'social', 'id': rid}))
  34. with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
  35. results = list(pool.map(job, jobs))
  36. print(json.dumps({'requests': len(results), 'allOk': all(r['ok'] for r in results)}, ensure_ascii=False))