Files
twoJob-demo/scripts/__pycache__/rewalk.cpython-313.pyc
T

184 lines
26 KiB
Plaintext
Raw Normal View History

2026-09-03 15:35:23 +08:00
ó
mÁZjêIãób•SrSSKrSSKrSSKrSSKrSSKrSSKr\RRS\RR\RR\ 555 SSK
JrJrJrJrJr Sr\RR\RR\RR\ 555r\RR+\SS5r\RR+\SS5rSrS rS
rS rS rS
r\R<R?\R<RA055r!S&Sjr"Sr#S'Sjr$Sr%Sr&Sr'SRQS\5r)SRQS\5r*Sr+Sr,Sr-Sr.Sr/Sr0Sr1Sr2Sr3S r4S(S!jr5S"r6S#r7S$r8\9S%:Xa\8"5 gg))u
阶段B Part1: �走全部��页 -> 去�挡 -> ��主截图 -> 安全抓� 4 类更深界�。
安全约�(硬性):
�览器是用户本人登录的真实 Chrome。深层抓�一律"打开 -> 截图 -> �页�载",
��点击 �存/删除/�交/确定/�� 等会产生真实数��更的按钮(� BAD 黑��)。
为��状�污染: �抓一个深层界��都�新导航到干净页�, �打开一个目标�立�截图,
��任何"确认"�作; 下一个深层界���次�载��。
4 类深层界�:
add 主�作弹窗(顶部工具� 新增/添加/新建/创建/录入/�起 表�)
detail 行详情/编辑(首个数�行的 详情/查看/编辑)
filter 筛选��(#icon-filter / 文本"筛选")
columns 自定义列/表头设置(#icon-custom-columns / 文本 自定义列/列设置/表头设置)
menu_* 更多��里已�现且安全的�置类入�(page_extras 白��)
存储:
主截图: 覆盖 features.screenshot_path
深层截图: �目录 <base>__<kind>.jpg, 记录到 page_shots(node_key,full_path,url,kind,label,path,ts)
断点续跑: page_shots 已有该 node_key 的 kind=main 记录则整页跳过(除� --force)。
用法: python3 rewalk.py [start_index] [--force]
éN)ÚcaptureÚevÚshotÚcallÚHIDE_JSÚ2haohrÚdbz research.dbzrewalk_progress.loguN删除|移除|å�œç”¨|注销|作废|清空|批é‡�|放弃|æ��交|ä¿�å­˜|确定|确认|å�‘é€�|ç¦�用|冻结|解除|终止|结æ�Ÿ|撤销|é‡�ç½®|清除|导入|上传|å�Œæ­¥|生æˆ�|å�‘放|å½’æ¡£|å°�å­˜|开除|辞退|下架|驳回|通过|æ‹’ç»�|办ç�†|æ�¢å¤�|å�¯ç”¨|é”�定|è§£é”�|导出|下载|离è�Œ|开票|付款|转账|扣款|å�‘èµ·æµ�程uƒè®¾ç½®|字段|é…�ç½®|规则|对比|说明|模æ�¿|方案|切æ�¢è§†å›¾|调整排åº�|自定义列|列设置|表头|视图|统计å�£å¾„cód•[R"[5n[RUlU$)N)Úsqlite3ÚconnectÚDBÚRowÚ row_factory)Úcs Ú9/Users/lucky/Documents/WorkSapce/TwoJob/scripts/rewalk.pyÚdbcr+s€Ü�ŠœÓ€A¬W¯[©[˜Qœ]À¸(ócóÆ•[R"S5U-n[USS9 [[S5nUR US-5 SSS5 g!,(df  g=f)Nz %H:%M:%S T)ÚflushÚaÚ
)ÚtimeÚstrftimeÚprintÚopenÚLOGÚwrite)ÚmsgÚlineÚfs rÚlogr!/sD€Ü �=Š=˜Ó %¨Ñ +€DÜ ˆ$�dÒÜ
Œc�3Œ˜1Ø �‰��t‘ Ô÷
�Žús ´AÁ
A có•[R"SUSS.[S.5R5nSn[ S5Hyn[
R R[USS0S9n[RUS S
9n[R"UR5R55sSSS5 s $ Ue!,(df  MŽ=f![a)nUn[R "S US --5 SnAM¿SnAff=f) NÚnavigateF)ÚurlÚnewTab)ÚactionÚargsÚsessionéz Content-Typezapplication/json)ÚdataÚheadersé-)Útimeoutçø?)ÚjsonÚdumpsÚSESSIONÚencodeÚrangeÚurllibÚrequestÚRequestÚ
DAEMON_URLÚ_OPENERrÚloadsÚreadÚdecodeÚ ExceptionrÚsleep)r$ÚbodyÚlastÚattemptÚreqÚrespÚes rr#r#6sÐ€Ü �:Š: ¸SÈEÑ5RÔ_fÑgÓ h× oÑ oÓ q€DØ €Dܘ–8ˆð ,Ü—.‘.×(Ñ(¬¸$ÈÐYkÐHlÐ(ÐmˆCÜ—‘˜c¨2�Ñ.°$Ü—z’z $§)¡)£+×"4Ñ"4Ó"6Ó7÷/Ó.ñð €J÷ /Ö.ûäó ,؈DÜ �JŠJ�s˜W s™]Ñ*× +Ò +ûð ,ús6Á9CÁ:2B<Â, CÂ<
C ÃCÃ CÃ
DÃC<Ã<Dzhttp://127.0.0.1:10086/commandcóH•[R"5n[R"5U-
U:aa[S[5S:Xa[R"S5 g[R"S5 [R"5U-
U:aMag![a NAf=f)Nz(()=>document.readyState)()Úcompleteg333333ó?Tç333333ã?F)rrr1r=r<)Úmax_waitÚt0s rÚ
wait_readyrIHsƒ€Ü
�Š‹€BÜ
�)Š)‹+˜Ñ
˜XÓ
%ð ÜÐ/´Ó9¸ZÓGÜ—
’
˜3”¨ðHô
�
Š
�3Œô
�)Š)‹+˜Ñ
˜XÕ
%ð øôó Ù ð ús³*BÂ
B! B!u¿(()=>{const de=document.documentElement;const m=(document.body.innerText||'').match(/å…±\s*([\d,]+)\s*æ�¡/);return JSON.stringify({docH:de.scrollHeight,cnt:m?m[1].replace(/,/g,''):null});})()có¼•[R"5nSnSn[R"5U-
U:Ga[R"[[[
5=(d S5n[URS5=(d S5nURS5nUSL=(d. [U5R5=(a [U5S:„nXR:Xa US:”aUS-OSnUnUS:¼a%U(a[R"5U-
S :”aU$[R"S
5 [R"5U-
U:aGMU$![ a 0nNñf=f) u截图å‰�等内容稳定: 轮询 docH 直到连续两次ä¸�å�˜, 且(若页é�¢æœ‰'å…±Næ�¡')æ•°æ�®>0。
列表/报表页的表格数�是异步加载的, 加载完�� docH �会增长到真实高度;
若在'å…±0æ�¡/加载中'时截图, 会å�ªæˆªåˆ°é¦–å±�空表(没截全)。éÿÿÿÿrz{}ÚdocHÚcntNéér.gà?) rr/r9rÚ SETTLE_JSr1r<ÚintÚgetÚstrÚisdigitr=)rGrHr?ÚstableÚmÚhrMÚdata_oks rÚsettle_contentrYXs€ô
�Š‹€B˜R�d¨! Ü
�)Š)‹+˜Ñ
˜XÔ
%ð Ü—
’
œ2œi¬Ó1×9°TÓ:ˆAô
�—‘�f“
×" Ó #ˆØ�e‰e�E‹lˆØ˜$�;×H¤C¨£H×$4Ñ$4Ó$6×$G¼3¸s»8Àa¹<ˆØ !£ ¨a°!«e�˜!’¸!ˆØˆØ �Q‹;ž7¤t§y¢y£{°RÑ'7¸#Ó'=؈HÜ �
Š
�3Œô �)Š)‹+˜Ñ
˜XÖ
%ð €Køôó ØŠAð ús¸1E Å EÅEuê
(()=>{
const vis=el=>{const r=el.getBoundingClientRect();return r.width>0&&r.height>0&&getComputedStyle(el).visibility!=='hidden';};
let acts=[];
const refresh=[...document.querySelectorAll('a,button,span')].find(x=>x.childElementCount===0&&/立�刷新/.test((x.innerText||'').trim())&&vis(x));
if(refresh){refresh.click();acts.push('refresh');}
const skip=[...document.querySelectorAll('a,button,span,div')].find(x=>x.childElementCount===0&&/^(跳过|我知�了|知�了|跳过引导|���示|下次�说|以��说)$/.test((x.innerText||'').trim())&&vis(x));
if(skip){skip.click();acts.push('skip');}
// DOM ��引导�罩/�议弹层(纯客户端, �产生�务端动作)
const masksel=['[class*=guide]','[class*=Guide]','[class*=driver]','[class*=intro]','[class*=newbie]','[class*=Newbie]','[class*=agreement]','[class*=Agreement]','[class*=guideMask]','[class*=coach]'];
masksel.forEach(s=>document.querySelectorAll(s).forEach(el=>{const r=el.getBoundingClientRect();const p=getComputedStyle(el).position;if((p==='fixed'||p==='absolute')&&r.width>window.innerWidth*0.4&&r.height>window.innerHeight*0.3){el.style.setProperty('display','none','important');acts.push('mask');}}));
return JSON.stringify(acts);
})()
có¼•[R"[[[5=(d S5n[[ [5 SU;$![
a /nN'f=f)u1返回是å�¦è§¦å�‘了 refresh(需é‡�新等待)。z[]Úrefresh)r/r9rÚ DEOCCLUDE_JSr1r<r)Úactss rÚdeocclude_mainr^~sN€ðÜ�zŠzœ"œ\¬7Ó3×;°tÓ<ˆô„w”ÔØ ˜Ñ Ðøô óØŠðús‚1A Á AÁAcó¾•[[5n[R"[RR U5SS9 UR
USSS9 UR$)NT)Úexist_okÚJPEGéP)Úquality)rr1ÚosÚmakedirsÚpathÚdirnameÚsaveÚsize)Úout_absÚimgs rÚ save_shotrlˆsA€Ü
Œw‹-€C܇K‚K”—‘—‘ Ó(°4Ò8؇H�HˆW�f b€HÑ)Ø �8‰8€Oruþ
(()=>{
const bad=/%BAD%/; const add=/(新增|添加|新建|创建|录入|�起)/;
const cands=[...document.querySelectorAll('button,a')].filter(x=>{
const t=(x.innerText||'').trim(); const r=x.getBoundingClientRect();
return t&&t.length<=8&&add.test(t)&&!bad.test(t)&&r.width>0&&r.height>0&&r.top<340;});
cands.sort((a,b)=>a.getBoundingClientRect().top-b.getBoundingClientRect().top);
if(!cands.length) return '';
const t=(cands[0].innerText||'').trim(); cands[0].click(); return t;
})()
ú%BAD%uQ
(()=>{
const bad=/%BAD%/; const want=/^(详情|查看|编辑|查看详情|详情信�)$/;
const els=[...document.querySelectorAll('span,a,button')].filter(x=>{
const t=(x.innerText||'').trim(); const r=x.getBoundingClientRect();
return want.test(t)&&!bad.test(t)&&x.childElementCount<=1&&r.width>0&&r.height>0&&r.top>150&&r.top<window.innerHeight;});
els.sort((a,b)=>{const ra=a.getBoundingClientRect(),rb=b.getBoundingClientRect();return ra.top-rb.top||ra.left-rb.left;});
if(!els.length) return '';
const t=(els[0].innerText||'').trim(); els[0].click(); return t;
})()
u}
(()=>{
let target=null;
document.querySelectorAll('use').forEach(u=>{const h=u.getAttribute('xlink:href')||u.getAttribute('href')||'';if(/#icon-filter|#icon-shaixuan|filter/i.test(h)&&!target){target=u;}});
if(!target){target=[...document.querySelectorAll('button,span,div')].find(x=>x.childElementCount<=2&&/^筛选$/.test((x.innerText||'').trim())&&x.getBoundingClientRect().width>0);}
if(!target) return '';
let el=target; for(let i=0;i<4&&el;i++){if(el.tagName==='BUTTON'||el.getAttribute('role')==='button'||/btn|button/i.test(el.className||'')){break;}el=el.parentElement;}
(el||target).click(); return 'filter';
})()
uÐ
(()=>{
let target=null;
document.querySelectorAll('use').forEach(u=>{const h=u.getAttribute('xlink:href')||u.getAttribute('href')||'';if(/#icon-custom-columns|#icon-column|#icon-setting-col|columns/i.test(h)&&!target){target=u;}});
if(!target){target=[...document.querySelectorAll('button,span,div')].find(x=>x.childElementCount<=2&&/^(自定义列|列设置|表头设置|表头字段|字段设置)$/.test((x.innerText||'').trim())&&x.getBoundingClientRect().width>0);}
if(!target) return '';
let el=target; for(let i=0;i<4&&el;i++){if(el.tagName==='BUTTON'||el.getAttribute('role')==='button'||/btn|button/i.test(el.className||'')){break;}el=el.parentElement;}
(el||target).click(); return 'columns';
})()
ug
(()=>{
const el=[...document.querySelectorAll('button,a,span,div')].find(x=>x.childElementCount<=2&&/^(更多�作|更多功能|···|\.\.\.|⋯)$/.test((x.innerText||'').replace(/\s/g,''))&&x.getBoundingClientRect().width>0&&x.getBoundingClientRect().top>60&&x.getBoundingClientRect().top<420);
if(el){el.click();return 'clicked';}return 'none';
})()
a¤
(()=>{
const bad=/%BAD%/; const label=%LABEL%;
const el=[...document.querySelectorAll('[class*=dropdown] li,[class*=Dropdown] li,[class*=popper] li,[class*=Popover] li,[role=menu] li,[class*=dropdown] a,[class*=menuItem],li,[role=menuitem]')].find(x=>{
const t=(x.innerText||'').trim(); return t===label&&!bad.test(t)&&x.getBoundingClientRect().width>0;});
if(el){el.click();return 'ok';}return 'miss';
})()
cóZ•Sn[[U[55$![a gf=f)Naœ(()=>{const s=['.el-overlay','.el-dialog__wrapper','.el-drawer','.el-drawer__container','[class*=dialog]','[class*=Dialog]','[class*=drawer]','[class*=Drawer]','[class*=popper]','[class*=Popover]','[role=dialog]'];for(const q of s){for(const el of document.querySelectorAll(q)){const r=el.getBoundingClientRect();if(r.width>120&&r.height>120&&getComputedStyle(el).display!=='none')return true;}}return false;})()F)Úboolrr1r<)Újss rÚ
modal_visiblerqÏs2€ð S€BðÜ”B�rœ7“OÓ$Ð$øÜ óÙðús „�
*©*a
(()=>{let n=0;const W=innerWidth,H=innerHeight;
document.querySelectorAll('div,aside,section,ul').forEach(el=>{
const s=getComputedStyle(el);const r=el.getBoundingClientRect();const z=parseInt(s.zIndex)||0;
const floaty=(s.position==='fixed'||s.position==='absolute');
if(floaty&&s.display!=='none'&&r.width>=200&&r.width<=W*0.99&&r.height>=160&&r.top<H-30&&r.bottom>60&&
(z>=8||/dialog|drawer|popper|popover|modal|mask|panel|Dialog|Drawer/.test(el.className||''))){n++;}
});return n;})()
cóp•[[[[5=(d S5$![a gf=f)Nr)rQrÚPANEL_COUNT_JSr1r<©rrÚpanelsruæs0€ðÜ”2”n¤gÓ.×3°!Ó4Ð4øÜ óÙðús ‚%(¨
5´5có´•[U5 [5 [5(a[5 [5 [5 [R
"S5 g)uC导航到干净页é�¢: é‡�è½½ + 去é�®æŒ¡ + (若刷新)å†�等待。g333333Ó?N)r#rIr^rYrr=)r$s rÚ
fresh_pagerwís1€ä ˆS„M”:”<Ü×ÑÜŒ ”nÔ&ÜÔ܇J‚Jˆs…OrcóV•[S[5=(d S$![a gf=f)Nz(()=>location.href)()Ú)rr1r<rtrrÚcur_urlrzös,€ðÜÐ)¬7Ó3×9°rÐ9øÜ óÙðús ‚›
(§(có`•U=(d SRS5SRS5S$)NryÚ?rÚ#)Úsplit)Úus rÚurl_pathr€ýs*€Ø
�G��?‰?˜3Ó  Ñ "× (Ñ (¨Ó -¨aÑ 0Ð0rc ó.•[RRU5n [RR[RR U55Sn
U
<SU<S3n [RR X›5n [RR [ U 5n
[RRU
5(a$[RRU
5S:”ag[U5 [[55n[5n[U[5nU(dg[R "S5 [[55nUU:gnU(aU(dgU(d&[#5=(d
[5U:„nU(dgU(a*[%5 [R "S5 ['5 [[([5 U(a[+[U
S5 O [-U
5 UR5S
XX[7U[25(aUOUU [R8"S545 UR;5 U$![.a-n[1S U<S
U<S [3U5SS <35 SnAgSnAff=f)u|é‡�载到干净页 -> 执行 open_js -> 判定出现(整页跳转表å�• 或 弹层) -> 截图 -> 记录。ç»�ä¸�å�šç¡®è®¤ã€‚rÚ__ú.jpgé¸ NçÍÌÌÌÌÌô?rFéz shot-fail Ú ú: rbúWINSERT INTO page_shots(node_key,full_path,url,kind,label,path,ts) VALUES(?,?,?,?,?,?,?)ú%Y-%m-%d %H:%M:%S)rdrfrgÚsplitextÚbasenameÚjoinÚBASEÚexistsÚgetsizerwr€rzrurr1rr=rqrIr^rrrlr<r!rSÚexecuteÚ
isinstancerÚcommit)r$Únode_keyÚ full_pathÚout_baseÚkindÚopen_jsÚlabelÚconnÚ accept_routeÚrel_dirÚbaseÚfnameÚrel_pathrjÚbeforeÚb_panelsÚclickedÚafterÚroutedÚopenedrCs rÚ deep_capturer¦s¾€ä�g‰g�o‰o˜hÓ'€GÜ
�7‰7× Ñ œBŸG™G×,Ñ,¨XÓ6Ó 7¸Ñ :€DÛ £$Ð '€EÜ�w‰w�|‰|˜GÓ+€HÜ�g‰g�l‰lœ4 Ó*€GÜ ‡w�w‡~�~�g×Ѥ2§7¡7§?¡?°7Ó#;¸dÓ#BØÜˆs„OÜ
”g“iÓ
€FÜ‹x€HÜ�œ'Ó"€GÞ ØÜ‡J‚Jˆs„OÜ ”W“YÓ €EØ
�f‰_€FÞ
–lØÞ Ü“×7¤F£H¨xÑ$7ˆÞØÞ
ÜŒ ”d—j’j ”o¤~Ô'7Ü„w”ÔðÞ Ü ”G˜W bÕ )ä �gÕ ð ‡L�LÐjØ s¼ZÈÔQT×=UÑ=U±'Ð[`ÐbjÜ—-’-Ð 3Ó4ð6ô7ð ‡K�K„MØ €Nøô óÝ «4³¼#¸a»&ÀÀ"º+Ð FÔGÜûðúsÇ$IÇ= IÉ
JÉ'#JÊJc
ób•USo0So@SnUSn[RR[U5nU(d)UR SU45R 5nU(ag[
U5 [[US5 UR S U45 UR S
XEUSSU[R"S545 UR5 S/n
S[S4S[ S4S["S4S[$S44HMup¼n
['X4XVX¼SXS9 nU(a2U
R)U <S[+U[5(aUOS<S35 MMMO SSKnUR SU45R/5n/nUH{n U S =(d SR15nU(dM(UR3[4U5(dMEUR3[6U5(aMbUU;dMjUR)U5 M} USS!Hmn[8R;S"[65R;S#[<R>"USS$95n[AX4XVUUU5nU(aU
R)S%U-5 MmMo [S'U<S(S)RU
5<S*35 g+![a)n [SU<S [U 5SS
<35 Sn A g Sn A ff=f![a+n [SU <S[U 5SS<35 Sn A GMùSn A ff=f![a+n [S&U<S[U 5SS<35 Sn A GM3Sn A ff=f),Nr$r”r•Úscreenshot_pathzASELECT 1 FROM page_shots WHERE node_key=? AND kind='main' LIMIT 1Úskipr†z main-capture FAIL rˆédÚfailz7DELETE FROM page_shots WHERE node_key=? AND kind='main'r‰Úmainu 主界é�¢rŠÚfilterFÚcolumnsÚaddTÚdetail)r›Ú(ryÚ)z deep z err: rbrz.SELECT label FROM page_extras WHERE node_key=?r™érmz%LABEL%)Ú ensure_asciizmenu(%s)z menu z OK z [z, Ú]Údone)!rdrfr�rŽr‘Úfetchonerwrr1r<r!rSrrr“Ú OPEN_FILTERÚ OPEN_COLUMNSÚOPEN_ADDÚ OPEN_DETAILr¦Úappendr’ÚreÚfetchallÚstripÚsearchÚ MENU_SAFEÚBADÚCLICK_MENU_ITEMÚreplacer/r0Údeep_capture_menu)ÚrršÚforcer$r”r•Úrel_mainÚout_mainr¶rCÚtallyr—rpÚaccrÚ_reÚextrasÚsafeÚlabÚitem_jss rÚ process_pagerÑ+sÏ€Ø
ˆE‰(€C ™}�H¸K¹.¨iØÐ"Ñ#€HÜ�w‰w�|‰|œD (Ó+€Hö Ø�|‰|Ð_Ø%˜Kó)ß)1©«ð
æ Øôˆs„OðÜ”˜ 2Ô&ð ‡L�LÐJÈXÈKÔX؇L�LÐjØ s¨F°KÀÌ4Ï=Ê=ÐYlÓKmÐnôpà‡K�K„Mà
ˆH€Eà#¤[°%Ð8¸9ÄlÐTYÐ:ZØ ¤(¨DÐ1°H¼kÈ4Ð3PóR‰
ˆ�#ð ?ܘS¨IÀÈ4ÐQUÑhˆAÞØ— ‘ «´J¸qÄ#×4FÑ4F©qÈBÒ/NÐOÖPññ RóØ
�\‰\ÐJÈXÈKÓ
X×