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

158 lines
23 KiB
Plaintext
Raw Normal View History

2026-09-03 15:35:23 +08:00
ó
›(Zj@ãóä•SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK r SSK
r
Sr Sr Sr
Sr/SQr/SQrS.S jrS.S
jrS rS rS
rSrS\R."\5-rS\R."\5-rSrS\-rSrSrSrS\-r/SQr S\R."\ 5<S\<S3r!Sr"Sr#Sr$Sr%Sr&S r'S!r(S"r)S#r*\+"5r,S$r-S/S%jr.S0S&jr/S'r0S(r1S)r2S*r3S+r4S,r5\6S-:Xa\5"5 gg)1u×
报表/文档导出下载器(Excel/Word 为主)。完整链路(已�环节实测验�):
入�:svg use[xlink:href=#icon-download] 图标(无文字,代�级定�)+ 文字“下载/生�excel�兜底;
生�:点图标 -> 弹“下载报表/导出��数窗 -> 点“确定�(默认�数) -> 异步生�;
�获:hook HTMLAnchorElement.prototype.click �获 rpt-cdn/prv-cdn 带 token 直链;
�盘:页�内�步 XHR �字节 -> base64 回传 -> 写 workspace(绕过 macOS ~/Downloads 的 TCC �制)。
阶段2:任务中心(taskCenter)收割兜底。产出真实 .xlsx/.docx,写 SQLite downloads 表;
页�间�机 5-15s;断点续跑(��>2000字节跳过)。
éNzhttp://127.0.0.1:10086/commandÚ2haohrzdb/research.dbzdb/dl_export.log)
u报表u分æž�u 仪表盘u统计u档案u模æ�¿u文档u制度u公告uè¯�明)õ 直接下载õ 生æˆ�excelõ 导出Excelõ 导出报表õ 批é‡�导出có<•[R"X[S.5R5n[R
R
[USS0S9n[R"[R
RXBS9R5R55$)N)ÚactionÚargsÚsessionz Content-Typezapplication/json)ÚdataÚheaders)Útimeout) ÚjsonÚdumpsÚSÚencodeÚurllibÚrequestÚRequestÚDÚloadsÚurlopenÚreadÚdecode)Úar rÚbÚrs Ú</Users/lucky/Documents/WorkSapce/TwoJob/scripts/dl_export.pyÚcallr sr€Ü �
Š
˜a¼!Ñ<Ó=×DÑDÓF€AÜ�‰×Ñœq q°>ÐCUÐ2VÐÐW€AÜ �:Š:”f—n‘n×,Ñ,¨QÐ,Ð@×EÑEÓG×NÑNÓPÓ QÐQócó°•[SSU0U5RS05RS5$![anS[U5SS-sSnA$SnAff=f)NÚevaluateÚcoder
ÚvaluezEXC:éP)r ÚgetÚ ExceptionÚstr)r$rÚes rÚevr+sW€ð$Ü�J ¨ °Ó8×<Ñ<¸VÀRÓH×LÑLÈWÓUÐUøÜ ó$Øœ˜A›˜s ˜ Ñ#Õ#ûð$ús‚-0°
AºAÁ
AÁAcóÆ•[R"S5U-n[USS9 [[S5nUR US-5 SSS5 g!,(df  g=f)Nz %H:%M:%S T)ÚflushrÚ
)ÚtimeÚstrftimeÚprintÚopenÚLOGÚwrite)ÚmÚlineÚfs rÚlogr8sD€Ü �=Š=˜Ó %¨Ñ )€DÜ ˆ$�dÒÜ
Œc�3Œ˜1Ø �‰��t‘ Ô÷
�Žús ´AÁ
A a¢(()=>{window.__cap=window.__cap||[];
if(!HTMLAnchorElement.prototype.__hk){const ac=HTMLAnchorElement.prototype.click;
HTMLAnchorElement.prototype.click=function(){try{const h=this.href||'';
if(h&&/-cdn\.2haohr|prv-cdn|rpt-cdn|attname=|\.xlsx|\.xls|\.docx|\.doc|\.zip/i.test(h))window.__cap.push(h);}catch(e){}
return ac.apply(this,arguments);};HTMLAnchorElement.prototype.__hk=1;}
return 'ok';})()zù(()=>{let n=0;document.querySelectorAll('use').forEach(u=>{
const h=u.getAttribute('xlink:href')||u.getAttribute('href');
if(h==='#icon-download'){const b=u.closest('button,a,[role=button]');if(b&&!b.hasAttribute('data-dl'))n++;}});return n;})()a9(()=>{const us=[...document.querySelectorAll('use')].filter(u=>(u.getAttribute('xlink:href')||u.getAttribute('href'))==='#icon-download');
for(const u of us){const b=u.closest('button,a,[role=button]');if(b&&!b.hasAttribute('data-dl')){b.setAttribute('data-dl','1');b.click();return 'ok';}}
return 'none';})()zÞ(()=>{const T=%s;let n=0;document.querySelectorAll('button,a,[role=button]').forEach(x=>{const t=(x.innerText||'').trim();if(T.includes(t)&&x.getBoundingClientRect().width>0&&!x.hasAttribute('data-dl'))n++;});return n;})()a(()=>{const T=%s;for(const t of T){const b=[...document.querySelectorAll('button,a,[role=button]')].find(x=>(x.innerText||'').trim()===t&&x.getBoundingClientRect().width>0&&!x.hasAttribute('data-dl'));if(b){b.setAttribute('data-dl','1');b.click();return t;}}return 'none';})()ue下载报表|导出|下载|部门|员工排åº�|工作性质|字段|范围|æ ¼å¼�|å�‚æ•°|排åº�|在è�ŒuJ(()=>{const cand=['确定','确认','下载','导出','生æˆ�excel','生æˆ�','ç«‹å�³å¯¼å‡º','ç«‹å�³ä¸‹è½½'];
const KW=/%s/;
const ms=[...document.querySelectorAll('[class*=modal],[class*=Modal],[role=dialog],[class*=dialog],[class*=drawer],[class*=Drawer]')];
const vis=ms.filter(m=>{const r=m.getBoundingClientRect();return r.width>200&&r.height>80&&getComputedStyle(m).display!=='none'&&getComputedStyle(m).visibility!=='hidden';});
// 优先带关键�的�数窗, �退化到任���弹层
const ranked=[...vis.filter(m=>KW.test(m.innerText||'')),...vis];
for(const m of ranked){
for(const t of cand){const b=[...m.querySelectorAll('button,a')].find(x=>(x.innerText||'').trim()===t&&x.getBoundingClientRect().width>0);
if(b){b.click();return 'modal:'+t;}}}
return vis.length?'modal:noconfirm':'nomodal';})()u (()=>{const ms=[...document.querySelectorAll('[class*=modal],[class*=Modal],[role=dialog],[class*=dialog],[class*=drawer]')];
for(const m of ms){const r=m.getBoundingClientRect();if(r.width>200&&r.height>80&&getComputedStyle(m).display!=='none'){
const c=[...m.querySelectorAll('button,a,[class*=close],[class*=Close]')]
.find(x=>{const t=(x.innerText||'').trim();return t==='�消'||t==='关闭'||(x.className+'').toLowerCase().includes('close');});
if(c){c.click();return 'closed';}}}return 'none';})()u±(()=>{const bad=/退出登录|ä¸�å�Œæ„�/;const ok=['知情并å�Œæ„�','å�Œæ„�å¹¶ç»§ç»­','我已阅读并å�Œæ„�','å�Œæ„�'];
const ms=[...document.querySelectorAll('[class*=modal],[class*=Modal],[role=dialog],[class*=dialog],[class*=drawer],[class*=Drawer]')]
.filter(m=>{const r=m.getBoundingClientRect();return r.width>200&&r.height>60&&getComputedStyle(m).display!=='none';});
for(const m of ms){const txt=m.innerText||'';if(!/�议|授�|��|�款|��/.test(txt))continue;
for(const t of ok){const b=[...m.querySelectorAll('button,a')].find(x=>(x.innerText||'').trim()===t&&!bad.test(x.innerText||''));
if(b){b.click();return 'agree:'+t;}}}
return 'none';})()uC退出登录|ä¸�å�Œæ„�|ç«‹å�³è´­ä¹°|预约演示|我è¦�更多功能uÛ(()=>{const BAD=/%s/;
const inNav=e=>!!e.closest('nav,[class*=navBar],[class*=sideMenu],[class*=taskCenter]');
const us=[...document.querySelectorAll('use')].filter(u=>(u.getAttribute('xlink:href')||u.getAttribute('href'))==='#icon-export');
for(const u of us){const b=u.closest('button,a,[role=button]');if(b&&!b.hasAttribute('data-dl')&&!inNav(b)){b.setAttribute('data-dl','1');b.click();return 'icon-export';}}
const b=[...document.querySelectorAll('button,a,[role=button]')].find(x=>{const t=(x.innerText||'').trim();return t==='导出'&&x.getBoundingClientRect().width>0&&!x.hasAttribute('data-dl')&&!inNav(x)&&!BAD.test(t);});
if(b){b.setAttribute('data-dl','1');b.click();return 'txt-导出';}
return 'none';})())rrrrru下载z(()=>{const T=z ;const BAD=/a’/;
const inNav=e=>!!e.closest('nav,[class*=navBar],[class*=sideMenu],[class*=taskCenter]');
for(const t of T){const b=[...document.querySelectorAll('button,a,[role=button]')].find(x=>(x.innerText||'').trim()===t&&x.getBoundingClientRect().width>0&&!x.hasAttribute('data-dl')&&!inNav(x)&&!BAD.test(x.innerText||''));
if(b){b.setAttribute('data-dl','1');b.click();return t;}}
return 'none';})()a²(()=>{try{if(!window.__cap||!window.__cap.length)return 'NO_HREF';
const u=window.__cap[window.__cap.length-1];const x=new XMLHttpRequest();x.open('GET',u,false);
x.overrideMimeType('text/plain;charset=x-user-defined');x.send();if(x.status!==200)return 'HTTP'+x.status;
const s=x.responseText;let out='';const CH=8192;for(let i=0;i<s.length;i+=CH){let c='';const e=Math.min(i+CH,s.length);
for(let j=i;j<e;j++)c+=String.fromCharCode(s.charCodeAt(j)&0xff);out+=c;}
window.__b64=btoa(out);const m=u.match(/attname=([^&]+)/);let name=m?decodeURIComponent(m[1]):('export_'+Date.now()+'.bin');
return JSON.stringify({size:s.length,name:name});}catch(e){return 'EX '+e.message;}})()uœ(()=>{const tc=document.querySelector('[class*=taskCenter]');if(!tc)return '[]';
const dls=[...tc.querySelectorAll('a')].filter(a=>(a.innerText||'').trim()==='下载');
const names=dls.map(a=>{const row=a.closest('[class*=item],li,div');const info=row&&row.querySelector('[class*=info_]');
return info?(info.innerText||'').replace(/\n+/g,' ').trim().slice(0,50):'';});
return JSON.stringify(names);})()uö(function(i){const tc=document.querySelector('[class*=taskCenter]');if(!tc)return 'NO_TC';
const dls=[...tc.querySelectorAll('a')].filter(a=>(a.innerText||'').trim()==='下载');
if(i>=dls.length)return 'OOB';dls[i].click();return 'ok';})(%d)cód•[R"[5n[RUlU$)N)Úsqlite3ÚconnectÚDBÚRowÚ row_factory©Úcs rÚdbrA{s€Ü�ŠœÓ€A¬W¯[©[˜Qœ]À¸(r!cóx•[5oRS5 UR5 UR5 g)NzÎCREATE TABLE IF NOT EXISTS downloads(
id INTEGER PRIMARY KEY AUTOINCREMENT, node_key TEXT, full_path TEXT, url TEXT,
kind TEXT, file_path TEXT, status TEXT, size INTEGER, note TEXT, ts TEXT))rAÚexecuteÚcommitÚcloser?s rÚensurerF~s1€Ü
‹€A�i‰iðUôVàWX×W_ÑW_ÔWaÐcd×cjÑcjÕclr!có¬•[5oˆRSXX#XEXg[R"S54 5 UR 5 UR 5 g)NzjINSERT INTO downloads(node_key,full_path,url,kind,file_path,status,size,note,ts) VALUES(?,?,?,?,?,?,?,?,?)z%Y-%m-%d %H:%M:%S)rArCr/r0rDrE) ÚnkÚfpÚurlÚkindÚpathÚstatusÚsizeÚnoter@s rÚrecrPƒsI€Ü
‹€A�i‰iðEØ �˜D¨$´d·m²mÐDWÓ6XÐYô[Ø\]×\dÑ\dÔ\fÐhi×hoÑhoÕhqr!cóf•[R"SSU=(d SR55SS$)Nz [\\/:*?"<>|]Ú_ÚéZ)ÚreÚsubÚstrip)Úss rÚsaferY‡s'€Ü
�6Š6�/ 3¨¯¨b¯©Ó(9Ó :¸3¸BÐ ?Ð?r!có¢•U(aFURS5(a0[RRUR SSS55$U=(d SR S5Vs/sH$o"R
5(dM[U5PM& nn[U5S:”a$[RR"S/USSQ76$S$s snf) Nz screenshots/z
downloads/érSz / Ú downloadséÿÿÿÿzdownloads/misc)
Ú
startswithÚosrLÚdirnameÚreplaceÚsplitrWrYÚlenÚjoin)ÚshotÚ full_pathÚpÚpartss rÚout_dirriŠs˜€Þ �—‘ ×/Ñ/Ü�w‰w�‰˜tŸ|™|¨N¸LÈ!ÓLÓMÐMØ(Ÿ¨B×5Ñ5°eÔ<Ó JÒ<˜ÇÁÇ ‹WŒT�!ŽWÑ<€EÐ JÜ58¸³ZÀ!³^Œ2�7‰7�<Š<˜ Ð 1 e¨C¨R jÒ 1ÐYÐIYÐYùò
Ks Á*C ÂC có^•[5oRS5R5Vs/sHn[U5PM nn[R
"[ 5nUHmTS(dMUTS==S-
ss'M! UR5 UVs/sHoRUSS5S:XdMUPM! nnUV^s/sH1mTS(dM[U4Sj[55(dM/TPM3 sn$s snfs snfs snf)NzKSELECT node_key,parent_key,name,full_path,url,screenshot_path FROM featuresÚ
parent_keyr[Únode_keyrrJc3ób># •UH$oTS=(d STS=(d S-;v• M& g7f)rfrSÚnameN©)Ú.0Úkrs €rÚ <genexpr>Úload_pages.<locals>.<genexpr>™s2øé€Ð1nÒkmÐfg¸¸+¹×8LÈ"ÐQRÐSYÑQZ×Q`Ð^`Ñ7aÖ2aÒkmùsƒ,/) rArCÚfetchallÚdictÚ collectionsÚ defaultdictÚintrEr'ÚanyÚKW)r@rÚrowsÚkidsÚleavess ` rÚ
load_pagesr~�síø€Ü
‹€A§y¡yØUó(WßW_ÑW_ÓWað(bócò(b !”d˜1–gñ(bˆdðcä × "Ò "¤3Ó '€DÛ
ˆØ ˆ\�?‰?Ø ��<‘Ó ! QÑ &Õ !ñð‡G�G„IÙÓ
Aš�A§¡¨!¨J©-¸Ó!;¸qÑ!@�a™€FÐ
AÙÔ o’v�!  5¥‹A¬cÔ1nÕkmÓ1n×.n�A‘vÑ oÐoùòcùòBùÚ os#¬C>ÂDÂ6DÃDÃDÃ5Dc óp•[[5n[U[5(aUR S5(dS[U5SS4$[
R "U5n[US5n[S5 U[;ag[R"[S55n[U5S ::ag
[R"US S 9 [RR!X5n [RR#U 5(a?[RR%U 5S
:”a[R'U5 S US-4$[)U S5R+U5 [R'U5 UR-5n
U
R/S5(aSOIU
R/S5(aSO1U
R/S5(aSOU
R/S5(aSOSn [1XX;U S[U5U5 [3SU [U5U 4-5 S U4$![a SnGN�f=f)NÚ{Fé(rnúwindow.__cap=[])FÚdupzwindow.__b64||''r!éÈ)FÚemptyT)Úexist_okiÐz(exists)Úwb)z.xlsxz.xlsÚxlsx)z.docxz.docÚdocxz.pdfÚpdfz.zipÚzipÚfileÚokz OK %s (%d bytes) -> %s)r+Ú
FETCH_LASTÚ
isinstancer)r^rrrYÚSAVEDÚbase64Ú b64decoder(rcr_ÚmakedirsrLrdÚexistsÚgetsizeÚaddr2r4ÚlowerÚendswithrPr8) ÚodirrHrIrJrOÚmetaÚinfornr
ÚdstÚlowrKs rÚ
grab_and_saverž�s·€Ü
Œj‹>€DÜ �tœS× !Ñ ! d§o¡o°c×&:Ñ&:Ø”c˜$“i  �nÐ$Ð$Ü �:Š:�dÓ €D¤D¨¨f©Ó$6˜T¼Ð;LÔ8MØ Œuƒ}ØðÜ×Ò¤Ð#5Ó 6Ó7ˆô ˆ4ƒy�CӨ܇K‚K�˜tÒ$¬B¯G©G¯L©L¸Ó,D cÜ ‡w�w‡~�~�c×ÑœrŸw™wŸ™¨sÓ3°dÓ:Ü
� ‰ �$Œ  d¨ZÑ&7Ð 7Ð7܈ˆdƒO×ј$Ô¤§¡¨4¤Ø
�*‰*‹,€CØ—\‘\Ð"3×4Ñ4‰6ÀSÇ\Á\ÐRc×EdÑEd¹6Ø—‘˜f×%Ñ%‰°S·\±\À&×5IÑ5I©EÈvð äˆ�˜3 ¤c¨$£i°Ô6ÜÐ$¨¬c°$«i¸Ð'=Ñ=Ô>Ø �ˆ:Ðøô óØ‹ðúsÂH%È% H5È4H5có•[R"5n[R"5U-
U:a[[R"S5 [S5n[U[5(aUS:”ag[R"5U-
U:aM[g)Néú&(window.__cap&&window.__cap.length)||0rTF)r/Úsleepr+r�rx)ÚsecondsÚt0Úns rÚ wait_capturer¦µsf€Ü
�Š‹€BÜ
�)Š)‹+˜Ñ
˜WÓ
$Ü �
Š
�1Œ
Ü Ð7Ó 8ˆÜ �aœ× Ñ  ! a£%Øô �)Š)‹+˜Ñ
˜WÕ
$ð
r!cóþ•[R"5nUS:XaTUS:a[R"SS5nO‰US:a[R"SS5nOk[R"SS5nOSUS:a[R"S S5nO5US
:a[R"SS5nO[R"SS 5n[S U[R"S
S5-5n[R
"U5 U$)uTé�žå�‡åŒ€æ‹Ÿäººé—´éš”:大部分短ã€�å°‘é‡�中ã€�å�¶å°”é•¿å�œé¡¿ + 高斯抖动。Úpageg333333ã?g@g"@g)\�Âõ(ì?g4@gE@gÃõ(\�Âå?gffffffö?gÃõ(\�Âí?g0@gš™™™™™é?rgà?)ÚrandomÚuniformÚmaxÚgaussr/r¢)rKrÚds rÚ human_delayr®¾s¸€ä�
Š
‹€AØ ˆvƒ~Ø ˆt‹8œŸš¨¨SÓ1‘QØ
�‹Xœ6Ÿ>š>¨#¨tÓ4‘qÜ—.’.  tÓ,‰aà ˆt‹8œŸš¨¨SÓ1‘QØ
�‹Xœ6Ÿ>š>¨#¨sÓ3‘qÜ—.’.  dÓ+ˆaÜ ˆC�”V—\’\ ! SÓ)Ñ)Ó*€A܇J‚Jˆq„MØ €Hr!cóP•[S5n[U[5=(a SU;$)Nz
location.hrefz/login)r+r�r))Úhrefs rÚ
logged_outr±Ís#€Ü
ˆoÓ €DÜ �dœCÓ × 5 X°Ñ%5Ð5r!có¨•[5nURS5R5nUR5 UVs1sHo"SiM sn$s snf)NzJSELECT DISTINCT node_key FROM downloads WHERE status='ok' AND node_key<>''r)rArCrtrE)r@r{rs rÚ
done_nodesr³ÑsD€Ü
‹€AØ �9‰9ÐaÓ b× kÑ kÓ m€D؇G�G„IÙÓ š$�QˆaŒD™$Ñ ÐùÒ s¾Ac
óЕ[S5 Sn[S5Hcn[R"S5 [[5 [[
5 [S5n[
U[5(dMYUS:”dMaSn O U(a/[XX4SU-5up‰U(d[S U<S
U <35 Un
O![S U-5 [X#US S
SSU5 Sn
[[5 U
$)u点击入å�£å�Žï¼šæŒ�续处ç�†æŽˆæ�ƒçª—/å�‚数窗(å�¯èƒ½å¼‚步慢加载)并确认, å�Œæ—¶æ£€æµ‹ç›´é“¾; 兑底走任务中心。r‚Fégø?r¡rTu阶段1 z [u] 抓å�–失败: uP [%s] 未产出直链(需必选å�‚æ•°/异步未完æˆ�, 待任务中心收割)ÚpendingrSÚskip) r+Úranger/r¢ÚAGREEÚCONFIRMr�rxržr8rPÚCLOSE) Ú
clicked_labelr™rHrIrJÚgotrRr¥r�rnÚresults rÚdo_click_cycler¿×sÀ€äÐÔØ
€Cä
�2ŽYˆÜ �
Š
�3ŒÜ
Œ5Œ Ü
Œ7Œ Ü Ð7Ó 8ˆÜ �aœ× Ó  ! a¥%؈CÙ ñö Ü  ¨2°JÀÑ4NÓO‰ˆÞÝ «}ºdÐCÔ D؉ä Ð ^ÐanÑ nÔoÜ ˆB�C˜ B¨°°=ÔA؈܄u„IØ €Mr!c
óö•USUSUSpTn[USU5n[SXU4-5 [SUSS.5 [S 5H=n[R
"S
5 US :XdM![
5(dM2[S 5 g
[
5(a [S 5 g
[[5 [[5 SnSn S[4S[4S[4S[44H^up«[S5HJn [U 5n
U