From 9a2c793380dba254a696a9b206d1b3da59e2142e Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 15 Oct 2025 16:48:43 +0700 Subject: [PATCH] login --- facebook_marketplace.db | Bin 40960 -> 49152 bytes gui/handle/login_fb.py | 93 +++++++++--------- profiles/a@gmail.com/Cookies | Bin 0 -> 20480 bytes profiles/a@gmail.com/Cookies-journal | 0 profiles/a@gmail.com/Network Persistent State | 1 + profiles/a@gmail.com/TransportSecurity | 1 + profiles/a@gmail.com/Visited Links | Bin 0 -> 131072 bytes profiles/a@gmail.com/user_prefs.json | 1 + profiles/b@gmail.com/Cookies | Bin 0 -> 20480 bytes profiles/b@gmail.com/Cookies-journal | 0 profiles/b@gmail.com/GPUCache/data_0 | Bin 0 -> 8192 bytes profiles/b@gmail.com/GPUCache/data_1 | Bin 0 -> 270336 bytes profiles/b@gmail.com/GPUCache/data_2 | Bin 0 -> 8192 bytes profiles/b@gmail.com/GPUCache/data_3 | Bin 0 -> 8192 bytes profiles/b@gmail.com/GPUCache/index | Bin 0 -> 262512 bytes .../b@gmail.com/Local Storage/leveldb/CURRENT | 1 + .../b@gmail.com/Local Storage/leveldb/LOCK | 0 .../b@gmail.com/Local Storage/leveldb/LOG | 1 + .../Local Storage/leveldb/MANIFEST-000001 | Bin 0 -> 41 bytes profiles/b@gmail.com/Network Persistent State | 1 + .../Platform Notifications/CURRENT | 1 + .../b@gmail.com/Platform Notifications/LOCK | 0 .../b@gmail.com/Platform Notifications/LOG | 1 + .../Platform Notifications/MANIFEST-000001 | Bin 0 -> 41 bytes profiles/b@gmail.com/Session Storage/CURRENT | 1 + profiles/b@gmail.com/Session Storage/LOCK | 0 profiles/b@gmail.com/Session Storage/LOG | 1 + .../Session Storage/MANIFEST-000001 | Bin 0 -> 41 bytes profiles/b@gmail.com/TransportSecurity | 1 + profiles/b@gmail.com/Visited Links | Bin 0 -> 131072 bytes profiles/b@gmail.com/user_prefs.json | 1 + services/profile_service.py | 22 +++-- .../Screenshot 2025-10-15 at 13.48.55.png | Bin 0 -> 3813 bytes .../Screenshot 2025-10-15 at 13.49.25.png | Bin 0 -> 5332 bytes 34 files changed, 73 insertions(+), 54 deletions(-) create mode 100644 profiles/a@gmail.com/Cookies create mode 100644 profiles/a@gmail.com/Cookies-journal create mode 100644 profiles/a@gmail.com/Network Persistent State create mode 100644 profiles/a@gmail.com/TransportSecurity create mode 100644 profiles/a@gmail.com/Visited Links create mode 100644 profiles/a@gmail.com/user_prefs.json create mode 100644 profiles/b@gmail.com/Cookies create mode 100644 profiles/b@gmail.com/Cookies-journal create mode 100644 profiles/b@gmail.com/GPUCache/data_0 create mode 100644 profiles/b@gmail.com/GPUCache/data_1 create mode 100644 profiles/b@gmail.com/GPUCache/data_2 create mode 100644 profiles/b@gmail.com/GPUCache/data_3 create mode 100644 profiles/b@gmail.com/GPUCache/index create mode 100644 profiles/b@gmail.com/Local Storage/leveldb/CURRENT create mode 100644 profiles/b@gmail.com/Local Storage/leveldb/LOCK create mode 100644 profiles/b@gmail.com/Local Storage/leveldb/LOG create mode 100644 profiles/b@gmail.com/Local Storage/leveldb/MANIFEST-000001 create mode 100644 profiles/b@gmail.com/Network Persistent State create mode 100644 profiles/b@gmail.com/Platform Notifications/CURRENT create mode 100644 profiles/b@gmail.com/Platform Notifications/LOCK create mode 100644 profiles/b@gmail.com/Platform Notifications/LOG create mode 100644 profiles/b@gmail.com/Platform Notifications/MANIFEST-000001 create mode 100644 profiles/b@gmail.com/Session Storage/CURRENT create mode 100644 profiles/b@gmail.com/Session Storage/LOCK create mode 100644 profiles/b@gmail.com/Session Storage/LOG create mode 100644 profiles/b@gmail.com/Session Storage/MANIFEST-000001 create mode 100644 profiles/b@gmail.com/TransportSecurity create mode 100644 profiles/b@gmail.com/Visited Links create mode 100644 profiles/b@gmail.com/user_prefs.json create mode 100644 templates/password/Screenshot 2025-10-15 at 13.48.55.png create mode 100644 templates/username/Screenshot 2025-10-15 at 13.49.25.png diff --git a/facebook_marketplace.db b/facebook_marketplace.db index b296e94261d82543bcd75ad806e11f2fca69645c..2863f8d8ab30b071eab7a45829398848e6edd5b4 100644 GIT binary patch literal 49152 zcmeI5eQXVyqZ&vPf@zaLY%3BH6B{7@*&owDXhMg_y z{cz!qa?=lo-nm74h6oBT45NP&l$Rn#eu`cmDG$Ce5}|%G_`H{*zI}^l!b3m+2mk>f z00e-*-6wE$$mD|*@-n@aTROXz z?LO-gTW@pfdEIjPa#Iu2$FnCgYs&?CM&=%pX9DIm&Ck=h>=*8%>*Dqc*Lk|izj&RN zTiZ9jM$amz2I!I~);U%P&_cUW;#&T$%PY4yR^}>2yfo4k(_d*;l3VLC-{59vjz}|s z8A05b@%y{4uidQN-qVd2_lGF=*y5yv;DrkJkaV$*7imSdEsN^?qRzj_=sn-nhTAhX zKJIuduG+88OZdXI-<~epX|i2gjxCqPwjdWRHrH*~4WZc*EA4V0Cu$dFVck8BB(ri` z(!51C!c3DBD%edGi(^Y0cj+27_s`1oj5g+s!Bue#&BJC*1p>5rjW!FOSjlIXPUaLh zwmiX4=d&lW`D|`6yGnP)k!JadpI*sfS6t5GKv~SJE@qC~9N9XY-3D&A z>N~`E$L#j-3u_h+(?{t_i(SWo%;0XbUBVjIxQf9^F*x5~tDNRJ-LKdi-nPea^j5`I zCq?N_r=%&{c_Q{gnHPm_@9aIX)MACo4oX%ysodh5#t_}Z%WT!=_v*-sYWTo@Uw`SD zHeGq?ne7|j<>?AebV8N>+$#1(oTG4bbit4=w6&|;Dbd!&GHYCfkyMpeGsf_T25yy^ zbmu8Dde41^bdSx=InHVGik8YG?qZu0%3LS2>33aSj%a&uR`I6*KGna49I88Cy{L|< zN1)z1yGGHayLM-;!Sb4i-g>rbvXZnRwlq5%r*@l^mx^pz<}YzQ^9s{_VqL8Af+Z*3 z%qY%V8AV4>Wb_`17ZhG)Q8A2fPV@?a-bAmUClv`CKmZ5;0U!VbfB+Bx0zd!=00AHX z1c1OjPhiyPCZ-R1iBh_%)GLBzvB5;5V-74GrwF!7iXZS{g`8-cK<}Y#^ox65JGej~ z00e*l5C8%|00;m9AOHk_01yBIKwu{Vh@5sa+f00e*l5C8%|00;m9AOHk_01)`d2>4v&xI_B`AKws3PCE3zxELLFkdsdR zFT;qZhMf38>nHyQ&1)XOT?hI=5e#XK`55$o01yBIKmZ5;0U!VbfB+Bx0zd!=0D+GK zfx#i=^Z%o0KY`vyZ=u)mcL4kfJ&%5juA^_Euc9xbi-<$#&}o!GapXsn_(V8>01yBI zKmZ5;0U!VbfB+Bx0zd!=d>jZ2k`s>A``5zZNO;ufGpU1Sf8l`HPwqGSiG5~2j?8{+ z#Oz0h&3@$OAKkPI5;S^=|7rbUa=`s5Wx7m*mnEjZ`>_;EBc-~a+Z00;m9AOHk_01yBIKmZ5;0U!Vb?kIsE=^>7yahGd(X|=GF zJ6T-H6|(uyXO@er*~OLI@zuD{Zj`uI?d`w3tK0%k50O&NKb?7?h)-Bt%jdJXLb3Do zNcY*Fad?O$hbCOE%vxbZKSyr0xsoW>Iabg|Ro?$6(Q^cP7d?kwy`u`kU_bx}00AHX z1b_e#00KY&2mk>f00e-*E(v^+JnFbv;eh-EnR4u0C2%702xTn^DDVFd5#J<6{KJmH z-}&yRirzW*69X0UE6$>06F=~wADi`|eMHDZjBOru9hx5J<|d|B*+#R@(Pvs>rCpY3 zCX%inINE&jHD9I0uFL1AYO>sv?hA$5&AP}|f*bq=zQI*^HYm2LA?03Exfd#njfN;l zp;D+64IQhq1l=`g; zOyrbEFV=YaG%wUP&kq{vjvXB5rYFYi>N4reuYU(0Puz8NS8F0C<+u%1&rJV%G95iF zIx?qNLFBhS?bEc|T60Ze?Z$ew3#V&Oo&D>zPd#VTu3Qo3`376%q~Im_Qt*-xx+02= zP&^(hMq`OkA`y+HN{MhXQ7*+Q9G6;1#uDXqCKL%r;-N79VL~lY;^s@bq37iqE~p7C zU!P|p;bbH>&&(&|3(-_8nu;b;@pvK}$Ip#3@x**0!6f66R3y2ON+#mbR5%e$FmWc> z6grNvSQq6QFI06{i~Yk22d8SH+;N4lis|ZkY9BF=eg4{{YjS$LJU=mEbAnV_dU*Ez zUw-|;y+SEK8)3OOENKt(V|`mRrFwr0OwB$I zB-1PZ@+tGcUZG}*i4SM0>feWx!Kuz9rTKBkg_D+t>JG{&kE8rEF9O<+#@a{VDU-@`-goJi>0r;`Jgh3-A!FB{&8e z{?lg6TvK)&Ev6eFLUsZaFSZUT&SuY;(e&y*bwO`4z`YGhcic6pvjXowtwoKfWCEtg zMy*-xh|_>JjlH&ag&Ij;{sCTi&Hi&wLCciOoFs`Y-dxc4ALw}Bf@gz{dquP*YQdp# z!b?Kk{6`0yuyG5C8%|00`WYz*clS;FXD>Xm=URhD8`^;>eE6XiW;LFng zv0`VmYFcNN!lW!q_07@&qg0OfH{5(r0fJdbFF*D)EW`T-NS7-MU0#E4fdjoYU`CYF9=bMH-m7HCF} z>worRv@(_cj%Um$>JOW)i^H_HM#x0dC->H*_hGrNy>5FO#=vDT)rE~!2ovoXUYYodZZqx!~#HT;_e6^`;xz9?_KS= len(ordered): + return + folder_name, filename, top_left, bottom_right, score = ordered[i] label = folder_name.lower() + self.log(f"[ACTION] {folder_name}: {filename} ({score:.2f})") + if ("user" in label or "email" in label) and email: self.log(f"[DO] Filling email: {email}") self.action.write_in_region(top_left, bottom_right, email) @@ -155,10 +155,9 @@ class LoginFB(QMainWindow): self.log(f"[DO] Filling password: {'*' * len(password)}") self.action.write_in_region(top_left, bottom_right, password) - elif "button" in label or "login" in label: - self.log("[DO] Clicking login button...") - self.login_clicked = True - self.action.click_center_of_region(top_left, bottom_right) + QTimer.singleShot(int(self.delay * 1000), lambda: do_action(i + 1)) + + do_action() # ---------------------------------------------------- def refresh_page(self): @@ -169,6 +168,6 @@ class LoginFB(QMainWindow): if __name__ == "__main__": app = QApplication(sys.argv) fake_account = {"email": "test@example.com", "password": "123456"} - win = LoginFB(account=fake_account) + win = LoginFB(account=fake_account, delay=0.5) win.show() sys.exit(app.exec_()) diff --git a/profiles/a@gmail.com/Cookies b/profiles/a@gmail.com/Cookies new file mode 100644 index 0000000000000000000000000000000000000000..6badfb89baa1c47bd21f4e511a65670df216ffc6 GIT binary patch literal 20480 zcmeI&J#W)M7zc1WPFvoBn<2^&hLbuZkz63KAZ5WRrbL*8h6K^cy1Ex)HL;EFTs0#S z1D}hn6JLRag#n3;k#p*VkYHA->Tk)h@A27p{@r=-)+R z6h+C&bwjT6B`N3U1-Vt1_Oo_#%H83&g8oy<7l@+2)jt=A{wS+5;t+rU1Rwwb2tWV= z5P$##{-?l)lD1W@RMd~Ephsio2EmEPc)H2&^(?b*k-pioEs_RnZp5hY0^f;+OWK{j zwQu!Er`so;fo&V3fD7k@O-bK+BSZ7BPbX|8bV|qZYAmE;v{H?ogaxRIy4r+tn8#y!D*yB8$)%gTq>#W z@6Be>gb8^mL34l1pCnRCW`^DE?7ud9d(X_@^M<6|dD&~fFnfpOxpioe3x=iY^=fXj z+$?2vD`~-LB)^(`rmiK=RY9(r{z=il>tEys3j`nl0SG_<0uX=z1Rwwb2tWV=mr~%4 zrZtPRe2p7SWOBljX)5P5NxB4nPy6o%0oZ7iuA!IsX}1?Wg9SOG$4>|MaH5N<$ap^MOJcw>;4bDRIR-)X9$ zJ4VFs7I8?s-p|+Rxvc4R1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBnwTA&#F%d7m%Sx1T^K!5;&>;$^+yZ%4gQ+8p32oNAZfB*pk1PBlyK!5-N0t5&U mAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&-3V-~y$>Y- literal 0 HcmV?d00001 diff --git a/profiles/a@gmail.com/user_prefs.json b/profiles/a@gmail.com/user_prefs.json new file mode 100644 index 0000000..95e78e8 --- /dev/null +++ b/profiles/a@gmail.com/user_prefs.json @@ -0,0 +1 @@ +{"qtwebengine":{"media_device_salt_id":"8B4A2B48A507D8F41F8B993414E497B4"},"spellcheck":{"use_spelling_service":false}} \ No newline at end of file diff --git a/profiles/b@gmail.com/Cookies b/profiles/b@gmail.com/Cookies new file mode 100644 index 0000000000000000000000000000000000000000..1130cfe6074bdbdeb27f8f92caea6122e7d3438c GIT binary patch literal 20480 zcmeI(OK%%R902frIBpD0CO#M+%wa@PoFG3-RDvR;tkX?nx^?15(&n^UugCEc?;|^7 zClLo!2?@SHuTTjI4txVRAQ3J-Aue#`f`lrBgt(ye(phI6;yC6=d-$)l-kI6)e`bC= zd)QgIUezo{aNG55gW+V~GhKI;n zO;s8yZYU*9#bM!s=@WxluA}#uiOZFSdPl9{%4P#swlyu&aVgXH$uVxI4|vhA*fDH! zsi<#sdzZ^RgLN)dBS)U)6MA)P7S$;+dp;TO2tUif9QI!oJ>PPDi;Z{XLNMZ({;|hMOFyG2X`7|<)9G}E zazh$C&0a=7uaqrjsN3^RqEoX&xcJ1Hh0J!PT-{dj!tjD+aBz(>IJg9hi`hstsiZ`~ za$4kw9&~xLy3u3qAg_m0K`(}hskV46nMjBa^MhGr6UIX^LmHVsLCHceGqlahogJmN zwxRqxZ*bV1ty=k>QrpFM)!hs}W4KU#F)c-tD~UQz8BD+ z=vRJ#4Fo^{1V8`;KmY_l00ck)1V8`;K;WemcwLrP;)C@X)3y2HgvFPs^nS4D;yT5f z*Cja>KhMpH@{PD{8=g*?!Fn`Xe1(rmMo$Fv1pS46dnpG9odN+6009sH0T2KI5C8!X z009sH0T37pq~sNG!YY9Ls+1Zq#yB-sT{O3Qs@ztXbb8W*UP5vj09Dmt; z*jidH9PvFbL=mzoVbf zH#`9w2!H?xfB*=900@8p2!H?xfB*=9z>5%gZ7Ll{;>a`pVJjcGqL?=G@)gBxKQASx O(g_qB2@)(6Kg$91PBlyK!5-N0t5&UAV7cs W0RjXF5FkK+009C72oNCfo4^Gh&;oe? literal 0 HcmV?d00001 diff --git a/profiles/b@gmail.com/GPUCache/data_1 b/profiles/b@gmail.com/GPUCache/data_1 new file mode 100644 index 0000000000000000000000000000000000000000..a5e11f352ae909a5e3cfcd101b6ce6a803c73e4a GIT binary patch literal 270336 zcmeI%!41MN3;;kEGD1f{DnCZ*Xq^SMFQ#Av*Z@M*0fH2%d0ZZLELoOw->i>xk2u8; z`Q%V?`W5><=TE8X!nv+Z7XbnU2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FpS{ z;5m)&Yx(qVIJARN|32w8&6jPtb+EY=2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ afB*pk1PBlyK!5-N0t5&UAV7e?@d96X?g+mC literal 0 HcmV?d00001 diff --git a/profiles/b@gmail.com/GPUCache/data_2 b/profiles/b@gmail.com/GPUCache/data_2 new file mode 100644 index 0000000000000000000000000000000000000000..c7e2eb9adcfb2d3313ec85f5c28cedda950a3f9b GIT binary patch literal 8192 zcmeIu!3h8`2n0b1_TQ7_m#U&=2(t%Qz}%M=ae7_Oi2wlt1PBlyK!5-N0t5&UAV7cs V0RjXF5FkK+009C72oTsN@Bv`}0$Tt8 literal 0 HcmV?d00001 diff --git a/profiles/b@gmail.com/GPUCache/data_3 b/profiles/b@gmail.com/GPUCache/data_3 new file mode 100644 index 0000000000000000000000000000000000000000..5eec97358cf550862fd343fc9a73c159d4c0ab10 GIT binary patch literal 8192 zcmeIuK@9*P5CpLeAOQbv2)|PW$RO!FMnHFsm9+HS=9>r*AV7cs0RjXF5FkK+009C7 W2oNAZfB*pk1PBlyK!5;&-vkZ-dID$w literal 0 HcmV?d00001 diff --git a/profiles/b@gmail.com/GPUCache/index b/profiles/b@gmail.com/GPUCache/index new file mode 100644 index 0000000000000000000000000000000000000000..c84572310a5af5fbc4b4ae656d216062d063e554 GIT binary patch literal 262512 zcmeIuF%5t~00Y22IKco$u*XbzCj=%`eSqZ!FkYuN>2&8k9?6hC str: class ProfileService: """ Service để quản lý thư mục profiles. - Mặc định root folder là ./profiles (tương đối với working dir). + Mặc định root folder lấy từ config.PROFILES_DIR. """ + + base_dir = PROFILES_DIR def __init__(self, profiles_root: Optional[str] = None): - self.profiles_root = os.path.abspath(profiles_root or "profiles") + # 👇 Dùng PROFILES_DIR nếu không truyền thủ công + self.profiles_root = os.path.abspath(profiles_root or PROFILES_DIR) os.makedirs(self.profiles_root, exist_ok=True) logger.info("Profiles root: %s", self.profiles_root) def get_profile_dirname(self, name: str) -> str: """Tên folder đã sanitize (chỉ tên folder, không có path)""" return _sanitize_name(name) + + def save_profile(self, key: str): + # ở đây có thể không cần làm gì nhiều vì Qt tự lưu cookie + # nhưng bạn có thể log hoặc thêm custom logic + print(f"[ProfileService] Saved profile for {key}") - def get_profile_path(self, name: str) -> str: - """Trả về path tuyệt đối tới folder profile""" - return os.path.join(self.profiles_root, self.get_profile_dirname(name)) + def get_profile_path(self, key: str) -> str: + path = os.path.join(self.base_dir, key) + os.makedirs(path, exist_ok=True) + return path def exists(self, name: str) -> bool: """Check folder có tồn tại không""" @@ -73,7 +83,6 @@ class ProfileService: if copy_from: copy_from = os.path.abspath(copy_from) if os.path.isdir(copy_from): - # copy nội dung bên trong copy_from vào path for item in os.listdir(copy_from): s = os.path.join(copy_from, item) d = os.path.join(path, item) @@ -136,7 +145,6 @@ class ProfileService: try: profile.setPersistentCookiesPolicy(QWebEngineProfile.ForcePersistentCookies) except Exception: - # Một vài phiên bản PyQt có thể khác tên hằng, bọc try/except để an toàn pass logger.info("Created QWebEngineProfile for %s -> %s", name, profile_path) return profile diff --git a/templates/password/Screenshot 2025-10-15 at 13.48.55.png b/templates/password/Screenshot 2025-10-15 at 13.48.55.png new file mode 100644 index 0000000000000000000000000000000000000000..f183ec8ec1a0a85fb5aacb08db808415d55b20db GIT binary patch literal 3813 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 literal 0 HcmV?d00001 diff --git a/templates/username/Screenshot 2025-10-15 at 13.49.25.png b/templates/username/Screenshot 2025-10-15 at 13.49.25.png new file mode 100644 index 0000000000000000000000000000000000000000..5e77a997a5c372f17901c4c8f7afa64eeae8a679 GIT binary patch literal 5332 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 literal 0 HcmV?d00001