From 310c4bac8aabd31718310cab4aee136ae710b79d Mon Sep 17 00:00:00 2001 From: LibraHp_0928 <1941163264@qq.com> Date: Thu, 19 Sep 2024 17:36:17 +0800 Subject: [PATCH] first --- .flutter_custom_devices.json | 46 ++++++ .flutter_tool_state | 4 + .gitignore | 160 +++++++++++++++++++++ README.md | 9 ++ assets/icon.png | Bin 0 -> 32278 bytes main.py | 272 +++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 7 files changed, 492 insertions(+) create mode 100644 .flutter_custom_devices.json create mode 100644 .flutter_tool_state create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/icon.png create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.flutter_custom_devices.json b/.flutter_custom_devices.json new file mode 100644 index 0000000..e17ec38 --- /dev/null +++ b/.flutter_custom_devices.json @@ -0,0 +1,46 @@ +{ + "$schema": "file:///D:/Environment/flutter/2.2.3/packages/flutter_tools/static/custom-devices.schema.json", + "custom-devices": [ + { + "id": "test1", + "label": "Test Device", + "sdkNameAndVersion": "Test Device 4 Model B+", + "disabled": true, + "ping": [ + "ping", + "-w", + "500", + "-n", + "1", + "raspberrypi" + ], + "pingSuccessRegex": "ms TTL=", + "postBuild": null, + "install": [ + "scp", + "-r", + "${localPath}", + "pi@raspberrypi:/tmp/${appName}" + ], + "uninstall": [ + "ssh", + "pi@raspberrypi", + "rm -rf \"/tmp/${appName}\"" + ], + "runDebug": [ + "ssh", + "pi@raspberrypi", + "flutter-pi \"/tmp/${appName}\"" + ], + "forwardPort": [ + "ssh", + "-o", + "ExitOnForwardFailure=yes", + "-L", + "127.0.0.1:${hostPort}:127.0.0.1:${devicePort}", + "pi@raspberrypi" + ], + "forwardPortSuccessRegex": "Linux" + } + ] +} diff --git a/.flutter_tool_state b/.flutter_tool_state new file mode 100644 index 0000000..f8e1ab1 --- /dev/null +++ b/.flutter_tool_state @@ -0,0 +1,4 @@ +{ + "is-bot": true, + "license-hash": "3e8c85e63b26ce223cda96a9a8fbb410" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..4f18a49 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# A getqzonehistory Flet app + +An example of a minimal Flet app. + +To run the app: + +``` +flet run [app_directory] +``` \ No newline at end of file diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bebc6d55c8fe9366606b46025abfa5584d95f77c GIT binary patch literal 32278 zcmeFY`6JZp`#=6fQc-d!lBKASEF}q93K4}Yk$nkS$1?V1bUKw3lC82%OkX^|+S%em>OK)!e&>cMpOfd#`Az z8z9II_|F~4uAT6M;}^dRKf67(Zu%g|EnD;tg9BS~3H;+BtcEGp5aWpTxAk^F{QdnU zojqKA>}@?ABr)Dj$@3R@5#$JRMg5{tK+5buV9G7u&;@$ynvtdk(g$LcAHIkL2t5&#=dE-Doj{n$c4qJ`K7!Cd6DrHCJ>Xy!-B?h^!6zcQ~&!`lGs+2mQ&|`G2qdpGy7@CI7!W zPBRIVzWjhci---GomZ4Ay8MDQ$0=EHR0q>3*y%%o^7v`=wU2Y`q z=ZJX}QRh$lc1bzy@yGdbD>eg1rk9X561o2^oI5bb9e?#Ca*9bN$`K zWZ_CNJ1Utt% zxvt`xPh6iQtgaxYe*qPRA1&Pc;UoAnZK3=;KEPJ}{dDb`mV8?21oct=Y;E_>47u{1 z`w<(hCifS;FAkHp8Ys*0ucpV>8pW(QId&r93?o3-RYw#lTkWOBn`v=A<;R51NsgDy zXVz7BSqHZhrN-BG{Hl_Ny-SDtrF+l!>b{oY7ay&S9c}n)uW^x_=06OGjVj7@I~)3I zR!6-XJK7(UBTOyNo~Vy}H6$3WaT=bnh4-B(R{9t@Z6Z`#DD>(&K}1MM!`Fwr6Io41 z)oP88cNEFOo$=n%PRN$gp49S|!KF;GNBCMk#9wfDt za^uQY36F5)*d54b>u%75^64@M7hjjG^j6^+tAiYxN%N&r@+3U|Fk;Gw+Qha@F3l&T ztbMDNi#(fR7f4RqmLBStqYuI=r=n3Qo|Ine6Y*}$kGMQ~Q_S1?!cUCK_I7q_Md%w? z!_=I$L1B{zw# zn7qXVyf8e+zzS1%>_yo^@`MvU-im*FQ=P8SV3J!g|I{fy53!-7zyeeEI9ml%%}W<> z*b^fOVx)(7AHoSm8oTsc6g8IE8MPLx9zINkbbb?&H#VBLKaRF`TTg($f&e12)WMiG zW`B?Vu%DHVDSf70L06(pWx`um%dF)`m}Zn|b$vSih^GxY7mMxMyGi8_g>8X1&yGwQ zMi-EjloCcrq}>SLd2}xfKSQTW*=L*ltpvoZcvjYvr{_2BmGRSAcx-&v9hi|eS(&&F zcAZ#jj@Ymh22r%cMz59O^uTUQybN;Qb7ce1jCk&Ml=D!L=S{V~7MsQy%Zm?AG}HY? z!G$w8fdHS`3zJ)wj(cyKyoyab9Ggv2y4SBXR5^pu)at1tKDPBn)Gs z{DK0tI}LS8mY*x7mQASWD=_~1*u{NqY&lMWBR^6rhCO|4D2}K!#)=EkB=17@rGc^D z;(H#>#e5SZp3}HcfYq_qp>*Rpk*R&Kvc9+sh%Vu)K)22e$Y$SK=nj#!t{{R525ezr z7hAuj(yYve{HyZm%OF5|+F z+QGB?q^7auYJ)KobzvpB$+y~TY#H}re{NO+MzJv<6wk>&D9&;z7s8)c6q1Dj*<55{ z@x0)A3A`dQB>>V%b4{Em7EBVRo1NvAV#AH{74h|e(vOZN2_w>N6DO>(ZZ%)?C%IZ5 zMcg2#9c{mP``n;8Xl4Ek2*5;+)~vX_{dMc>ccGEv9H(y(oIYpbl$YbULtkT=kpTx7 zv$HXmT|U_1)B6>1u@O8+!7FU5w03)-9=J2172V+dxK`fh{FZA=%?`QU6A{%qlWdBxv#LJfzYj4L&5v3W8~`-yvX=D5- zUZagFZ?z}^#Y{;MA2WpK^?Fft>XQ~qH@70zKXDZhuqVBgQV zCw;g(YaU+-uyh+866BsA%LwAviiYCh;9iM!djF^*#A0aKEKmoMNV@p5C& zOaKzT9dGa=`5Cp8k3x+&{|dX0MI7fh=bPkq%95dqnJ-zaPgEB>u zz+Tx`PiJtcf$96R%tcz2vpJfF@(flAIbyZf+LTi7GawndpqnZs#f|r|rCo%%sM{5i z2JcU$s`-ycU~-A8Z}k%9!FUj&!UfNi1yY?)f1GC*9s%eqUp}xg-H<;Y|KIZkg8Nb+ zd#?B9n(#=yc1fH4Je}n&Ke*I>{|nO^Gu#uCxWdR~R*rVj0kzh-=jj-l8UQvi5$rlW zTb93~!+kkZO=t4MEoJP~q$Hsb2tnsNNG>Z|;=HMz_KYAZB)}gF1B&=y;-fI}kEVIU z7Rx@5iSEpk>D@Ry)yv5d@HX`)Gl0ZQ<;wzd?;H-beIUZB}>agu9})6Y^mh z_N>oTR&w>4A8qL~-T57sO=CPIgvzdO2ru&3`EW{^c3iRN&eV$D`w<}3Eq3pcMpwIMSijo>&{`=1S5*e;46eHHOjpK!0T)1&wW&IG3P zMyIUuNWHN6*0G2tEtF;nPuD03=>Z+?uuD-i(YY%MnADx8-n;B!`OFY3SB+=^$NxwL zweD={A6u>~7n6L*7ZYhjxPLKL!9AbO^tLqKM{)o`W*=CZze$Xmm^LwNp^FQF!}5rh zby?xQwGXqagq!&QpmtWx)-3Bi#$&ImE9YTZ?}}&y5g*|YkgKiULw==P_ysE~CL%rz zo-v(rSfex908lFb2UEwI1&z!VybsUqCHZkWN|K9cprVyPGxoire&G$4RqaUa zgKn!}3a5?}qMybIGfNd)wWSPH%p@5aTkhw04HN7un%V5`RW_SSwV9v<~D0JO0HHMN(qR*VV?EKtQC~!mf^=EpwPI z`0f)FteyhC{j&Sew@qau*wnvIKe&GX@v%TR$XGq-rn(WRGE9v0>HkF*L4eg%!Sm)m zoZG4T;~ZXY1 zjBv}*u8(Xlw(YF0{1VG5n^aA~Az=~lWFINY+*-OgXl=^XAUo{15TqCxE&<39MCH_Y z3P@H}^YGTYrdA>{LQ|b4P@a=Q zSfoNxBkj}x6)&Jl%@q2 zhq!hL0K_7Apte39R-{8IQq`6`aORVOFR9O`rckFuwPak2t`8vp0>3ndn6N49;?$C5tlD5r;+!IJ8~ z)~d)}*YMjC4BwsrXfa_Xik3|96`O+x#ad1dFzTHAq-+3r#+TSXJNy;?M^4@OE#vhc z>C_D>q$$e9V92}GKm%;=dzw4?6iP=MR6fNU25bu=k46pxm$fuGPv&P&Ob!XiL-1w9 z8>Nl`a~!M%%c}M$$yXfLut*e+79U_dj&J!J#Mba)1xf5Zys3ey5x70vbkC0I*7CU= zpkAI+uhElS`5|%+g;(jleU^!U zPaA2#r|3l2x55~gng$0BuORY49=46wvDO1(kZ_=D>en<)_~^N+&nR(hG>{~urTgjZ zRTqB)ZWH^_1r6pyM1?H2s)fel;otbAVLej?r_|186}AHy!jRy;hLY~N;TR)!}}NnvtJnjK#@wa zg@M%iJ~8D(!y|(Gw6oBVurCq}k@h_KS=g0EFJJZdVgrm!d8scb51|}jI|t}%3l&LI zQ7H7LJ&hmPz#H0Vg*eX1Ce2Fn!{#8g>ektGek>2i%D;H6$>*jP(AeYd(0tpSW;=tfEn_1bKl^#<{1k z^C!1cddo(>uw6Np)pNlBjnNghkf{2J z;UTB6=9H&jUoT}3l{(Ij?0}{fGh*}1y&^+i=JfVz{L+$67P6Vu@itFv0IBlS{?oZz z{`$=+swwJyuzz%bADPRB7-~P~%Pn{lg~r$p$VjOZb(0c;hb-698Yp8ViKn?(^@IoKr!82O&`^SWE2DdF%qy4+_pnrVoH{-{-9`@m;yx$#hL;D!QI_%Kw= zJf1$u#d=0jEh-u{_d%39I>w7+SP^|>Q{vtm=90Ilk{MC0T>=i~zqkSskjDdh5Yicb zm_b@icB9GVnn-x>%Xec!9+v4;-9y20+vT>6uId+oV;@3UgZ&1I-*4ASDUJVAfiDXW zPWlsKOfyR#lAXr5aECbTVUzQ>Yb&d7Sgb{xYx`G)%5Q(9pAQNN+4!EAwY=<*>!K#S zy~Yxm%D3cy3R{WYtZb>JFE`oK-rf@NYy}-KIr=Rvw_c9+zi((EebvJZ;xW4@Kf~HY z!NNvwSAuY}Nv?qVh2jE1B5wX?cctwcCF+kDf^Zb)<=&-?u!S7wr2(i6(lYWZ-^EDx@QUGszY$gH7fz`m%G>t#fH|f_xsn_2+NbNf z`CKzs#OpiK)oVJ+C@bN2N5KI?J^bvZ9b!p`wf&Kb4sxb_7mg~SsN=7%A||9n&bDl| z?3&%0Zgd>ws5o!m^{t&Y&CkldyTNZRktpzwFX|@gc zUG?;vXR@q|NB=o6O2*|Y-P-7QVQlu%C1!flIG6a&jkdH7v#J!&&hruxHj~N;;7*GjwtfG8mt_OdbzLINCIdFAL~Z=0TL!*zzXtvmu{7 z$%G8}c1_xkbjwO?ex9^ZyaMa6vcp6syIhVkYD_~0=8veFRfGrd)0LR6iBIv$c$ zv|?MOQW;Mb@TKovxHWMk)oUY~vtBbt?){-FDh1v}rws^`X+=J#LPoNpD|4|dXjz$& z3AuYsvD}*msgtRUT$JY|2DUsAs|ugd+mS;TTpVWVv*S0Z3)G6a5FPT)D##LAa8_Hy z<3iUGbQ$)%BM}pHZGO8|*i9Om6p>tGcwF7IP+zR!H!-g>c1KhV4;Jx~-pY(R-8Ca7^XY0K;-} zBcgAwN83z})(+0@7A&q*D16TQ8Xp|wfD!S-&64Y_tO-o(dLW#@i{z9rtH=OzC}7RQ zD?bJ|uW*MdjagAzw9eeBpg_9|O}(?})5hTtOy4%WP0wYin#D$}*?o{^C^jPX zwe{vN0f&0J>qt8;aMUa3#^bHQ-u7wdsLQVpUC$qIY7H6vNZMP4TY4a-n$+wuNc+*S zAywUK`fD(A?9*+v`Syhh%4g%|*dax~?VlaIvfH5_@;UuOW^Zbi(gmqn5;z`)<;JF( z<(M~IIDQT_oVAGOFYm0SQqtb#y4OR&qh8|KT{AJ3=crAWwLj4;Jtr^q(bLt^p}59= zb5AZ#H#4TBMey`y$ukXHuicu|k!!Pz32Zfq;m17QnlJc%Iek#;oiQOxaQ0>c9jc}E zFi@rBv!0^4VPoS^X`ves@u`E+vfV^z1nwB1j1h_Cx9ffc&+5ejC)w;E+z9>d>Zhe~ z{NeBg$l1iT7tZ2ii7^o@u;@;;GYFf~cpdQHzjpzOoGg528q4g4Fu8|y zq%7n~JW>N4`SWJC%bJ;~PZ*G2NOOuGEt^Xi$0@H1RTo>d?lGn+L}6y>^cnx^mhSh5 za;?f=W%tkfsz9QTR{5TYUkZ&x8Q)y3kPm?6iTlO!Aw-M1w6XBrit>idJ9f_$5XEs&ub# znOwqUCxrQg-1Nng6E9-B%O@>ViBPMY`r2Rf@Y%YBPR_6)b%pBu+qPN#-gwM1 zU_@a0><_wJ@P%{bz*__3Vk7Y+u`16iVr+=cugBuVa@%s=(3$Jvb!mLxmdq1LCESbL z(B4^VMv&ju2HJ(3eS>L2X+{dnJj!As+?q;Qs)J%(Qq&Ei&)Cn8KD@@fVgrVn!F_Wv z=)RI+Uy6_y4DOeQ1}2Mi%7l3WLk5dM}|X@noWMuU3xE+K-+=zfrVTwDf=y`?hcCG2xR_s@d^j|ipgBaIJG(_NiJv1$xpDi&uSeS55H)KpqoUn|Ni6X zoG#TS^89-&tMrz^_+Er%diO#fCEn>=PRXgm7(R2tz2I2k)$!F$XwD|7B+-Lm`Xyv~kBV15@{2r{a4lbXOPSy_@XNxf^u;YT5tWxdA4buOzNkaUFjMwg zvsSNp4YkRqb}Rq-h9n(Lw#Zz;Qm^-3n+^9KoG7EyX%{Gq{4r*y2Lm=^zh}qklza#X_Sw2d-f2VU0aXBKSAJ@dpOW}h z_ZrXBiE=UYUvm2_yXMPB8xoq+Be;yo0tfTs?8DZ!_yxrV7-j{T5b0&~(2)CGke<2# z^ecamlC)Wtld%_#oZQOEvYL-&aiy|m65<2ZcgkEV3rBsNl-;bs{^)uy{r;Rvn+^t9 zkDV{Vvg+#@XCBs;TaMGDk4NbR^a`6}tb1IP-eOr*Y%RZdblY~W{M+$c@WUU^b4!2|9I2v%0Ly@0OE0@_#sMYu2Y zy2kWgS9nzUzu%u~^ znfPm)#4kP*uUwt-eVwZ!?-;oB1#do8=~wf$(mZ<86x|hw_fkf#bnY=%XEK;v{n`Q@ zS7%(3*B`f9x$$%Sbt~l|{daF++o10szhIbEQF(Ibr8jzh*LdBM13LHSh(XJz!$?|4 zXLQoz$C9%bZoQ`zO41(m4f;`IfS^atLstZjfob=An`0-8rp1LP75h0@E*+Q}3hKgUAt90b4_1a}AV@x^%w6R~xUz zG*1pxlgi3ci7U^u_`FO&ab6dmG4tF;PdKBsaQf)G;}Q9FvPo>6oFv0YY+bN_F|^Gi8#xx?(V@=&vfW8K>;oO;orj;j--1cG^S9|y*=WHU~p%igkFULF}PE!y6{Fs zsJtbFD)g#_^t0ltpI*#iZ)Tn+VE0rh9ga3Z(pENjO1H)3hz`}JD_bY=m&pRu>Onu+ zZBPOQl%V>enfywN@)J&C*G`Oo!7=|D%_C6i*$*8Gt*5q6L$hZ&CPiq$`Gz2<=@eAo zJm(9OOY}6NeW2p&PqM(@;YW(Y#u5+M`_BhY-lr5e;XTt;hA<14;JVE_%|VE=e?-#< zya}cX(LP{VsTLP<^ zkr(#Y)6)9;XI8tqs(J z7CRNKa8tb#lO|C{lC&Porg!CbTx&oZB-i0gaGKKAePNlMM@x*lx}$0|e^7Q~`J|-f z>D~~1^1+?0C4Hy$TZ@rO==@Ka3s70uJ{;Cz*~$QdF_)X)N`0LqYh{7I4Y-w_GoK16 zz%qIMVuRDN-ZPype%arv)#%|2@rJm)NK8dYcVd>(8EeAF&hwRUp66cKv2hiGKo$6G z<=O5lME+PksR0JhBMPj>*8PmXt<$L()1CmYgr|Dj^0$}xF-Z7DM<_j8W+&$Kq9Uxp z*q-5wY2)_RQv8(l9RF*|bFp4MjWeNQlG22xw*IKnYt)&Dp0bf-tOG-K@JE30$F%Z*~*T2TXQBVpv zx=8SPM;vD6R$rk=C`w&;)fwWI@R7JM^{^s!`5v&z7YZxm6l-BzhYBZ02UvKYl@&?v z3T~_sbHQyxxNpI-+a-l(xJx(4=_O}3u<1TsV+G__7c^b@IJhAtoqBpa82QCHShm#N z6;tmkZWhIvG#zYUy)@UN2|xAPOjU*a+d>iv&l|n+Zuwn@o4Lx(n0k}T~X&OwhU`3bwj{{ zp1+~$P3)HtNiTUN|5P$6!U4#d@IEK~DXoUZ>Bji#K$1HTMp@oKj(Fx&%cV%1_yEFp z0sP^3H=nyT9|t=`%r^ITkI;RD%ssSsUV!-t>sjR+ev>ayTfnKasX-xU$K>V6NeEO^ z_jIHASvF-!%-5BiM<(P1DnhWq+RE==mIK?Qrqk5{9KQg($7SH=NHrW7n-Z8ZoU)f! z?ryZUezxmYOQ$si3`O2p$?!P-piDe$b8Q+DRGart5^i%&XFv6?EL{I>a zN^wgJLyW(LO$L@p!bw>(H;SGgbBjQsH;c z{8Zuc_gz`yerq_|#zKdD>RsPCcNIvO^@J}}^YVmk!N(UeS+iZv&~J{N&jc#}>u2bn8<(4#Nny*`$s*@29Lcljy6t8f zDSF5@IZB5Fp!n^)^ca$-m@cw$~y3-M?Lc4O% z@I|^6^xDvEr+s#}>l4l~s(1tbWN;!}33)Zh@~Ugw1h^0&h`9#;h4Ec907VsgTiEk%*` zs;)uk%yW${mWt*R0n?kB4dED%SnluS6!EiKt{NAf%xs7G;;!z%{x5bkP?Gu-B4&?wV|N=>K)_Ux^En%w+`~f1Gw&^3k2*s(k5G`r?hrQ zelZyWQ+(UQ5FhoLxIzD=R=&g}98E=vX8WO8b94x`pgo-C*u&{q%caQyj)H9L9@X9c zF;eudmbuxK zZpE-m4GMU^c#KEL;9_judb;{Cz0W&cj%!A;3;MWOgnhkIP}0*Y_rmTymJ{1i=~s!z zGPPOmM1EyFHu@eWC8R4l!0;h{p6}2@mB1-6O6kgj%jz{-KO52tw1n>!X5<_c@`I)u z0XqA9AD|;BculMYeDp(nWs#%h7NuIQwts5MpN^TM6jU(BWr!S9*qDJ_3cc>ea?4|c z+0}qIR1v=von<^xEkfc;38b;>CC>~Yz?B5-`FzJ}( z@?(k4BRLmwFDBHs+62;4^fKPTaYb(W4E)bB$ujpw`RH)+2tBuKQkbqH8g;H>Pr}QO zn4_)ZCYo7T7F4C^iJ6;<2!8z=x&pQ%GQsPc@QKkbio@pi&{^}nOo*C8WgJEV_6m{u zr_`U@hS|JCKxamhvftQg3b%;Tg^3)O>vYRbx1yl<9U4s~OL-_Vfx{M?T9 zbtAbVdNn2{x$+tGu$S4ZQRlMTBl^eBh(g@51|CL*`m9&tuDtNlII|ldH+4@c_a-++ zG0?DI+54B^FR908*P`W*);{?rj{~l63k4Jn!a>r_@zr#VngB9axJP5`NOe8m;iUB6 zPi~v6EkzSI+YcQc>c*d%Iy~3EZU_9b3E5)Bi`2fAk6LK-Rh64_KRc=?5TtE^`#Eg6 z5j00>zn2$sbV@k5H<(`Wzf}YV2$cRf-lza$ph^#F-N$iMv-aJK2P`*Vq_%S`Xgj?< zHTKh|`8j((+W&{s)Zf)4W@CH9$vLgW@%FPiY0TF2LT>MBji}HEe>Q9!{v6-yct}jaJa5L$Wq6a8y8Scfc zEBnMrDV&>JZ~i@bN_q#1)jqvJE^CXjN~fXMyv{e2Hb?ZUF6j=PLdRR1R^fES#*2P; zX$||{sH)m*%$B7b&QdPU;-+(O7#DtD<5IO{OA##aCy%j-A;i=OJu?S(6a zJ$yGmVs`4-9Id|wPB{qIqc}L)O>bLsakv7i`Q9o;IRdH=j}|`QE6yA$xruK-zJ0&V zK2?`yhRzKEq{(eC>_+4|8J&3AeDwQBbC%mf%qir+8x?>TV1VoWVMZlqemC ztBOFR2VE<(M+QVv`2PIt|55xu(kcICj|G_4#% z1qOn1<-l`jm!TI_`U3vU>v#p@ie8=mLluTTPfi;kC- zDcqb$%GBZnQC90w0@?-w8tUdZP#8~(DrzhbLxM8nI^-aStguHSZu2oV)6aEX}Dr<`ReNj{WIU`BsN9fi<`K z<`Ab4F|le$%rj|F=&&Kkq(6xCEAsmR%d&!ZFeQ>B|wOZ>e-_XkoS){%}UJ z!cxJ1+P?GW-k^pr^svG=p9WP_m z`7|;TCo-zz+MS?#GycbIb#1G6jlWGB0vD3fyuS_tSQggt%+;sx@!8YYIEFb-W=IWy zM#{sMUbD=Ps0h81A-N=ZgnPJ5hWLYGN>bpXk8?7oSH5yl{sG9Z-O^86#$gnMoBh-S z_8w8QKU$xPI?@@qu1VM)vo=k-Y(_l5v?MB#q5FrxCq+^(?AN0bE%9hn%-`)s>4tiEGq+k!>PZep6F_p7m9+bC5u-OAYZ_AH?*oH>`Jkbif-D za>%Ws_jOvF|7c=s;_su2xtb|H0Xd!M@mDx~vG&u<=u^$BbpzD_1^q4r=J1zKgN+Cl9RA|Iy+}Urc^~7>Pd!i7(I8vjUo(2*1++ z!;zjnE##q?lsCoC$|o>-e;Y-%A1D}M72Am%nSji7PYKyF{ZK0J%@y2xMdX;d^~v0> zcQVV%&kDN4s!w=o-;_gY$9}94{s@5}CoO_*b;??4*X8#i@%WY(yxV<6_MaSo+@6WI zJ&?&Kg6tO$z4*g+0LdsqCoc}{I-t3OWPQ^g(aKxdoPB-x4S!a2uNjQy-oc=vdGrSL z@?*FwV;8ORIegE-_1_9tjJx=er{wX_nNPo--R!+?>7Hs=^$l-v1Oq3e50bVbJ62~t z&LjF}5CrZ`r+AS|y%nknOsZ#cdCJnm&ifJ;FP_o+Qf72yveq2ge>iq6aAqfh2ih`v z^^V(EvvcpzsE8hNP{1Q4ldcew{q;yG{otbWJYB6^J$6smUPK$NuDn$>&pv}2%~Z<; zjkH>B3TF1P%l9i(r;P3mk9gj&5%%Ad&zd`=T=y`p`OfS^zWpViWxh|*fc@MYCe`3z z$N|uW)b(Qm49H(_(EC>UV#b0tuLIaao@yYr{rl~qAn)1pGw~mX4cL%~q=rYFh$(Xc+#yY{DQ~Q?vGbSHh0B|S$G+Nu@3bF0HD%a;c(By!j|5C^s(8D;%3s)I;?y zK6AT31}DOpIX6hP;B%7xY|HApe3(b}W5ny`vjlZh z^FpdR?gUqtfpifE7J&1f>;M29>I>>0XOZ97fIW@O73}8pT`G&d&hy)Ru40^zZh6!( z1kUk~A<%-a3pu)#H|7Emuj$^7+t)@{T-FLyZrv9#x(}(jidyL@SV`27zfcla5?59Q z$`2X%M88Pbeo~z)bMoor4rHWG5n5`yVa9l|$=A52HG0pG$d>QqVzqtUm^GC)1-v)@ zvp54~BoL(Ag-SR5>@@w-WdCkdIuUPOdf>W|(gm-lzS<7>j z>ku-MwSNb7_g&!bX`Er(l%X0-ay_iEz zseiFbCVbRIB2O+x>mYY_*dR!w*5qTI>580u9Bv$98Zqv=o3rk_~~$Q6+7RXBblW%MuAnny9~TkOXea6t?XuYBqp z498Xi0q&IRp1O~s)4n{Q8|*rdga>$u)ieI9>JzW3tR>!cp&IP>h8-sl>t7c;U(Xo+ zjI!9Z`;UW(GAX{XJU18^ih?|(+-N8RUp}3GD+M*iqZpz8AfvCf5%~0v&Fb~o!?=kp z;>RT!)SEtY0s5|h=1hIMcUrx`q%s^)?wXU)mg?@j=~VL~&K^;Hul~|WW(Vqc(#5`Y zgy&DsXR&77?ybM}K{uk}hz$VqJoEpwT35a-0GgnD3={O&mXd|mQccw4KIF)5xRBs8 zkIXQ_qtZm~$ap?MI)|Kv+wNnGOo+`XZ)NuZmMumIMkXdm|iC*K8@<_wxHd`GZIe zTMUArDv4*9yh|5BC;GELZ{JRbm}AB3XvZL2JCq}b!vj{e+Sl9l zF26|SmDhk}mly>uQSO%-^xFNeOUqMCG#BT!DLKaxjdPV*=GLybGuStw|J?;pf8as> zpv$0tpK&rf7lIvhQ}i9rlukTIU6w&nS*WL+FK%+G!|QO@%`8MzMv}DaKbXH1O{KbC z8TjLj{2GL@cL!c9Ek5cJI{xov zU+2%RUWqIW%917izHX$X!kFxrCEW`6SHJ>C98*G~(D(|Sn?}5fJU{ynGW}YN$oMTkq{ugF_eS zR+r1qZ=C#Z=cRpB zxO*WmFYeA7_2-fvxmrs3yM})mMSM4uSvA(}FT9nL@j2G#ORhz{xi zrIWRdwcEP$1`qx97{{~&(d7+>y0fGl1Uo4+-DX+wQ4LGG5WBi7UoxZY-^)Nk1fy*iH@;fyOcy~sJ7s)5 z^HF-(rAgvCUlNn{BHTMY&9ywsgZVFMk)eGPbn~?825V^vh~#&eY+EI%^yKwk`l3*O zFiBYGK1uS|4rIR%I1_WWO3~=1cO#nLym>8GktbE6l6|^DsY}c;fc40TsQwEEBmzQU z#$OUve3!4EwI2EFBy#Qrp?GG-UB}nd>49(L-ZVs&uk?sL@W-E&N%lm^?dNfuu>h(u z-p-+XsWE}>-7{ULS!~27%m`(aw6PPlD>T=PK4hrSjjtr5nlL0nzkx`(f-JbNiA>lCL&d!{W=|>$}mfnn$3@e2b+`Yu!ng5*uC^ zW7OYQ=j%^)g-tcRiRu!=*Fv0rS@jTn3Z3%w6KB^@1A{_e7DUUy-Lws_S3I+9f`dFs zff*pMmC0!B^gr!?-nCV7EVr-)=xk4U_lA^GmY&j5X0}~`#oz%53^lsH3^vW=5K##T z5+}~M=bBfnnLtWWWuE$BUN#iJ%@IW=7wC$e6kPmqU_@l@Y%ln#Gb#eiFIDkGvOgOZ{<&Pc}E8muRJQ90d!O~3)6StuO1iu$Gk!18L8 zWx;Rxg?@i@2@{vEe^2B#kvUtH@J9D4PD+oz#!l7bAo~?B?&q_CJ!8QEd0eOZw%DJh zq3{@x_i8>F>a}rZu5ZXG^<%fiSjY7-AZbNs4Ve2eDATLh+Y86F-l~=T-a3~-D@9FF z5!?9@ui$C!P+oJ)(;L2Wv=iO+HyQ}>)d*74|E##He(VQ|s9^Bb9Prf+u^j6H-5zn< z8pv_dt2TC{c`BSHXd%|d+rC$FAoaGy|GBD^~_SZ$_axM+!A`c`|f`5m7 zE|5Qbmi+|T8#DOfnpF~tfkB0^ZL{rbtJkB*b1*l)?E$3LsYUP|X$=ny-T&O;J0``a zRw2C=VJ}jqh9+MS*qFbLBr7o`jrS|2q>6v>!?!L{j@3#|cv#PVv#@zAb&~ z*Y8!7?f=QzdFQe@01>s-*n~J!~+ps~V;W6K7*ZisPJ(_2Wv-%V!V?s3+tz+XIXnTp*z2&uQ$w)L<*@jK6+yATdeD%C#8`ii7weW?1g{6T^#K0v=%dvtavw8pmGH4gYnGFTJ?UbD{P< z2F-&XT236X{;*N0`jGj~J``E#tbZGC&;qT31_(^Z&YW|nrV8~Wx@+}RUS(^-5rwmlDB_j1m__J(3k5_2m1NQ$* zGR~cbYbiBH4gdB8X6Oy(RIq8ihpFO)p${spt=A*)*!_?HY;Nldv#J=k<$UI1K>k65 z?cz1lHm5W*$^%VC?XARcBitQ-yl`T+LEabCML}I`L zd#`_77^YH5$2Uj9U%F(qa}S){DS6~Rq;OhKr+p;+wWt`7S~RgPkDp2fY&)!oAK#$9 zyY%cYDMocR`K(`^%e;d-kedBWNVtl&2|oWx(I99g60fjlrJXyieM_XUS0r6(x?A^w zt?`smzto=ihrHbUD9NnDB3tcK^_9dPv0v8_q(H`gbZ6)cg=Hl#x>;lM#XHe#$$#K7 zLcy2;%@cg6wjRDFai1<^#T_lBqaJFPvoO<<@I8tAYBK#gVHfv~H=#zxzblEmoK<_S zXriS(x{va^OBE(sW>9k?wG;n>@~}I*D{0kTZOd%W*9c8yzn<|Ol{Qcl1&kH&fZBg8 z)%%Oc@q1koi2j}^OU32RRZT24hnRHut40{J;DJaJ=J=RwBNx z4Lp-!l>JI;lDM2w`N8h_^d@!ZitMY9v&&Aq!_OF{E{=k~a>13OaLY!w9NL@A1K?Zw z+L~B5l3bEfrt@Jrw)KUmJx4|G`*mbnI{AYpAIZXqNcgO!DzCy*Ej>wD@?E_GGotMb ziLYevnH)5NcQUPCU0_W?R4>R+_Wx5E`UX5(R1&^sD(igW9@s07gUk$Jdw}9DCsFA= zQ!!>Bhp61>!*XOqJmM=Ey#3Dt0-a9WmQtmPDDuulZ zQ0A3>n@C!)cDi-t)#rm&c>`bipd{{MxFBlT&muQKl&Rdl3x#?sA`P3bTK{jjGUc4W_aPN=yb_EgZ4`W zyfdnMVEd|HMV}@T7P+rXLsE~Z35P8<=Tw%Jiig&$hQt>}Gek;A_Puw@&l^+Ds z4L>mX3cg}*B_=D9gJ()s1WR*O8qLlz)EbzN*P%rIXMFLe$_4E!;;87CL{(OE>6_c! z0>2lfCa^{_4Zfu(`%??`#>^{b`+vI)+n0~Ptay}RGBMnwSSY^4$|#d z?k4Q9ZqlrDJzo}X_fC5g4R&1cHC^~C=Z4~bQ8JqI^619)ZR`#&A<)aObYnaRG~MRd zllEzH>R;__SvskDeIiK^{w{s@><)(9l*|1#28PZV^k>|U=oks+Lo#>p6!c{uz zrT^L#yO56q{`RNw`s#Lb(Z*LKlU&<)-NyFz4%9p|#dCZ(uruZ9RnTTCXeB$l#X3J` zZzqx=EC2O>BW7e|V|u(;y#|tf-$X*QtA%RL-TgP+s?}(h(O+geFT|B%YJdhAK*PMH z0RebdXJo!6klWFTp;JM7=@H|}`7@qkmpz|p62 zwR)zAq_;?w!ueZ2uD867mZ8doR#y3&x*aJ2VYR`p-tJR6)E>S8{FDEND3p?BR|1QA z03+$<&!og=G%nAu{{EI{a+k?57A0lk^8Ss*Cxp#^0GsvC zv)hoYGo$ZOk~{(bpr@ErM_u0K|~;_TS^6-W%4($#A1Fa_$5ny zmkMOVCLbyy2Db5@dLuzdX`9KJwfjEVGyVNw{d~3TA^%5c0E72H(TUuQIKfxano8nKPHes=)Xjd(5@J~G)q;l z7%8zxp_HmE*86$by)$`{;zA9Y8MOwDv<4Kbj`h{64u7+!7w!Ue1fCKuD`O<*kz2f) z^K@0i(y-cHE24JiUw2gTJ}TJvNUaUQ2=v(_K3kbUPw_=6Ucl5^le73>jIGjqZAFKX zhGPg}IcVer-XPo-Jv8786A_taP?&RytV|(>Vc!29tz;yzeEPs%izQt&wW~J{$NP z|K3q^qQ61A_V<^MT%CB4x80Hp?j4$YJP&(I7K1dSYpEK~?e1yaS#$!hTiiJ{fAcg#G>=M#jdVk#hwm*wN8(h_HgfXuP=G}Fr~AjYo- z2ffr8YC!`ed{2E&%KWuEiEj?^d6pVmTr0+N5yO#wqjuX&&jMg-2h1tl}NoG2Ti8Ya}KHpo(M^796INs(S$~b5dJk zu(8HtH0H{0_2y)ifc80d-^{J=Tj<+=<{DLRLec`qGKqK3rnxQ?3|6jyQmpnO;&pNY z8npf24Te!|)x8F)3MZ;aEV~ZF;{6964G3fDb--WQd!AH%tW9X!2nOuuEv^Eth^E-M z_QmSyr*B^?q@|HEWZC;Y1@u#eEj-v>1k&cFPxiz&h-%gewszT5OOlUfO7MKx*l|0Q z-Y(b`(RRaUuFt!r_vJlhUNv9Wu)pF=5o_i1{wj*fb)B}5;&fz!=w+)sFVXH6tNgJI zqI!93!pOobpZ{O>+>NNb(8F2I&Gd|DYO5rrDUT~I7v^ zIMiQV`GX4iho+N}|AMm5?$B%F(Qh}E&*`~;!6uLFymk=qGNy@enU_&BuOPc31Do_u z(lN{5)c7uhCOPrBX!wkVAD-~{T{HML3|;5@XR7bWQmR6efp|6ba2WkryA#gyLEBL@ z&}?(%&)Rj4QrlIEMyL*HhrNbJ854C9JS(wy!MjbWwD>t1nDw8~Oo#2WAO01ssJ{UD z1&CdKbCZoUuX(f?GgV3_A6Ql`tat}ei%J-}lRsWQYs&{9A!5ZIc}@;|v$PC5V}GV_Kti25AF+C;0X{xcEox;v8PDx(08 z8<{$EqBpIE-709j5Nct0v8`KcWj0l5ppPQrcBy+@d$FUh69IXUrfFHq85tvAN~<+~ zSgmIoh36*@^6}{&Ll)VJV9qC78OO8=3J5WrhFQAdW2mLh6w1(<*4 zw3IDdQNubRh`#;;$1O)UGTw70Bt5Q-N0^UwoOm)QUSnl;iF7CQWXsgrdxarS0t8D7w@IiOOwY$OI@2Jy?Q!_Fgk z&9hc-bT;bga|p=MG;7z%KhsWKtMc4y#lo&evJcu}%RTDUqpqoa1t?JmUSwH>h_=6> zg39UEBfy$>4t!9PD%`H&*(hJD<~ndz(X%P7uS>E(Nb&VP@#neMw*m$Ips=YkcDY+r ztDmH9X_^Kk$h^kepz35N>~vaNW1d!*4oNTVNkhq`JEos9jr3z1HKRz{TAN z`4i%Cs2udkj%>WsC&D4N<@u5ALGz&=NH{z8CP|Nfcsp)ImuWr%qCx0g-m5z+yF>Z9BVDVifQ?I9!2kIdexy-%9zFf=&y ztT6>SCY|7zNS_KRpJfic{sz=z2ee?0{TY=P)2iuXFDqSx7l=_c{l7K6D1P! ze*)+)--tit({clNY00!Yb8KCi^Bnu5`C!7`PCUn+sG%or{6#0^j>%FMMw8F(YU|4_ z;*0hn6=eJgI2l{@9j z)7(GZ``h0+=a4OMtoIGM5}Iw28Y^TJMpL8pV87ju=XhE^^Uw@N%RD%Q)EC{J9`?MB z=k^;9=l`d)Rx@iPnYPHsTR5_ho!#ep8*gT7UO8F|&gulZNNuBH+uI3UW^a}Z#B$hx z%#fKaw-rZ;k8Dv5lVp$<5L!>))WO3kCp$CW+B>AEQB^~okC{x99{)Z}MFpCf9jGlDd*ut6Du$qlmwy=k{k^SaOVp=IvOG2P8y<1WA0wQ<{FEZPTnT?p6N3%jE&yh(5;Nt0{Q17h(^+MZwbf zL(3KBFUJh2&yYx)wy(ftVcEf{98yOTZ2bqLgIb&yhC#?5zj48>^vZ|y@1pt;zA)|= zdNU!CpYQ`TP0+R|Zm8C~&%T+-3tH2hbnJc5@I~6!Ph1_ovxbyjafRmFZ+oh8wzYHX zE*WS$Omo1d!s=v*STR5DN=uR1AS3P&rHV&qh>uI#%MB;@>Ep$*_{I2WHHYeFg^eMh zz80fG`{&u;>6BY53*(h>TIVSozXYK;gH=NYo$}8PPS(nA<$(3^kQ+8re4pvqH91ez+vXQnb+$J z#Fc^*LM}Ciu#yjs8XbiQW30^b>wx%Ja;y{aGX5$~12steDYbMcDJu3(wOsbJGJ;@oR|M zkl`cNJaBgSdvlr*Y*2&ta1RP71{IeWnJe>OlkZ5570yK^1wIcOT^I6CK8~3A8?I#%&a{oAZ+X<;^P4fF$Nlc?Ku;Nr4{H=_r{ZQn5|30$JPb16e7K)rvi z-Apg@dToPwR&$Y&vjaW#!sr-(+TYnOL)$fL#a0(Ty1R2huz4{IdMQk{lD4tHrQ5C* zHq{t3e8i4DmAmeu1ASkxmuuLY)}Rv|b{~p8@uQJl_qz2!8yP_254&Mr8~i;{x(q_( zJz@5c77QwIPn}|=DUU2Te05e^XlJm`7qM=A)yydR)A@akk;Sf0QE9Fe4rvJpX#^5j zT5+zVqed&vDV*tFCU;{3t@Sj+(2)u!WxLRxtx-{VRe{Cq{XJm!_`_>3fvy`g!%Aj_Pm)$u&P%T^-HbY#+VuD58Ro@|Zk$DU zPhS;>zM29DH}S&bz_YUnPa}E;4@2Hg$9mtTa?6-je&reK+fw#a*2K&2?cza-Jy~kA zIo~Z9dt_DVFYUU1z}?H8U4~9z8Vx?KgLow3(Y?iLmy`B;vSc7?YBa67=)3Z+LpU<+ zwvkx%5`kv8z));)(FmlJQ+FxPZVvr{n-DLk_WP(e3ZZ)}M5)-_ORcT+z`zu3TWNaPU0r5!|Ja#bZufF6BNUqnfbUtQ|EIkU@EXliqN$b9-_7IWQfH}2D+U{ z1d)BZfxQ)~Dj+agaGb>PQkR}AC4gBO*WAbcb8~;u+)YtW20v5o_*;UCcokp&=nEgg z&+BO{?g=AX&b64#)WY|)o}yeed@X511x&Ig+55>{!jq1zL}|ksi}s7ImUbEk^ut{G zUPqti(Z%nr?R%O!ahmnjy{a(2k89PT(OHLYX0ti$Z}G|)LhS5VDC?vD=_-^XZEj

UpIP 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 V>&;bb!V$U+P8c08JnDG;{{W{83l{(Y literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..febda31 --- /dev/null +++ b/main.py @@ -0,0 +1,272 @@ +import flet as ft +import requests +import base64 +import re +import time + +is_finsh = False + +def bkn(pSkey): + # 计算bkn + + t, n, o = 5381, 0, len(pSkey) + + while n < o: + t += (t << 5) + ord(pSkey[n]) + n += 1 + + return t & 2147483647 + + +def ptqrToken(qrsig): + # 计算ptqrtoken + n, i, e = len(qrsig), 0, 0 + + while n > i: + e += (e << 5) + ord(qrsig[i]) + i += 1 + + return 2147483647 & e + +def QR(): + # 获取 qq空间 二维码 + url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=0.8692955245720428&daid=5&pt_3rd_aid=0' + + try: + response = requests.get(url) + response.raise_for_status() # 确保请求成功 + + # 获取二维码图片的二进制内容 + image_data = response.content + + # 将二进制内容转换为 Base64 编码 + base64_image = base64.b64encode(image_data).decode('utf-8') + + # 获取 qrsig (可选) + qrsig = requests.utils.dict_from_cookiejar(response.cookies).get('qrsig') + + return base64_image, qrsig + + except Exception as e: + print(e) + return None, None + + +def create_card(img_url, title, subtitle): + return ft.Card( + content=ft.Container( + content=ft.Column( + [ + ft.ListTile( + # 如果img_url为空 显示https://picsum.photos/200 + leading=ft.Image(src=img_url, border_radius=100), + title=ft.Text(title), + subtitle=ft.Text(subtitle), + ), + ft.Row( + [ft.TextButton("购票"), ft.TextButton("试听")], + alignment=ft.MainAxisAlignment.END, + ), + ] + ), + width=400, + padding=10, + ) + ) + +def main(page: ft.Page): + page.window.center() + page.title = "QQ空间历史内容获取 v1.0 Powered by LibraHp" + page.horizontal_alignment = "start" + page.vertical_alignment = "center" + page.window.resizable = False + page.padding = 20 + page.bgcolor = "#f0f0f0" + + # 路由改变函数 + def change_route(e): + selected_tab = e.control.data + if selected_tab == "GetContent": + content_area.content = create_get_content_page() + elif selected_tab == "User": + content_area.content = ft.Text("说说列表", size=30) + elif selected_tab == "Leave": + content_area.content = ft.Text("留言列表", size=30) + elif selected_tab == "Friends": + content_area.content = ft.Text("好友列表", size=30) + elif selected_tab == "Forward": + content_area.content = ft.Text("转发列表", size=30) + elif selected_tab == "Other": + content_area.content = ft.Text("其他列表", size=30) + elif selected_tab == "Pictures": + content_area.content = ft.Text("图片列表", size=30) + + page.update() + + # 获取内容页面 + def create_get_content_page(): + base64_image, qrsig = QR() + + # 更新二维码状态的函数(模拟,需实际实现逻辑) + def update_qr_code_status(e): + ptqrtoken = ptqrToken(qrsig) + url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara' \ + '%3Dizone&ptqrtoken=' + str(ptqrtoken) + '&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-' \ + + str(time.time()) + '&js_ver=20032614&js_type=1&login_sig=&pt_uistyle=40&aid=549000912&daid=5&' + cookies = {'qrsig': qrsig} + try: + r = requests.get(url, cookies=cookies) + print(r.text) + if '二维码未失效' in r.text: + qr_status.value = "二维码状态:未失效" + pass + elif '二维码认证中' in r.text: + qr_status.value = "二维码状态:认证中" + elif '二维码已失效' in r.text: + qr_status.value = "二维码状态:已失效" + elif '本次登录已被拒绝' in r.text: + qr_status.value = "二维码状态:已拒绝" + elif '登录成功' in r.text: + qr_status.value = "二维码状态:已登录" + cookies = requests.utils.dict_from_cookiejar(r.cookies) + uin = requests.utils.dict_from_cookiejar(r.cookies).get('uin') + regex = re.compile(r'ptsigx=(.*?)&') + sigx = re.findall(regex, r.text)[0] + url = 'https://ptlogin2.qzone.qq.com/check_sig?pttype=1&uin=' + uin + '&service=ptqrlogin&nodirect=0' \ + '&ptsigx=' + sigx + \ + '&s_url=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&f_url=&ptlang' \ + '=2052&ptredirect=100&aid=549000912&daid=5&j_later=0&low_login_hour=0®master=0&pt_login_type' \ + '=3&pt_aid=0&pt_aaid=16&pt_light=0&pt_3rd_aid=0' + try: + r = requests.get(url, cookies=cookies, allow_redirects=False) + target_cookies = requests.utils.dict_from_cookiejar(r.cookies) + print(target_cookies) + p_skey = requests.utils.dict_from_cookiejar(r.cookies).get('p_skey') + is_finsh = True + page.update() + except Exception as e: + print(e) + except Exception as e: + print(e) + + page.update() + + # 获取新的二维码的函数(模拟,需实际实现逻辑) + def refresh_qr_code(e): + base64_image, qrsig = QR() + # 刷新已渲染的图片 + qr_image.src_base64 = base64_image + qr_status.value = "二维码状态:等待扫描" # 重置状态为等待扫描 + page.update() + + qr_image = ft.Image(src_base64=base64_image, width=200, height=200) + qr_status = ft.Text("二维码状态:等待扫描", size=16, color="green") + + # 返回一个包含二维码和状态更新的布局 + return ft.Column( + controls=[ + ft.Text("请使用手机QQ扫码登录", size=24, weight="bold"), + qr_image, # 展示二维码 + qr_status, # 展示二维码状态 + ft.Row( + [ + ft.ElevatedButton("刷新二维码", on_click=refresh_qr_code), + ft.ElevatedButton("更新状态", on_click=update_qr_code_status), + ], + alignment=ft.MainAxisAlignment.CENTER, + ), + ], + alignment="center", + horizontal_alignment="center", + expand=True, + ) + + # 用户信息 + user_info = ft.Container( + content=ft.Column( + controls=[ + ft.Image(src="https://picsum.photos/200", width=80, height=80, border_radius=100), # Replace with actual avatar URL + ft.Text("Username", size=20, weight="bold") + ], + alignment="center", + horizontal_alignment="center" + ), + width=200, + padding=20 + ) + + # 左侧标签页 + tabs = ft.Column( + controls=[ + ft.ElevatedButton("获取内容", on_click=change_route, data="GetContent", width=200), + ft.ElevatedButton("说说列表", on_click=change_route, data="User", width=200, disabled=not is_finsh), + ft.ElevatedButton("留言列表", on_click=change_route, data="Leave", width=200, disabled=not is_finsh), + ft.ElevatedButton("好友列表", on_click=change_route, data="Friends", width=200, disabled=not is_finsh), + ft.ElevatedButton("转发列表", on_click=change_route, data="Forward", width=200, disabled=not is_finsh), + ft.ElevatedButton("其他列表", on_click=change_route, data="Other", width=200, disabled=not is_finsh), + ft.ElevatedButton("图片列表", on_click=change_route, data="Pictures", width=200, disabled=not is_finsh), + ft.Column( + controls=[ + ft.TextButton("Powered by LibraHp", url="https://github.com/LibraHp"), + ft.TextButton("Bilibili @高数带我飞", url="https://space.bilibili.com/1117414477"), + ft.Text("程序完全免费且开源!", size=12, color="red", text_align="center") + ], + alignment="center", + horizontal_alignment="center", + width=200 + ) + ], + scroll=True, + alignment="start", + spacing=10 + ) + + # 左侧标签容器 + left_panel = ft.Container( + content=ft.Column( + controls=[user_info, tabs], + spacing=30, + horizontal_alignment="start" + ), + width=220, + bgcolor="#ffffff", + border_radius=10, + padding=10 + ) + + try: + home_content_md = requests.get("https://raw.githubusercontent.com/LibraHp/GetQzonehistory/main/README.MD").text + except: + home_content_md = "获取失败" + # 路由容器 + content_area = ft.Container( + content=ft.Column( + controls=[ + ft.Markdown( + value=home_content_md, + selectable=True, + extension_set=ft.MarkdownExtensionSet.GITHUB_WEB, + on_tap_link=lambda e: page.launch_url(e.data) + ), + ], + expand=True, + scroll=True + ), + bgcolor="#ffffff", + expand=True, + padding=20, + border_radius=10 + ) + + # 主布局 + main_layout = ft.Row( + controls=[left_panel, content_area], + expand=True, + alignment="start" + ) + + page.add(main_layout) + + +if __name__ == "__main__": + ft.app(target=main) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d54c7ec --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +flet==0.22.* \ No newline at end of file