import json, urllib.request, time KEY = open('.weread/apikey.txt', encoding='utf-8').read().strip() URL = "https://i.weread.qq.com/api/agent/gateway" def call(api, **kw): body = {"skill_version": "1.0.4", "api_name": api} body.update(kw) req = urllib.request.Request(URL, data=json.dumps(body).encode('utf-8'), headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"}) try: with urllib.request.urlopen(req, timeout=60) as r: return json.loads(r.read().decode('utf-8')) except Exception as e: return {"_error": str(e)} books = json.load(open('.weread/tmp/reading_books.json', encoding='utf-8')) out = {} for b in books: bid = b['bookId'] prog = call('/book/getprogress', bookId=bid) if prog.get('upgrade_info'): print('UPGRADE_INFO:', json.dumps(prog['upgrade_info'], ensure_ascii=False)); break marks = call('/book/bookmarklist', bookId=bid) out[bid] = {'title': b['title'], 'author': b['author'], 'progress': prog, 'marks': marks} bk = (prog.get('book') or {}) ut = bk.get('updateTime') or 0 print(f"{bid} | {b['title'][:20]} | prog={bk.get('progress')} | updateTime={ut} | ts={prog.get('timestamp')} | marks={len((marks.get('updated') or []))}") time.sleep(0.3) json.dump(out, open('.weread/tmp/books_detail.json', 'w', encoding='utf-8'), ensure_ascii=False) print('SAVED')