#!/usr/bin/env python3 # -*- coding: utf-8 -*- """仅重拍主截图 (不触发任何深层点击)。 用途: 修复"数据没加载好就截图 -> 只截到首屏空表"的问题。 现在 fresh_page 内含 settle_content(等 docH 稳定 + 数据就绪), 重拍后 列表/报表页会等到数据渲染完(docH 增长)再整页拼接, 从而截全。 安全: 只做 导航 -> 去遮挡(仅点"立即刷新"/"跳过引导") -> 截图 -> 覆盖原图, 绝不点击 保存/删除/提交/确定/发送 等任何写操作。 用法: python3 recap_main.py att # 只重拍 18 个有附件的页面 python3 recap_main.py all # 重拍全部 level=2 页面主图 python3 recap_main.py # 重拍指定 node_key """ import os, sys, time sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from capture_full import capture, ev from rewalk import fresh_page, SESSION, BASE, dbc, log MODE = sys.argv[1] if len(sys.argv) > 1 else "att" def targets(conn): if MODE == "all": rows = conn.execute( "SELECT node_key,name,url,full_path,screenshot_path FROM features " "WHERE level=2 AND url IS NOT NULL AND url<>'' ORDER BY sort_order,id").fetchall() elif MODE == "att": rows = conn.execute( "SELECT DISTINCT f.node_key,f.name,f.url,f.full_path,f.screenshot_path FROM features f " "JOIN downloads d ON d.node_key=f.node_key " "WHERE d.node_key IS NOT NULL AND d.node_key<>'' AND f.url IS NOT NULL AND f.url<>'' " "ORDER BY f.name").fetchall() else: rows = conn.execute( "SELECT node_key,name,url,full_path,screenshot_path FROM features WHERE node_key=?", (MODE,)).fetchall() return [dict(r) for r in rows] def main(): conn = dbc() conn.execute("PRAGMA journal_mode=DELETE") rows = targets(conn) total = len(rows) log("=== recap_main mode=%s total=%d ===" % (MODE, total)) ok = fail = 0 for i, r in enumerate(rows): nk = r["node_key"]; url = r["url"]; rel = r["screenshot_path"] if not rel: log("[%d/%d] SKIP no screenshot_path %s" % (i + 1, total, nk)); continue out_abs = os.path.join(BASE, rel) log("[%d/%d] %s %s" % (i + 1, total, r["name"], url)) try: fresh_page(url) capture(SESSION, out_abs, 16) conn.execute("DELETE FROM page_shots WHERE node_key=? AND kind='main'", (nk,)) conn.execute( "INSERT INTO page_shots(node_key,full_path,url,kind,label,path,ts) " "VALUES(?,?,?,?,?,?,?)", (nk, r.get("full_path"), url, "main", "主界面", rel, time.strftime("%Y-%m-%d %H:%M:%S"))) conn.commit() ok += 1 except Exception as e: fail += 1 log(" FAIL %s: %s" % (nk, str(e)[:120])) conn.execute("PRAGMA journal_mode=DELETE"); conn.commit(); conn.close() log("=== recap DONE ok=%d fail=%d total=%d ===" % (ok, fail, total)) if __name__ == "__main__": main()