| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- """Bounded read-only research requests for one local workshop rehearsal."""
- import argparse
- import datetime
- import hashlib
- import json
- from pathlib import Path
- import urllib.error
- import urllib.request
- ROOT = Path(__file__).resolve().parents[1]
- WORK = ROOT / 'work/workshop-self-run-20261110'
- EVIDENCE = WORK / 'evidence'
- GENERATION = '82b104fc024b49a75d2f5376bf9778ced6f63a9433b5fc5a6daa3c458d05d5ea'
- def read(name, endpoint, body):
- assert endpoint in ('library', 'industry')
- assert body['op'] in {'summary', 'version', 'browse', 'detail', 'contract', 'overview', 'policies', 'rankings', 'workshop'}
- EVIDENCE.mkdir(parents=True, exist_ok=True)
- target = EVIDENCE / (name + '.json')
- assert not target.exists(), 'Evidence is immutable; use another request name'
- request = {**body}
- if body['op'] not in ('summary', 'version', 'contract'):
- request['generation'] = GENERATION
- url = 'https://kangshifu.fmode.cn/api/' + endpoint
- req = urllib.request.Request(url, data=json.dumps(request, ensure_ascii=False).encode(),
- headers={'Content-Type': 'application/json'}, method='POST')
- try:
- response = urllib.request.urlopen(req, timeout=40)
- except urllib.error.HTTPError as error:
- response = error
- raw = response.read()
- target.write_bytes(raw)
- data = json.loads(raw)
- receipt = {'name': name, 'requestedAt': datetime.datetime.now(datetime.timezone.utc).isoformat(),
- 'url': url, 'request': request, 'httpStatus': response.code,
- 'responseSha256': hashlib.sha256(raw).hexdigest(), 'bytes': len(raw),
- 'ok': data.get('ok'), 'generation': data.get('generation'),
- 'readOnly': data.get('readOnly'), 'databaseWrites': data.get('databaseWrites'),
- 'error': data.get('error')}
- (EVIDENCE / (name + '.request.json')).write_text(json.dumps(receipt, ensure_ascii=False, indent=2), encoding='utf-8')
- assert not data.get('ok') or data.get('readOnly') is True and data.get('databaseWrites') == 0
- print(json.dumps(receipt, ensure_ascii=False))
- return data
- if __name__ == '__main__':
- p = argparse.ArgumentParser(description=__doc__)
- p.add_argument('name')
- p.add_argument('endpoint', choices=['library', 'industry'])
- p.add_argument('request_json')
- args = p.parse_args()
- read(args.name, args.endpoint, json.loads(args.request_json))
|