From f8ed063b760a91ccbdecb89c34e0dfc7c7eeb719 Mon Sep 17 00:00:00 2001 From: zhangyang Date: Thu, 14 May 2026 21:05:10 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=E3=80=8C/=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cibird.png | Bin 0 -> 18071 bytes import_words.py | 2618 ++++++++++++++++++++++++++++++++++++++++++++ index.html | 1166 ++++++++++++++++++++ index_updated.html | 145 +++ install.sh | 404 +++++++ 5 files changed, 4333 insertions(+) create mode 100644 Cibird.png create mode 100644 import_words.py create mode 100644 index.html create mode 100644 index_updated.html create mode 100644 install.sh diff --git a/Cibird.png b/Cibird.png new file mode 100644 index 0000000000000000000000000000000000000000..409e1b3b5a9b8566e2f586334e5e650fd08dcd6e GIT binary patch literal 18071 zcmeIZ2UJx}(=NCH34#PAgGdrdl5>4F$$}s`35evJlSCy6lCxyV zaL93*_kF)_{yX=-bMKlpvu5s^>pF7w*}J={ySlono~qvOloVdzVpCv45QHo9@|g+* zp@K_P21Zs?#OO5nT-rC_fuUwSygR6P{bOg*ek zh0N$A#A!s`gaH9tn6ojBo2`wVldzi@-CuNt!S&5;4mz5@nmAjF(LKFkNTVgML?Z=v zgwgP`bF!Ioa&prM2(feV^YRJ`KBnR3~ z^6dFPyudFpy4TLm_QD(-2n2#1!NU%BwBX2GFZFD&H&q#`$|)$!$@zCvdAOOSx%+?JlvkLWQ<#tY zzi0}S%gor>_`loO%v9JM?r3WaL}O`dYyso2x3i$5`M1D@rQkMjN5B}2j^{t#mywcE za)g^(+JFa6Dla5yWTd6|xrF%n*|^!c{u-{lys(U&le4j%DNN>>7#$EJyQQU>FpS&W z*o0q*3n(|A2^$}b7sh77#Rp?EHRa)&CjX)a6E5ZuJz;?4`c!kXPV8-U$ z{}R%FJxN|+u!;Ei{-xjl&rb3mQJcOtwzGf%`_4i4e|_5jW4iwLeEzd({}s9p3$X9p73~eWw-UP^^RgBwc=&h-Q*AxW{iQB^ z)M3gHI~QRnEi}uMafc6<-GEB_zT`dXy2o;v9=eb3re#u1Z|`>RW*O3Jmg8Crwvu4c z1rrw;5GAd5xdlP5&EQ)gK=5;+0nVK%5d29e0^xz53KqDOrTt$w|ECkkOo2WML4wK2 zuCZL)tq7_qxjbj&Q5C|TCV+QzR71bnXYt~6AuOyX&3klmh;E6XM_0FRsiFywIVCCCUKm+eqHD25;isjCiI*G|%WJc)c5Y`=>(ksI z>UntWxlqPB>>M*VR6`V^UV{wMc0k9mpV2Q1o|%gbEvlix8333#cg zad}C-^J;HxXrLvUwLsF;t94cZIQ**qj{Cy9iD0}55n)+PR_$+j7(%T)&@Vwu^wU?L zemaepJdn)}PD{(QP#k+8mOL|^O!VHazu%VM?rSmpYrb_szV-0N#`ausqtgrD^P|h5 zp>qZXghJ}@^?oRmx+6YL($RNDJOzcEZ8D;}d)>{~-VfOoVy%8cxfEs?C@qDnOW&WW z=A1-6*veONKl~%Lx#_mOwzjYUKBHMLf+Y&;eXsjJvR1PjJQi_Sm=u^Bj*tDM+4yc_ zwD!}~H%^vED;IHWb?_!GIARjau9pT9Hn)IN*Vz9~C+ETVGLqWpDd&JSwmpOPJmL5pW`bEfep2JwL(XXt!?hqx>cpEs|^%MLmhuVtsM) z;%YDQX{7j%>p{DClht{e27&{nB{aY_cor&gvJcT}_ObD5$O;Xu+%Rd1%X#!WkT**` z5%Y$CY#NH&3+X-%CO1La)|}$2fT(jA>>Ez4=T*b5q#6DVjZTQ{>S$`J zbyA6Ma@4RQNMp;rPPcmE`=&IJr>h?+!fOtrxxm=TSx|2#Z*jDJh=&cxJ=~k0ZEPG6 z*L6YWhRHOaH9TWRbo&8m3M?UEHXaM%;OP^U~FsrU+*6 z=!&_u#>*!AudSos`5`)0mDuR$4-YacD-UN!@&!2bY7BLB+_!YHHFR~A_tJA#S})Io zaFfpu91ac+Hs|L0#;VW#P{iK6X?Xj_;}!;Xvif+1?7{~#X2B67rzLXe($I^`WRUJ1 zc5(67x`IJHVYl7&BK`1!UueU`q=b@omsiwOp2v8}Jd95Yw~IB7Rah9lK7=4fatyzX z7XQJWW;kQ(W-9UNsYTP-S3x1|?gk@y0lU`%cEfhlC-k%iR);?&E{xYIEX7dKqzf1! zh?@J3Uze(?h;GoBjizFXaCEF%lWkH>hlUle5QRJ*?Ij5t1u-@CeR9jJauqZ`why`j zN+bKrXw>e{+EK0TW+so%Hm=`=5L~VgIJ+QM8VMg=c%B`|y@-e!)%b&V3o?3`57{3a zdOMG>+{I~dTl={Z{D9@^K=p2qnZw2u{8-{>{Kz7$(f#)uSOgZt8>0?|ov+cCj_%u9 z+KDH|I?wNQO;96cGrXp%3TbIc#F-$am*N8uQCo1N*9y7vdn-E|(cN4L;_HFy5S2u7 zPJ1Hg@e^?rPM<9uW%E;@&C}Oi5>^6sLS(H~yIh`yBUhaSZ0k~@X*&kJbL2M! zEI(AMOo(ybFklS)HaIcS`u!cj(De98dTD7`Ln@-FNy^aMrTgHIcMv{eZFFz-SAT#1_r5;xY1Ay9Z40_9 z+5Le*KF!y_^=R`{zn-0ek^c7h;U__d-n1)TU|N%>r-e^SQ&RHdu8Qx5HPS&2|R)Est0ZOx$zvN1`&a{T6NC-7HJ99aAl2AftW|{bg9dkgYc=5W6gL; z;xpPAoTi8ur12<=UHD`YP20u3V%6T~c_aBr&cY7XuTNDQUls41Q1oR3uUwn;Yi+## znEv~Bdh>y+op^6K2P#3%3l3j$aqGCG>S}ieu(g_3aX7-R+NjyRj`fdp;lG2P5IL@) z^O|*FS8vatlc)gYM11IbfU>!%uh(fieR82F5&k}$Z)bgAX?>aRs)KZq!{Gku)p=a9 zYu*OZegC^evN+YzuxebxnTVT5#Pvex$@DbWfCT(#?+D%~q+Ew4;L#U)h;qohg_>F*e4*qr%oId6KzrD?L|JBV_1ByRH5y1vt+(L+`@_ zO+%S#ny#N~YeEwfMm7(F|S;A~2I}Y&A zX|nQE2VD}f9$k(SEpJCDP_KWmG$H~09u;`(#PAW(ChEvW2-6_4uDC}USd2;!Kl|&@@ZSHEa z_xa;yJZk~Q+;^G%s51Cdcz#b>c_h-VS16UOP(^ET$+^8RJC=c-K5A9oIp2{>=-g;LoaNL=T=e_uBK`w3AM6@)rA+~|GkxcrXLL>)tr9AiVL zo@D9wn1R#g%+zFMlwLO_yvEHDFm2+^CG=&@ZD z41Kt-ujhq{Th?1j_u+#FE}2n+seg@)U_~RkZxd_8{kvIoG!bztEBn*aLxhaZtNk;q zOs^YULJ1a@Hl|EZ?B{;|^fB$i2%}&aeaJtPobsYb&wZhTRGK;5{Qd7X`czMaf}!>N z{NhwmcQ(dV4Lds*neT6Z$eO@+#9u2F|NQA!YKr+~1UPLIDx45`Oh3(LA4ykuL1Cls zMUB=+6xu{eN~G(K_~GD-kzB>;B0H1d+{}D}lI1VXZ)4@<<)(fHPg71A|_etZA+X;V(pTBZTdi!lk zx7KYh`)~t2&NP(5%BpB-Ne=)4-P+m_Y3V+X#*~6SfZ!@(^wDh+gA>>Mux_})PbF1O5m8AaM;hQ%F7O8iuUtuaL`oFD<^xl7$S4~g#!{bnW zx-Y3O2+a>GN!DO~Op!Bbdng;Z)5I#P%yxLVIy4jzYjm2&%C`AbO6s}f8=1(7Q>?I1 zLPs2*)gK?f`CdrHCJv`cq&0h1Gf69V$DutTV?-dVHT_i>n@=R$hxV^e2Ua?tmm?64 zPRNSkAqI`;YHQLo_Ntt94jbB>Ur7R?C%BuvjA<3lR|TkAKPjO#Q6u8Y2yZ81!IlKe;decALc*58LpbBxY*NOwOGwRJsu>v{aF0H5|V z(XX?_jv%xrMx;-qiw#UhZk@1xOcz>6Ea4^=4QiPDg8cJGg=orp-;7r7>@_~sy;5!r zVu{O#9tpf9%g~p6!m|2$FW;^Dva+2f!p2_UVJbx3jE=V7r;14zyc!!+QgzzeD9&b@ zP<(QZZ)wXmQ>)rgcQMA+y8$BstLN|CEXrA!-Z7%Cv5rJab5sGn**|kBM^tZP!-i^= zwU|7tll-Hem!B^$XC7SHWEIt%`1>_M!)3prFU18!W%cFt^$qpD&QFKrTNpo^$rUA9 z%LqK|)g}`+!{*)>0R62O}DNy$=s(2nX%NJg_DjZ+pAc-2<|g?B4ot&!6Gs&i!%C%>>8R{eZ{#j59H}wH=B0 z?IK|BxJpEUD}6t$_d8JZU`Xy84$8*8p?K=@?@3GkB~#mW-$?dN{rML9jHXbO9@&s^ zqK&k_^LdR`=1_z>$*}&AGKEG?{#)vTYmCjk=l<61L*J{=<|nIcQF8<60|-RwgXcWt z!q)vp+|EuD8jGD5W0qyRm(J~mdRv#r>k$GL7R<770$>2oY;3*gO1sr0n4UeDkZzeK`@&Bnevm zglE>A2R>`GwDlVbDZrD&5^&>cMyAu;wKiE2@v0%}_>tOYxI-Z;$ALqA_c<2r=ef1P z$g8>QcYt3vz~`Q~b^HS!D~?Z(yB!BpKP$L{8}Mp`=6G$*?SpIx2z{og9&eP8J3)bQ{D;1pBc-~l6rcuCXm-+QQcKNZ3E8;joT)+JX zfux=~i^OTs1~aqJt(N5hiDnK1o^AT#X7RHa#da3lNhO687CV2bICkP8lnZm?jF68R z?I}2<0h{74Hx0(5NH{uaAY?Z!q@%0TZ#TnY;vadj7a4hRKIis;CeZ%|2h4LCYsTc8 z++oP*D{K&@t;bIk)h{ z{TTv~-{j+S%7j}_oYY4YK`^Pi;^(kPV#OWzDyVQs;NEX?n8Du2`)N|efOpFJwlS!T8os@f)eB+9b6ApvaR$-dlE z2Bm_7U1NWSXP1Y?c9MxZSbxM2+b7v_=o)Vw_rVmpKXNoN{rK_W%Wg~XgGA(n1;@H` z3}S2j_yUP%E-&#XUFnwS`Q|t-WvaOQ{zvPv97YD*L_y{5GgihQXT(el?W1NOT)3p7n z!s1Lln~O^TLA~8f^5sRc$H6Yv9cSd;9ya#+Y_VZvdinztl#_0X18h8>v!59=<>n(v zHDBINMbRp5&COZ2K>ozt#PAcWKoIW8Mm(Srcgl&9Ji9~5&&X=MbMOb`Og>eZg8k)l zCULEdrJDeST%e{G)d(&Q_@)B!xVpN2c+j1pD`5EX#~8&-fLWH}%kB&M7fs%mhm`fM zd(#Z|zrW>C`)+P8((nERaRO1(byJHZ6GB`}-v}a*JPQmS7<-M^aIwGD`zp2mj@MQt z<2}N_0tn@KnH4H`&3*@IE?3su@U;g71OOH<&D77-K0>Y&Q;BVz@0jw#Nqi0&1CnRz zh|&DeS*FUQPd<1BM5Ur(h@STe#JFxRc|Bg@v7Ib1?J_SijLdJ=T5`oSvfr#-^}xUc zXnS^&7{%^rrY^8QRm`h1%-W(~Pt0LqWup9eA4#pIanIAU+UK%CO7h~{w>QI9ce~Cs zH=I{z-Cq<8y>_)iuB^2``@Jmayg|Z`uv^=lSax^UbaJ#?S(ycKe~nMdP29gBX7X%j zcNYa;;;~sj{#ukMT6$&na#F3+VgwbET=3_l3yQ%e)%`bgbl~&Y{;|BHV|j@SZfp8( z<8f#6{`>fssuxoeQ6|5WLYNTk=l%9~ zTdKM5#U;sXh6f`hntV4uRa(;uXyN?|D&f>*n;GGy&!4rbQTb)B0O!1BFLw(wv#Z%gz)h!?m2;*X;AXp$B)Vzs}gA^0vtNDTT}j&3xkiHSJ%C3a5gSdRr7^vTO(8hGU8 zHO+qO0;q34b)tL_`9cMAwZGBls$n@&H#*JNZC130TJyo{+tAxL?d`r2S8lZ>%a5Og zOeG}D6>9&QoU|&XpJid6wLA+TH2S*o_3I3e#cbK83JIdv09-1_sm3tivoJcN16inK zO>kKaXSBC_cu`k;0A-AWtZWhk_MSfZ$cWL^RoxZ)*nAFVnaGGH10|z`wwZcYHt#d% zXY~ZbH@z#f8Q^`1u~AXKbgNzaW^oGH*hY)qR48y5`tUN#te^W$r-)n=-u1@`U>J#y z-Bilw@Vags#{AknFn2U=8sh5z`VREAv#cy@Ks-s<;~>Fys;>X7f6m!igP3PiqTt{p zarE>bV%8@2#qgj+3TEuFx!Urb$}t~+>3Q+A41h(iRupwun?W#~Ra)8Fip9iL(Tm<6 zWWV2tVw8Tp98Zs2^?h*P>m)1EPJ0hIJgKwS!=X*>Rbn|_BIUHAG^BYsbatql>b9_+ zr%D$$F+J?eE_Rt8O&@x_>ig_5$*YgYW6f7PS&<~yCs{Qev$c-P5}_ni2?F?o?AY%8 z=w@F5MCk{J)^+(us-h^@=7a^N=tT)^G{O37F~>k(qvNKQgNMh+fQ0URh`u~P@E}>L z#AYaNH^J?%dLb}6N@8wyaWU&TlKBYxQ{mZgo_D19B&beIQ^IeBlbi0$(|oP~b%5Na zGnVTV1ZQ}D$mXbaJ%)bF3pcmx1Rk``usurtf)`Kxv{;{3@d{{as7()A6|b&n0K_@h zSTAj#2C5&Vt9}sj$XiL(bY16u0D-1c?zpwBEv(j-8kpQ}o`D-qLn?+K%Ly{a@!UKd zHq);=J-Oa3D^|+cm$Tg|Lg)i_e0>6P&<={wV zUnfYe_TfL^T|W%>@P2Dxh}ba*SI`8B6?N^2l#7e{7ZF&^3q46GZ>8qO$9)JHkJMP| zF)`}SPXy~~$oie+oSam>y|WAqoi;`r^EG$$YgLK{)okV>Mj^@tkP+gwP)G}Yu#bJ` zVEgw!38vww=Pc_3iE#3TPr`)oJi_t(F*u=!xuU~r~4Tb-z`VL+ZkU@Sr z|39n%M}5pACkF*lT;Df@_a-kY;Cj;^k_6(bt2$R!>b|OJju@8lf`e}3L*Ybl9E>2ChZkdV&WIEvT!#xJ>i>1A;34B zbJ*KkTv!Cd0GV!*tG?_WZoNxf(er~+6M3^&_1^V+mF1Fy0_+h320rx9$qYeZQP!|rF#0E~IKRlS8W1Qb`m$D~VST}hnlSqG^Gf&E9HPEBs}tt0clDhPxrvyPsSH-3e@s1 zkGFcXD!-bwVf2hD>tGuA&iuqyON~b?RgM+tQ%$gld)36NSi1E!yh7x_^^(gaTQ5kP z@6uz}9PQ)d@H90!u0`d2yhWpi{=`C|SnDa)Ai=#d50{fn=^#UWi$D_%$9?7Op zvU4e~mj{=7q%?}FOg^@dsDIApTRRLI^Ll_rwsSAc);T#6#pf8J5g5CuL!BXjY++)^ zR|-~N_lgNM3qLF)p(r9`X73eQi+VQqEJJLHnDqtXs0-?iW6(FwNT|HEP74XAYd2`+ z50V*(uo6Z3?!R-{K;vK4QHa<(Z0UMnI-x>NX>HTXJlQ;VveWDHbc;(juHWb6Uwz|F zFOZ$}Zr4AR$d7T+nUk+CoEEK*j_xl8Ha#uom?&u-fBQwgndZ?7n%|TTo3P)TiCuyk zQ;>xTobwUke$=_EITA*0>v4+>Zp+ueG|)5Ef0hondfxeyS@llwF}rT(L^%^Esltbu z%!?oHZ@jKdvKYYr^Qm1s22Wr&;yneouXwpQ(7=VZ;M2$?C-uDNg?i*0=jy%M|dO3lpCkC%MeEkQ{~PM{XuC085BD z+w1KMDXB{-DJk>bZk>7!bFo_K;792S36t?sG%m6~z`nxs)l2|w7OQN_U&Ra$hlSz! z%HfK7dFK`y4$NvZ@C(Fe-;xYbDNIdCvGpOAwDCROO#ZZLzyET2 zf(&&94O%&}eYvM#k(290(k&CKC~Yq(IbCJ@_~YL0A=TwVsJTWo1s23#EhigReE#g& zOGG-qVaN~Ue#9dNhKULCE1UbGf{c70g(46dj%CCCye3y(ZH?Ep2M2vIkI1dc+=o7Y z>wUGz|DdS}n5ByHd*&7vJUiQ!6n(R>o-p|OYn2Zfjk0~;RmGiX9D+@;&aRpYv&u0cl?GLye?iwjlZVw7S2IL8BE5_GGhH_cuJV9(y}z1A zGpDsgu8`w=*DDV?Wkx3fy`|`4rgyi2F zs3jUrI>uUCgA9lH7mXN9PLaKvcP5Ri`{#uHxD)roi$xlC%*3HJ8w{*>vw6SYC-cKo zOWiN+G)T@>6Zj=Hiuw8T@1dll`+?(%ZRKOEoV-fa2@u!gHo>lrJS7Rp+{~%wlpw3QLA(&-Yi}i`20=g zsq8uR+S+b-y|+<}V6C@rcQ%oa2ve=T(1=O4@uK4Pta2vKAN`}1)5;{|0hEZ9=}VuY zyoaiUj#)vadOuHju+KR#R-qz)^Sa{l+snxSygqy8;(9bjabfE3s-j>)tT-MA%8MJQ zor3B8L=PW1Ry_`V)5zTmFEBtsvGuVUN~%lx*pV!*N~a+-(2H?-6nN|EOfAn_wW)OL zOP{IVoEWrbhJp2G*3#Xs2oR<7VF79Xu;Q+Uv#%5CsJ9?W3w->=ji4X0%y_LACf!a7 zFZ$zP%4%_OWfupt*>aC1_zvaOXKGrTO;$=r-Oc&8d2k%m^TGxsrv%g~ry?drF^pz; zo%zuMoOjgblL>P)HZ@k$O6ADOJI7=zJ&a{;uWWMTqxywg?96tK9cQ1$t+#&4NVM3n zQg^T2tCTz5&eZib}9Y22wO6^6Q!-;xt=yn1RvhopVVk?r_nvQo}&RxS547IT~=mY)I_ z<{tt{mZoci_gQ2+YYCC+6C;}HmsRy<-Z253i}EskI;*w7JDQ^5lpE4JVT2rMw)F$| z(;PiLYBd!We^vNZ|B#SjJJ&?f%q$7BBPhcbgdn-*W-n)CbodFN6cfCm)-YBh{u=^f zxqWvC9($e!2a-=NC(OM(>4j)LJ?ZFysUP*B`3B7XLX~akWN8~qWf>b78?M>32Pw7q zyN5GJ8~&zq&YSpNza?VYcHq;z4YXwxPEL}jm@_esjKKPS7i;@aLP#kkpK zhJ_t$4}RfNqoZ5Rh?P5O`i~3FR^%70`>%LxQ!7gd9KRO2rA`fO8`+FnSn8NxyWUDndywB22=G-lnO8BN@CDcg~7 zcMRrvQnJ%w!)LPdZ0?4uBD&||ois)C5LA@iq+OQ{lKUc^HfM8ibk zFG7D)v7P-6Hjsr?Ds+h>sC*z?NXXa`neOzQINp)#Y|{dE9bDEzXK}k**UhE zhW+iV`45lVE^y%E(|Rtl*hqIraEO3ER4e&>lV@)(C`_q>?h`m`=iu{6RRlS3sKlg9Xw?YW0S@lywt^3eJaZO*z zmrqSh9%Wrth#e)kO^p+hyYn)CA6NRB0HQfVOiaXHe)H4sLAajrY^LN#?z;Iijc#0N z+9=ONM@EGQwk+)Cd8if6Ya>LGP%;~fPT#S-d}Vg6#=CY1g13_1XL49VhaIGwZSUaL zl{X|fZegh-pcJmhv@=TDmYrSMG+fH{-sfLFvSNxKecGFneQV&$&$jh#v@pl#To8C@ zkk0_hz@D0F+eAWaZmtpcabo&ng@KYk)@D3iL1vFiIQI0inv+LWQ^`p5_ofuX9WXNB zcY^+~CGf4rcoAD#;xaRLVmQQ+(+J;aUWzwM1x0vKNtEKpI}8EEx~r7;O!UfAFV5V* zJZ9tbO!1f;m#P1Z1>xg>cuBMKp@_(a28Q2**Qlr)JpF{0{(&e^3l<8b(Rn|lof};g z3c>s9M}aSKIRZtC02L}=HaoOhG;Og;!5i3y9^XcRJ}BjW2B~>-!+3h|$UJ_RN4M&w zAqRAVTj&2qE!L`1rI6hh*$2QAx2F{dDs4TS?nzcq;Ck4iX_28qpF4!~VhA!vULSFe z_Mk&O_Mg5r;`)6r+L{_$`!m7FTagq)*ke8-tlz(yM!k|q^#J90KgX=EkuIPTG0L%RDs5v>o6X=$aX9xg+5y`_x zIz>9DWV6af&jNg3zfPjIYcHjnc~*yhacoYiN5?&~ zEQHn`4nV-u8Z@~@JC$3d*u|u!g>=b($#c+P8m}I-;ss%bHa}sLxbr~ zG^)U1Ya)@t%x4G_ROC0D(g#0GbF2Aa@V9C`lPdpPqMiI2c^s zri}-0?wv;iXIN?4)kDgG-F!wU`8R^%siM*z0}x94`}Y-n&{8V*mA3t+mc8Vgno894 zWKlFf0>`Z-8Sx~L;?ORj-)H{%w0O*JZuWO1$lBbDUJ>Vm3~+T_D=Y7Hb7b_?zXmce z03vs_B7%!|3YN^wAioeZO2|UuB5J@KjoS0o4G~$-3pa}`GM}vH@6==X!AJ@}q7<>H z_qM(@_uYfT0h9_6u!Uk{Y@uOdVz3(heZb)tv3%TZbAKVdSKF)K*H7Z}nCB!o==s*T z@#$j!D@D@1bvP#@Lx%{9>@+vZ+QTV`CP1&}`|t7zU>^git-CKylc#`b)z};p1X%vt z79&{0-JPwrv~tNkth!*-kf;49_E*S(Q=1hL=P$dad(6)~FKTwtZgZV=kg~ZJG&wkA zN(^wSd>#3{VK(85+mg9-9}?B|zi9h*s|vODtD0rO!Eb_&BEgp_U{Zv)sn01MCeow;_U;D}POo^1!3N@2oVUcYzl~O-@PQ;LXd1 zMwJTjwdQ>Q(Is|-3JEkNeLQrr=N!1BB!0npZS{%G?8v6ywm&-;ak33`?5LxCw-%p_ z$$-=V68_z}5jAK>FGPUjq~DW_&HgHh}wc@7=+1mxm&CwjFrqUtDNAhxp@ zNV7_bfZdCz%gijOv=+i&qNaGyo&jouq7c?bw=O+xd-N6eY z`rr%g+Mr`&;R_UB7(GC-2kC=;TkLy;=nAeH+Bz&|2xTTyQ=y$;H*vh*zd|(&Kp$t& zhrp-s38<;^==h&?cDSFMmBF2K^DBE}lMfL)I`d4M7th1yr-N1(qv|s0#1*U1kLFR+ z$%#>vqCR!!5_gATz{Kl`sKsrpN~=N#!ilcUi^_iG3ROo}NaH-2{elI3gA>^S6P4Go zZ~3E2Rfj&djU)aW>b# zPwyuUsE>$xnO77Qe_b$~Z{)EMtllGVkr#lzf;0O-TM5#*8lU?wb~@NO8EjWpCu8RerGt9^Ie0QCj>mA*P8E|ADdZAR%!Y+nL)YG7zo( z4W04fuAWo0Vx(62o@GSws=!39vXngTDu0ofXQJ98h)jtH3Ya5!m>Q{aYSZbYE$a^q z)fYbN6C3TqUov%c;pO!rtNb~$_tf>9`)lP9rKD77>9_PzS}d^crA0ReL}e(7e{Xu~ zZjjm%-6-1kN^$jmn7NYC_M2Oxdj%Mf^IcHjO4FdhH#F?0ZS`JU5S;Qoc?F}N9uB*c z+QY7~;k+Wx(?yuZSSm{Di30VcvqD(S8Z`ZTjb7#vi?uY_1gbpTZv2;olDyx)f6(aU zqj~b)gtg~~V70^1{)dI1P}vK8Xg47~+{uf>BGR+)IlardqKzH6IkOhMz=!k+ zT~L&w<2ok@TE)9QBh-jMJ8?PX#6Ie z^PB=M2znli0Tv}4k5pha8HyPAhIS#nHO>Xw(ur~XE+aqlOWApX37n-Dtj?=<>O$p1 z0dK~j`R!VxTk$*;1fk{;O3Omkbvqa|aP-aIz(Rr~*5@{FA=Z}KaD-Z{3~WEaFl3+% z1^W4*5ok)z6+gX?5ToBBPw%H(fN)|cEQi}?X28e1NiSw zc4#7900Kb8p$fH4}4*#Mmkum%>mAQm%0zQlmTP!uP^KZqA(hLfUVT9IWqpr!m&Et$;uSs>+hxE zQOhua9S^j~1=_Vl=f07()crJ+&SZcNE-X%J3rFmdgj8dP@1mz2`e;8NuN(`u?xp%I zpnD(iT)$BOv-`(AfA`r0rfrXUT|G7a*u~yHe*Mott`l3DdRtfnc+o?M>8}nqg9J`p zU!6ts<9qM36sr`46SVQ~J54=Ka)r;!Q;zpLNZN7*@Xnuk+S>QmvHYPp27~j2cC{;& z$tin;AgvPLM#om3&5G4*l2*NNR%~i8L`8x@?A*`M=^OWqlBoDmqV7-C}xpIH_?HJ`v-5d zxeO_941Dv6`6><85?VU18Da5X57joD&tH*Kn7ezu`6wrGQ6bxn*WrD(XQeCOz@69Fj zf{YAQP*|6kylTFxJw_^kf=T&@7$F|N0Vfy9?$}Cek;gy&$vB|-^&t1_`XQ`;!re7& zU>)N*40z#lAl2-T=3rrA!8&3^%kb$lSdH?oZeXnhgEQ1OoOK_)GJ<>lR*fj-mOekG zU?u=6E^(5sFso30jTgXBr-KirJzICM52kY?XzUS zGBnzQq|!!>yB7By=tPR}r*FboMu{kg;)&BsIfF~>1MdrmRNb?n0O0C1)toiTidRR3 zXQIapV!qfzUumGLo(8*PhZNUvT0ykjvC=ktsea53v8VDs=ad#%wP zoM94BffC|LHR{LJl^=PRUFk(%UavN|KVHndX$c=W2WfKL?QIZMKB~k@kyD%#wH#_) zdwrT>s?K{C<` K&x$0C-u!Q$O$vqp literal 0 HcmV?d00001 diff --git a/import_words.py b/import_words.py new file mode 100644 index 0000000..fcd2048 --- /dev/null +++ b/import_words.py @@ -0,0 +1,2618 @@ +#!/usr/bin/env python3 +""" +CiBird 词鸟 - 多邻国单词批量导入脚本 +用法:python3 import.py 多邻国单词本.txt +""" + +import sys +import sqlite3 +import json +from pathlib import Path + +DB_FILE = Path(__file__).parent / "cibird.db" + +RAW = """night +夜,晚上,暗夜 + +a quarter past +过一刻 + +a quarter to +差一刻 + +twin +双胞胎 + +at the same time +在同一时间,一边,同时 + +fight +干上,打斗,打仗 + +shout +地喊,喊道,大喊 + +half past +半 + +finish work +下班 + +finish school +放学,毕业 + +February +二月,二月份,2 月 + +eleventh +十一,第十一 + +tenth +第十,第十位,第 + +begin +动手,迈入,开篇 + +what is the date of +是几月几号 + +December +十二月,十二月份,12 月 + +until +为止,截至,离下 + +sixth +第六,第六个,第六名 + +fourth +第四 + +start school +开始上课,开学 + +September +九月,九月份,9 月 + +October +十月,十月份,10 月 + +date +舞伴,day,日期 + +busiest +最忙,最忙的 + +busier +更忙,越忙 + +put +摆放,给,放进 + +refrigerator +冰箱,冷藏箱 + +swimming pool +游泳池 + +happiest +最开心,最开心的 + +happier +更开心 + +funniest +最有趣的,好笑,最有趣 + +grandparents +外公外婆,爷爷奶奶,姥爷姥姥 + +funnier +更好笑,更有趣 + +sunnier +更晴朗的 + +hole +坑洞,洞,大洞 + +home +家 + +each +每座,一个个,每位 + +the key to +的钥匙 + +plant +埋,种出,种花 + +fattest +最胖,最胖的 + +dining +餐饮,吃喝 + +fat +肥,很胖的,胖 + +hotter +热多,热,更热 + +hottest +最热的,最热,最火 + +fatter +更胖 + +dining room +餐厅 + +biggest +最大的,最大 + +its +其,它的,它 + +bigger +大,更大,更大的 + +living room +客厅 + +bookcase +书柜 + +television +电视,视,电视机 + +willing +有意,肯,自愿 + +marry +娶,婚,嫁给 + +he'll +他会,他将会,他就会 + +the day after tomorrow +后天 + +there +那边,那儿,有 + +library +图书馆 + +we'll +我们会,我们将要,我们打算 + +them +它们,他们,她们 + +you'll +你会,你们,你 + +ask +提问,问,wondering + +be +当,很,be + +as well +也,也是 + +theater +戏剧,剧院,电影院 + +give +献上,给,给出 + +go out +灭了,坏了,出门 + +us +咱们,我们,我們 + +come with +带 + +pace +速度,进度,步调 + +dance party +舞会 + +invite +邀请,要约,邀约 + +where will +会住在哪里,会在哪里,会去哪里 + +they'll +他们会,他们将会,它们会 + +traffic +车流,堵车,堵 + +choose +我选,选用,挑 + +travel to +去旅行 + +she'll +她会,她将会,她就会 + +won't +不会,将不会,不 + +who will +谁会 + +i'll +我会去,我就会,我会 + +when will +什么时候 + +before +前能,早些时候,之前 + +come home +回家 + +will not +不会 + +move to +搬到 + +month +一个月,份,月份 + +worried +担,着急,慌张 + +get married +结婚,结婚的 + +married +已结婚,已婚,婚 + +will +里会,刀会,會 + +get a job +找一份工作 + +between +彼此之间,之,其间 + +past +过 + +inside +里面,in,儿里 + +turn +拐弯,轮到,变成 + +there's +有,是 + +end +收官,结了,末 + +end of +街尾,尽头 + +close to +靠近,快到,附近 + +street +街上,街,一条街 + +dangerous +危险的 + +worst +最坏,到头,最差的 + +look for +寻找,找 + +safe +安全的,很安全,安 + +better +好些,好多了,好 + +worse +更差的,差,更糟糕 + +coffee shop +咖啡馆 + +town +镇上,都市,城镇 + +zoo +动物园 + +smoking +冒烟,烟熏,抽 + +cannot stop +不能停,不能停止 + +grandmother +祖母,奶,姥 + +grandfather +祖父,外爷 + +hope +希,希望,望 + +smoke +冒烟,烟,烟雾 + +bad for +难过 + +good for +适合 + +angry +气,生气的,生......的气了 + +feel +体会,摸起来,感到 + +radio +收音机,广播,无线广播 + +tired +累,疲惫的 + +listen to +听 + +enjoy +欢,享,爱 + +listen +闻闻,听听,聆听 + +fit +身材很好,胜任,装不下 + +kid +小山羊,孩,子 + +companies +公司,们,日本公司 + +because +因为 + +writing +文笔,写字,写长 + +speaking +说话,口语,正说 + +hard +不易,用力,硬质 + +schedule +时间表 + +early +早早,很早,幼 + +finish +吃完,结了,吃掉 + +next year +明年 + +change +推移,我换,波动 + +building +楼里,公寓楼,修建 + +work from home +在家工作 + +having +进行,办,吃 + +work for +为...工作 + +send +捎,会派,电子邮件发送 + +message +信息,消息,留言 + +second +秒,二号,第二个 + +later +后来,迟一些,日后 + +company +公司,企业 + +have a nice trip +旅途愉快 + +coldest +最冷的,最冷 + +the most interesting +最有趣的 + +the most expensive +最贵的 + +trip +摔到,跌倒,行程 + +take +买下来,包拿得,李了 + +world +大地,界,世 + +fastest +最快,快过 + +in the world +世界上 + +group +会派,伍,圈子 + +ticket to +去看 + +excite +刺激,激发 + +the most exciting +最令人兴奋的 + +on tv +电视上,在电视上 + +the most boring +最无聊的 + +exciting +令人兴奋的,兴奋的 + +part +一部分,告别,部 + +most +最有,大多数,最 + +the most important +最重要的 + +host +开了个,东道主,招待 + +the most famous +最有名的 + +team +队,伍,团 + +player +玩家,队员,运动员 + +June +六月,六月份,6月 + +May +五月,五月份,可以 + +say +讲个,读,說 + +what are +做什么 + +after +听完后,做后,behind + +soon +很快,不久,早 + +call +地喊,喊道,取名 + +aren't +不是,不 + +the time of +的时间 + +not going to +不打算 + +practice +练习,践,练 + +leave +搬离,离开,发车 + +a.m. +上午,早上,凌晨 + +p.m. +晚上,下午,晚 + +meet +见见面,迎来,运动会 + +row +排,划,垄 + +going to +打算,要上,要去 + +tomorrow +明天,明日 + +uncle +叔,姑夫,姨父 + +aunt +姑妈,小姨,kim + +paper +用纸,文件,篇文章 + +paint +描绘,上漆,涂 + +pencil +铅笔 + +picture +图片,画,图画 + +dictionary +词典 + +smallest +最小 + +smaller +更小的,小,小一点的 + +subject +科,主题,学科 + +desk +课桌,桌子,办公桌 + +oldest +最大的,最旧的,最年 + +youngest +最小的,最小 + +more interesting +更有趣 + +courses +课程,四门 + +more difficult +更难 + +course +主菜,课,课程 + +take a test +参加考试 + +test +调试,考,考试 + +down +小,下,低 + +shortest +最矮的,最矮 + +tallest +最高的,最高 + +in the classroom +教室里 + +classroom +教室 + +fifteen +十五个,十五岁,十五 + +how much does +多少钱 + +cheaper +更便宜,便,更便宜了 + +fifty +五十,50 + +get +得,捉到,搞 + +how much do +多少钱 + +pairs of +双 + +color of +颜色,颜色的 + +pink +粉色的,粉色,平克 + +forty +四十,40 + +thirty +三十,30 + +what do +做什么 + +cheap +劣质,便,廉 + +more famous +更有名 + +more beautiful +更美丽 + +glasses +杯,玻璃杯,眼镜 + +pair +配对,双,couple + +pair of +双,副,条 + +more expensive +更贵 + +blouse +女士衬衫,上装 + +boot +靴子,后备箱 + +cost +包要,要价,worth + +making +制作,制造,作 + +day +白天,天,一天 + +taking +会参加,带,坐 + +having a good time +过得愉快 + +having a picnic +野餐 + +at a cafe +在咖啡馆 + +taking photos +拍照 + +have a picnic +去野餐 + +taking a vacation +度假 + +have a good time +玩得很开心,玩得开心点 + +cafe +咖啡馆,咖啡厅,caf + +at the beach +在海滩,海滩 + +on the boat +在船上 + +location +原地,處,位置 + +monday +星期一,周一,礼拜一 + +take a vacation +请假,度假 + +picnic +野餐 + +dancing +舞蹈,跳舞,跳跳舞 + +driving +开,开车,行驶 + +on holidays +假期时 + +boat +游船,渡船,船只 + +riding +骑着,骑着马,骑马 + +holiday +假日 + +holidays +假日,假期,节日 + +relax +放松一下,而松,放心 + +bicycle +自行车,单车 + +sweet +悦耳,体贴,甜的 + +year old +岁 + +chocolate +巧克力,朱古力 + +singing +唱,地唱,唱着歌 + +taller +更高的,更高,高 + +than +比起,包比,于 + +low +很低的,低,不足 + +shorter +更短,更矮,更短的 + +yellow +黄色 + +hungry +饿 + +ice cream +冰淇淋 + +hunger +饥饿,食欲 + +cream +药膏,鲜奶油,乳霜 + +younger +年轻,junior,更年轻 + +baby +宝宝,婴儿,宝贝 + +babies +宝宝们,宝宝,婴儿 + +older +大,更年长,更大 + +have a party +开派对 + +boring +无聊 + +what's up +最近怎么样 + +hey +喂喂,哎,嘿 + +gets +变得,得到,买 + +outside +在外,在外面,外面 + +go outside +出去 + +raining +下雨,有雨,下着雨 + +snowing +下雪,下着雪,雪下 + +stay +留下来,保持,马住 + +can't find +找不到 + +sitting +坐,坐在,着 + +shopping +购买,买东西,购物 + +find +查找,得知,找一下 + +ball +球体,跳舞会,球 + +waiting for +在等 + +waiting +等着,等待,等 + +interesting +有意思的,有趣 + +running +跑步,跑得,跑 + +swimming +游泳 + +what are you doing +你在这里做什么,你们在做什么,你在做什么 + +wait +数着,候,马住 + +learning +学,学习,学骑 + +let's +让我们,咱们,我们一起 + +sports +体育比赛,体育,运动 + +fast +飞快,高速,很快 + +sport +竞技,运动,嬉戏 + +run +跑步,本跑,运行 + +wearing +戴,戴着,打着 + +at home +在家,在家里 + +gray +灰色的,灰色,灰的 + +looking for +找,寻找,在找 + +wear +戴,戴眼镜,破损 + +can't see +看不到 + +why +为什么,为何 + +can't hear +听不到 + +children +小孩子,小孩,子女 + +sold +卖了,卖出去,卖掉了 + +old man +老人 + +who is +谁是,是 + +see +见到,看见,目睹 + +hear +听见,闻闻,聆听 + +child +孩子 + +what's +什么是,什么,是什么 + +look at +看,看看,你看 + +photo +照片 + +photos +摄,照片,老照片 + +come to +来 + +take photos +拍照片 + +take a photo of +拍张照片 + +american +美国的,美国人,美式 + +where does +在哪儿,在哪里 + +walk +前行,走得,徒步走 + +walks +走,走路,步行 + +goes shopping +去购物 + +shop +小商店,商店,商家 + +go to bed +去睡觉 + +go home +回家 + +get up +起床,起 + +can't sleep +睡不着 + +at night +在晚上,在夜里 + +take a bath +泡澡 + +sleep +睡一觉,睡觉,睡 + +what +什,哪個,多少 + +what day is it +今天星期几 + +cooking +烹饪,饪,烹 + +washing +洗头发,洗碗,洗 + +cleaning +在打扫,打扫,清理 + +same +相同,同,一样 + +drinking +喝啤酒,喝牛奶,喝酒 + +talking about +谈,谈论,谈谈 + +came +来了,前来,来 + +talk about +谈论,谈,讨论 + +doing +做,在做,干 + +japanese +日本语,日本人,日本的 + +playing +打网球,正玩得,玩儿 + +light +轻度,并点,光线 + +talking +说话,会说话的,聊天 + +talking to +和我说话,和一个女孩说话,和我爷爷说话 + +right now +在,正在,马上 + +him +他,他别 + +about +有关,大约,前后 + +talk to +跟...说话,和...说话 + +thought +原以为,心思,想 + +watching +在看,看电视,看 + +newspaper +报纸,报 + +eating +在吃,吃,吃饭 + +we're +我们是,我们正在,我们已经 + +reading +读,阅,看书 + +people +十口,guys,人家 + +young +年轻 + +happy birthday +生日快乐 + +sad +难过,伤心的,悲伤 + +letter +帖,字符,信件 + +parties +聚会 + +fun +好玩的 + +how are you doing +你怎么样 + +how is +如何,还好吗,好吗 + +third +三日,三,第 + +too much +太多的,太多了 + +think +想着,想,动脑筋 + +first +第一位,先往,第一名 + +wednesday +星期三,礼拜三,周三 + +birthday +生日 + +march +三月份,行进,行走 + +March +三月,三月份,3月 + +July +七月,七月份,7月 + +party +聚会,派对 + +pay for +付 + +how much money +多少钱 + +money +钱 + +me +我,自我,我别 + +help +人手,助,帮个 + +sit +坐,坐下 + +wait for +等,等一下 + +sure +当然,很确定,百分之百 + +twenty +20,二十分,二十只 + +plate +盘子,盘,碗盘 + +mind +理会,内心,心思 + +what kind of +哪一类的,哪种,什么样的 + +no, thanks +不,谢谢 + +yes, please +是的,请 + +help you +帮助,帮,帮助你 + +how are you +你好吗,你们好吗,你过得好吗 + +good afternoon +下午好 + +can't +不能,没法,就不能 + +well +做得很好,很好,好好 + +learn to +学 + +very well +得非常好,得非常清楚,非常 + +learn +会得,学得,课学得 + +piano +钢琴 + +guitar +吉他,六弦琴 + +cannot +不得,做不了,不成 + +dance +舞蹈,过舞,舞会 + +swim +泳,游,游泳 + +can +行不行,时能,會 + +ride +骑过,搭过,人载 + +drive +动力,驾车,野心 + +bike +骑自行车,脚踏车,自行车 + +factories +工厂,厂 + +visit +看望,光顾,串个 + +places +地方,哪些地方 + +meats +肉类 + +place +處,摆放,坛 + +in front of +在前面,前面 + +which +哪张,哪個,哪本 + +behind +behind,身后,在后面 + +hide +躲藏,埋,躲 + +lunch +午饭,午,午餐 + +dinner +吃晚饭,晚饭,晚宴 + +make +造出,取得,交 + +kind of +类 + +food +食品,东西,粮 + +would like to +想要 + +beef +牛肉,牛 + +nine +九,九个,九位 + +nineteen +十九 + +eighteen +十八 + +women +女人,妇女,女人们 + +when +的时候,时为,何时 + +how old are +多大 + +eight +八 + +men +男人,guys,男人们 + +hair +头发,发 + +brown +棕色,棕色的,棕 + +eye +眼,目,盯 + +grandpa +爷爷,外公,爷 + +watches +观赏,手表,看 + +grandma +奶奶,姥姥,外婆 + +bed +床位,病床,小床 + +washes +洗,清洗,洗碗 + +teaches +教我如何,教会,教书 + +face +脸 + +wash +洗 + +often +经常 + +live +生存,不住,我住 + +hand +手上,手,手们 + +open +打开,公海,揭开 + +clothes +衣服,衣物,服装 + +hundred +百 + +now +现在 + +clothes store +服装店 + +store +储存,店铺,存入 + +seventeen +十七 + +different +不同的 + +t-shirt +T恤衫,短袖 + +how much are +多少钱 + +how +如何,多,的方式 + +both +双,两样,两家 + +yuan +元,块,块钱 + +seven +七 + +how much is +多少钱 + +wants to +想 + +sixteen +十六 + +those +那些,那条,那片 + +jeans +牛仔裤 + +skirt +短裙,裙子,裙 + +dresses +洋装,礼服,连衣裙 + +six +六 + +want to +想要,想 + +buy +买冰,买下来,买昂 + +go shopping +去购物 + +guy +男人,guys,人 + +Saturday +周六,礼拜六,星期六 + +what is +是什么 + +closed +关门,封闭,售 + +last +上一个,最后一座,撑 + +last name +姓氏,姓 + +late +迟到,behind,晚点了 + +first name +名字 + +go +进行,坐,出发 + +port +港口,港 + +ticket office +售票处 + +hotel +旅馆,酒店,宾馆 + +need to +需要 + +bus +公交车,公共汽车,公车 + +passport +护照,通行证 + +right +权利,没错,正确的 + +right here +就在这里 + +ticket +门票,火车票,票 + +plane +飞机,层面 + +over +头顶,整个都,为了 + +where is +在哪里 + +over there +在那里 + +to +为了,而言,來 + +taxi +出租车,计程车,的士 + +bathroom +浴室,卫生间,洗手间 + +subway +地铁,地下铁 + +the +这只,这瓶,这个 + +station +铁,进驻,岗位 + +airport +机场,飞机场 + +train +火车,列车,培养 + +speaks +说,讲话,说得 + +usually +平时,经常 + +fine +大好,很好,没 + +time +時間,times,時候 + +sometimes +有的时候,有时候 + +uses +用,他用,使用 + +at school +在学校,学校里 + +doesn't +不,没,不像 + +cooks +烹饪,煮,烹调 + +cook +厨师,烹饪,饪 + +music +音乐 + +sing +唱过,唱,唱个 + +draw +平局,画画,提取 + +tv +电视机,电视,视 + +evening +晚上,傍晚,黄昏 + +does not +不 + +movie +故事片,电影,影 + +noodle +面 + +every +每座,每道,每天 + +baseball +棒球 + +does +吗,有,打 + +tennis +网球 + +basketball +篮球 + +lead +领先,头绪,指引 + +likes to +喜欢 + +like to +喜欢 + +play +吹得,地玩,放过 + +read +读,读归读,阅 + +seeds +种子,花种 + +a glass of +一杯 + +needs +必须,要,需要 + +potato +土豆,薯,土 + +tomato +西红柿,柿子,番茄 + +soup +汤 + +sandwiches +三明治,三文治 + +fruit +果实,成果,果 + +vegetable +蔬菜,蔬 + +never +从来不 + +pets +宠物,宠物们 + +eats +吃,吃饭,吃得 + +drinks +饮料,喝牛奶,喝酒 + +wants +想让,想,想要 + +egg +鸡蛋,蛋,雞 + +mice +老鼠,鼠 + +noodles +面条,面,面点 + +bread +面包 + +want +想让,想,想要 + +some +某个,某项,少量 + +likes +喜欢,很喜欢 + +rice +米饭,米,大米 + +eat +吃,食用 + +link +串起,网址,係 + +breakfast +早饭,早餐,早点 + +every day +每天 + +apple +苹果,苹 + +use +用,使用 + +the internet +互联网 + +city +城市,市,都市 + +in +里面,用,丁里 + +Sunday +周日,星期日,礼拜天 + +sun +阳光,恒星,太阳 + +Monday +周一,礼拜一,星期一 + +Tuesday +周二,星期二,礼拜二 + +on +用,之上,in + +university +大学 + +teach +教,教书 + +at work +在工作时,上班时,上班 + +study +调研,求学,我念 + +tonight +今天晚上,今晚,今夜 + +beach +海滩,沙滩,沙地 + +lot +很多,大堆 + +rank +伍,秩,品位 + +a lot of +很多,许多 + +job +工作 + +bank +银行 + +meeting +会晤,集会,會 + +office +處,机关,一职 + +nice to meet you +很高兴认识你 + +my name is +我名字叫,我叫,我的名字是 + +what do you do +你是做什么工作的 + +together +一起 + +work +某项,见效,干上 + +hospital +医院 + +stand +时站,主张,坛 + +game +游戏,手游,戏 + +email +电子邮件 + +understand +会得,体谅,学得 + +name +取名,名,call + +pet +宠物,宠,条狗 + +phone number +电话号码 + +sorry +抱歉,内疚,不起 + +no problem +没问题,没关系 + +address +地址,住址 + +know +知道,知不知道,识 + +cut +划伤,切了,刀割 + +spanish +西班牙的,西班牙人,西班牙语 + +but +但别,但,却 + +year +1年,年,一年 + +don't +并不,但别,别 + +language +文,语言,语 + +do not +不,别,没有 + +live in +住在 + +japan +日本 + +country +国家 + +do +干上,干吗,搞 + +bad +坏的,很糟,恶劣 + +sunny +阳光灿烂,晴朗的,晴 + +funny +有意思的,逗,好玩的 + +they're +他们是,她们是,它们是 + +that +那门,那幅,那枚 + +little +点,小,少得 + +love +love,i,疼爱 + +busy +忙碌的,很忙,很热闹的 + +dad +父亲,爸爸,我爸 + +mom +我妈,mom,妈妈 + +ok +好起来,没关系,还好 + +always +总是,永远,一直 + +family +家庭,家族,家 + +happy +很乐意,欢快,美满 + +best +最棒的,最出色,最强 + +friends +guys,老友记,老朋友 + +here +这里,这儿 + +where +哪里,从哪里,在哪里 + +person +者,人比,人 + +friendly +友好 + +parent +父母 + +favorite +最喜欢的,至爱的,最喜爱的 + +color +颜色,色,色彩 + +beautiful +美妙,优美的,如画 + +orange +橘子,橘黄色,橘 + +dress +连衣裙,裙子,长裙 + +too +时太,也,过于 + +really +真的,家真,真令人 + +song +歌,英语歌,首 + +pants +皮裤,裤子,裤 + +shoes +鞋子,鞋,好鞋 + +one hundred +一百 + +shoe +鞋子,鞋 + +cell phone +手机 + +very +蛮,不得了,极有 + +very much +非常 + +that's +那是,那就是,那个是 + +you're welcome +不客气,不用谢,别客气 + +key +键,button,关键 + +bar +bars,横线,吧台 + +old +旧得,old,陈 + +except +除,除了,只是 + +car +车厢,轿车,小轿车 + +important +重要的 + +cool +酷,冰凉,炫酷 + +exact +精确的,确切 + +questions +题目,问题,题 + +question +问题,疑问,提问 + +many +多家,没少,很多都 + +school +学校,学院 + +pass +关卡,及格,通没 + +class +舱,课堂,物理课 + +glass +玻璃杯,璃,杯 + +difficult +很难的 + +that is +那是 + +has +家有,有床,艾玛有 + +exam +考试 + +exams +考试,英语考试 + +easy +简易,易,容易 + +today +今天,今日 + +have +进行,患有,家有 + +an +一辆,个,一张 + +these +这几,这,这些 + +cups of +杯 + +beers +啤酒 + +pizzas +比萨 + +of +给,从,上 + +cheers +干杯,干,举杯 + +beer +啤酒,麦酒 + +goodbye +再见,再会,拜 + +with +用,配,带 + +would +将要,会,想 + +milk +牛奶,奶,牛乳 + +a cup of +一杯 + +sugar +糖,白砂糖,白糖 + +pizza +比萨,披萨,披萨饼 + +would like +想,要,想要 + +this is +这是 + +thank you +谢谢,谢谢你,多谢 + +welcome to +欢迎到,欢迎来到,欢迎来 + +restaurant +餐厅,餐馆,火锅店 + +table +桌子,餐桌,桌 + +for two +两人用 + +check +查,查看,查证 + +menu +菜单,餐单,餐牌 + +for +为贵,为了,而言 + +for one +单人用 + +how old +多大,几岁,多大了 + +daughter +女儿,闺女,姑娘 + +five +五,五个,五位 + +years old +岁,周岁 + +dear +亲密,亲爱的,贵得 + +four +四,四个,四位 + +son +儿子,儿 + +smart +聪明 + +life +人生,生命,生活 + +rich +有钱 + +tall +个子高,高大,高的 + +wife +妻子,老婆,太太 + +husband +丈夫,老公,先生 + +his +他的,他 + +girlfriend +女朋友,女友 + +brother +弟弟,哥哥,兄弟 + +boyfriend +男朋友,男友 + +sister +姐姐,妹妹,姊 + +he's +他,他在,他是 + +her +她的,她 + +three +三,3,仨 + +lots +很多 + +coats +外套,大衣 + +two +二,两,2 + +shirts +衬衫 + +hats +帽子 + +how much +多少,多少钱,多少呢 + +ten +十,10 + +one +一,1,壹 + +dollars +美元,元,美圆 + +much +大,远远,高得 + +dollar +美元,美金,美圆 + +sat +坐,SAT + +hat +帽子,帽,礼帽 + +expensive +贵 + +jacket +夹克,夹衣,套子 + +need +需要,要,必须 + +welcome +迎来,客气,欢 + +bird +鸟儿,禽类,bird + +shirt +衬衫 + +friend +朋友,友人,好友 + +taxi driver +出租车司机 + +lock +锁上,锁,门锁 + +doctor +医生,大夫,医师 + +oh +哎,噢,呐 + +bath +泡澡,澡,洗澡 + +math +数学,算数,算术 + +chicken +chicken,鸡,鸡肉 + +cheese +芝士 + +i'd like +我想要 + +chair +皮椅,椅,主席 + +pay +交,掏钱,工资 + +afternoon +下午,午后 + +have a nice day +祝你有美好的一天 + +would you like +你想要,你想要吗,你想不想 + +sandwich +三明治,三文治,夹心面包 + +morning +早辰,上午,早 + +pork +夹猪肉的,猪肉,夹猪肉 + +salad +沙拉 + +bye +拜,再见,再会 + +hi +嗨 + +please +谢谢,请,劳驾 + +sea +海边,大海,海 + +a little +点,一点点,一点 + +speak +讲个,说话,要说 + +good +挺不错,很好,不错的 + +chinese +汉,普通话,华文 + +land +地落,空地,大地 + +meat +夹肉,肉类,肉 + +from +离开,距离,從 + +nice +亲切,很愉快,很好 + +new +新来的,新奇,新任 + +at +in,从,上 + +excuse me +打扰一下,不好意思,请问 + +wall +墙壁,面墙,壁 + +camera +照相机 + +not +不,不是,并非 + +wallet +钱包 + +no +不,没有 + +watch +照,收看,手表 + +coat +外套,大衣,上衣 + +road +道路,马路,山路 + +thanks +谢谢,感谢,致谢 + +this +这只,这瓶,这支 + +by +不迟于,用,之前 + +bag +皮包,包来,包了 + +look +毛色,神情,妆容 + +yes +没错,好,好的 + +he +他 + +she +她 + +woman +女人 + +are +家有,羊是,排是 + +man +男人,男子,20 + +good evening +晚上好 + +good morning +早上好,早安 + +a +一辆,个,一款 + +hello +嗨,哈喽,喂 + +am +排是,吗,很 + +girl +女孩子 + +boy +男孩子 + +short +矮的,稍微,矮 + +winter +冬天,冬季,冬日 + +is +排是,吗,词是 + +fall +秋天,秋季,秋日 + +spring +春天,春季,春日 + +summer +夏天,夏季,夏日 + +long +長,悠悠,很久 + +hot +热,烫 + +less +少点,更少的,更少 + +or +或,要么,要不然 + +cold +冷,冰 + +more +more,大,高得 + +coffee +咖啡 + +juice +果汁 + +water +水,清水,白水 + +drink +饮品,饮料,喝啤酒 + +tea +茶,茶水 + +we +我们 + +our +我们的 + +they +他们,她们 + +their +他们的,她们的 + +black +黑色,黑,墨色 + +blue +蓝色,蓝颜色,蓝 + +white +白色,白,雪白 + +red +红色,红,赤色 + +green +绿色,绿,青 + +computer +电脑,计算机 + +room +厅,房间,号房 + +phone +手机,电话,call + +big +上大,大,大的 + +house +房子,房屋,屋子 + +small +细小,小,迷你的 + +dog +狗,犬 + +cat +猫,猫咪 + +father +爸,神父,父 + +and +于是,而且,而 + +mother +我妈,老妈,姆 + +my +我的,咱的 + +teacher +教员,师父,指导老师 + +student +学生 + +your +你的,您的,你们的 + +book +书,书籍,书本 + +Chinese +中文 + +I +我,咱 + +English +英文,英语 + +like +喜欢,喜爱,爱 + +you +你""" + +def parse_words(raw): + entries = [] + lines = raw.strip().split('\n') + i = 0 + while i < len(lines): + word = lines[i].strip() + if not word: + i += 1 + continue + # 下一行是释义 + if i + 1 < len(lines): + meaning = lines[i + 1].strip() + else: + meaning = '' + # 取释义第一个(逗号前的部分)作为主释义 + meaning_clean = meaning.split(',')[0].split(',')[0].strip() + entries.append((word, meaning_clean)) + i += 2 + # 跳过空行 + while i < len(lines) and not lines[i].strip(): + i += 1 + return entries + +def main(): + if not DB_FILE.exists(): + print(f"❌ 数据库不存在:{DB_FILE}") + print(" 请确认 CiBird 已安装,数据库路径正确") + return + + entries = parse_words(RAW) + print(f"📖 解析到 {len(entries)} 个词条") + + conn = sqlite3.connect(DB_FILE) + conn.row_factory = sqlite3.Row + + # 获取已有单词(避免重复) + existing = set(row[0].lower() for row in conn.execute("SELECT word FROM words")) + print(f"📚 词库已有 {len(existing)} 个单词") + + added = 0 + skipped = 0 + for word, meaning in entries: + if word.lower() in existing: + skipped += 1 + continue + conn.execute( + "INSERT INTO words(word, meaning, phonetic, pos, examples, note) VALUES(?,?,?,?,?,?)", + (word, meaning, '', '', '[]', '') + ) + existing.add(word.lower()) + added += 1 + + conn.commit() + conn.close() + + print(f"\n✅ 导入完成!") + print(f" 新增:{added} 个") + print(f" 跳过(已存在):{skipped} 个") + print(f" 词库现有:{len(existing)} 个单词") + print(f"\n💡 提示:这些单词暂无例句,") + print(f" 点开任意单词 → 「重新造句」可让 AI 补充例句") + +if __name__ == '__main__': + main() diff --git a/index.html b/index.html new file mode 100644 index 0000000..928d42d --- /dev/null +++ b/index.html @@ -0,0 +1,1166 @@ + + + + + + + + + +CiBird | 词鸟 + + + + + + + + + + + + +
+
+
+
CiBird
+
词鸟 · 你的私人英语词库
+
v2.0 · AI造句
+
+
+
专攻推特 · 游戏 · 日常生存英语
住在你自己的服务器,数据永远是你的
+
+
+ +
👁
+
+ +
+
+
🔒 数据存储在你自己的 VPS
+
+ + +
+
+ + +
+
+
🦜 词鸟
+
+ +
+
+
+ +
+
今日金句
+
+
加载中…
+
+
+
🦜
+
+ + +
+
+
📅 每日打卡
+
+
+
0
+
已学单词总数
+
+ +
+
+
+ + +
+
+
词库
+
+ 0 词 +
+
+
+ ALL + ABCDEFGHIJKLMNOPQRSTUVWXYZ +
+
+ +
+
+ +
+ + +
+
+
练习
+
互动
+
+ + +
+
🕐 时间
+
🔢 数字
+
🌍 国家
+
📅 月
+
📆 周
+
🐾 动物
+
🍽️ 食物
+
💼 职业
+
+ + +
+
+
+
+
+
:
+
+
+
+
+
+
+
+
选择时间后自动生成
+
+
+
🔊
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + +
+ + +
+
+
+ +
+ 词库 +
+
+
+
+ + + +
+
+
+
+
中文释义
+
+
+
+
例句
+
+
+
+
我的笔记
+ +
+
+
+ + + +
+
+ + +
+
+
+
+
✦ 添加单词
+ +
+
+
+
+ + +
+ +
+ +
+
释义
+
+
+
音标
+
词性
+
+
+
例句①
+
例句②
+
+
+ + +
+
+
+ + +
+
+
+ +
+ + + + diff --git a/index_updated.html b/index_updated.html new file mode 100644 index 0000000..00d9f3a --- /dev/null +++ b/index_updated.html @@ -0,0 +1,145 @@ + + + + + + + +CiBird | 词鸟 + + + + +
+
+

🦜 CiBird

+

你的私人词库

+ + +
+
+ + +
+
+ 我的词库 + +
+ +
+ +
+ + +
+ + + + diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..9b92f6e --- /dev/null +++ b/install.sh @@ -0,0 +1,404 @@ +#!/bin/bash +# ══════════════════════════════════════════════════════════ +# CiBird 词鸟 安装脚本 +# 一键部署你的私人英语单词本 +# 项目地址:https://github.com/zhangyang-games/cibird +# ══════════════════════════════════════════════════════════ + +set -e + +# ── 颜色 ────────────────────────────────────────────────── +GREEN='\033[0;32m' +BLUE='\033[0;34m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +REPO_RAW="https://raw.githubusercontent.com/zhangyang-games/cibird/main" +INSTALL_DIR="$HOME/cibird" + +# ── Banner ──────────────────────────────────────────────── +print_banner() { + clear + echo "" + echo -e "${BOLD}${CYAN}" + echo " ██████╗██╗██████╗ ██╗██████╗ ██████╗" + echo " ██╔════╝██║██╔══██╗██║██╔══██╗██╔══██╗" + echo " ██║ ██║██████╔╝██║██████╔╝██║ ██║" + echo " ██║ ██║██╔══██╗██║██╔══██╗██║ ██║" + echo " ╚██████╗██║██████╔╝██║██║ ██║██████╔╝" + echo " ╚═════╝╚═╝╚═════╝ ╚═╝╚═╝ ╚═╝╚═════╝" + echo -e "${NC}" + echo -e "${BOLD} ┌─────────────────────────────────────────────┐${NC}" + echo -e "${BOLD} │ 🦜 CiBird 词鸟 · 你的私人英语单词本 │${NC}" + echo -e "${DIM} │ AI造句 · 发音 · 推特/游戏英语场景 │${NC}" + echo -e "${BOLD} └─────────────────────────────────────────────┘${NC}" + echo "" +} + +# ── 步骤提示 ────────────────────────────────────────────── +step() { echo -e "\n${BOLD}${CYAN}[$1]${NC} $2"; } +ok() { echo -e " ${GREEN}✓${NC} $1"; } +err() { echo -e " ${RED}✗ 错误:${NC}$1"; exit 1; } +info() { echo -e " ${DIM}$1${NC}"; } +ask() { echo -e " ${YELLOW}→${NC} $1"; } + +# ── 0. 检查基础依赖 ──────────────────────────────────────── +check_deps() { + step "0/6" "检查系统环境" + + for cmd in curl python3; do + if ! command -v $cmd &>/dev/null; then + info "正在安装 $cmd ..." + if command -v apt-get &>/dev/null; then + apt-get update -qq && apt-get install -y $cmd -qq + elif command -v apk &>/dev/null; then + apk add --no-cache $cmd + elif command -v yum &>/dev/null; then + yum install -y $cmd + else + err "请手动安装 $cmd 后重试" + fi + fi + ok "$cmd 已就绪" + done +} + +# ── 1. 安装 Python 依赖 ──────────────────────────────────── +install_python_deps() { + step "1/6" "安装 Python 依赖包" + info "需要安装:fastapi uvicorn httpx" + + # 判断是否需要 --break-system-packages(Ubuntu 22+) + BREAK_SYS="" + if python3 -c "import sys; exit(0 if sys.version_info>=(3,11) else 1)" 2>/dev/null; then + BREAK_SYS="--break-system-packages" + fi + # 另一种判断:pip 报 externally-managed + if pip3 install --help 2>&1 | grep -q 'break-system'; then + BREAK_SYS="--break-system-packages" + fi + + python3 -m pip install --quiet fastapi uvicorn[standard] httpx $BREAK_SYS 2>/dev/null \ + || pip3 install --quiet fastapi uvicorn[standard] httpx $BREAK_SYS 2>/dev/null \ + || err "pip 安装失败,请手动执行:pip3 install fastapi uvicorn httpx" + + ok "Python 依赖安装完成" +} + +# ── 2. 下载项目文件 ──────────────────────────────────────── +download_files() { + step "2/6" "下载 CiBird 项目文件" + mkdir -p "$INSTALL_DIR" + + for f in server.py index.html; do + info "下载 $f ..." + curl -fsSL "$REPO_RAW/$f" -o "$INSTALL_DIR/$f" \ + || err "下载 $f 失败,请检查网络或 GitHub 地址" + ok "$f 已下载" + done +} + +# ── 3. 选择 AI 服务商 ────────────────────────────────────── +choose_provider() { + step "3/6" "选择 AI 服务商" + echo "" + echo -e " ${BOLD}请选择你要使用的 AI 服务商:${NC}" + echo "" + echo -e " ${GREEN}1)${NC} Google Gemini ${DIM}← 免费额度大,推荐新手${NC}" + echo -e " ${GREEN}2)${NC} DeepSeek ${DIM}← 国产之光,便宜效果好${NC}" + echo -e " ${GREEN}3)${NC} Groq ${DIM}← 速度极快,免费${NC}" + echo -e " ${GREEN}4)${NC} OpenRouter ${DIM}← 一个Key用几十种模型${NC}" + echo -e " ${GREEN}5)${NC} Claude ${DIM}← Anthropic,你有付费Key${NC}" + echo -e " ${GREEN}6)${NC} OpenAI ${DIM}← ChatGPT 同款${NC}" + echo "" + read -p " 👉 输入编号 [1-6]:" PROVIDER_CHOICE + + case "$PROVIDER_CHOICE" in + 1) + PROVIDER="gemini" + MODEL="gemini-2.0-flash" + info "获取 Key:https://aistudio.google.com/apikey" + ;; + 2) + PROVIDER="deepseek" + MODEL="deepseek-chat" + info "获取 Key:https://platform.deepseek.com" + ;; + 3) + PROVIDER="groq" + MODEL="llama-3.1-8b-instant" + info "获取 Key:https://console.groq.com" + ;; + 4) + PROVIDER="openrouter" + MODEL="google/gemini-flash-1.5" + info "获取 Key:https://openrouter.ai" + ;; + 5) + PROVIDER="claude" + MODEL="claude-haiku-4-5-20251001" + info "获取 Key:https://console.anthropic.com" + ;; + 6) + PROVIDER="openai" + MODEL="gpt-4o-mini" + info "获取 Key:https://platform.openai.com" + ;; + *) + err "无效选择,请输入 1-6" + ;; + esac + + ok "已选择:$PROVIDER(模型:$MODEL)" + + echo "" + read -p " 👉 请粘贴你的 API Key:" API_KEY + [ -z "$API_KEY" ] && err "API Key 不能为空" + ok "API Key 已录入" + + echo "" + echo -e " ${DIM}💡 如果你想用其他模型,可以直接改默认值,也可以回车使用默认${NC}" + read -p " 👉 模型名称(默认 $MODEL,直接回车跳过):" MODEL_INPUT + [ -n "$MODEL_INPUT" ] && MODEL="$MODEL_INPUT" + ok "模型:$MODEL" +} + +# ── 4. 设置访问密码 ──────────────────────────────────────── +setup_auth() { + step "4/6" "设置登录账号" + + echo "" + read -p " 👉 用户名(默认 admin,回车跳过):" USERNAME + [ -z "$USERNAME" ] && USERNAME="admin" + ok "用户名:$USERNAME" + + echo "" + while true; do + read -s -p " 👉 设置登录密码(至少6位):" PASSWORD + echo "" + [ ${#PASSWORD} -ge 6 ] && break + echo -e " ${RED}密码太短,请至少6位!${NC}" + done + read -s -p " 👉 再次确认密码:" PASSWORD2 + echo "" + [ "$PASSWORD" != "$PASSWORD2" ] && err "两次密码不一致" + ok "密码已设置" + + echo "" + read -p " 👉 访问端口(默认 8848,回车跳过):" PORT + [ -z "$PORT" ] && PORT="8848" + ok "端口:$PORT" + + # 生成密码 hash + PASSWORD_HASH=$(python3 -c "import hashlib; print(hashlib.sha256('$PASSWORD'.encode()).hexdigest())") +} + +# ── 5. 写入配置 ──────────────────────────────────────────── +write_config() { + step "5/6" "写入配置文件" + + cat > "$INSTALL_DIR/config.json" </dev/null && info "已停止旧进程 (PID $OLD_PID)" || true + rm -f "$INSTALL_DIR/cibird.pid" + fi + # 也搜一下 + pkill -f "server.py" 2>/dev/null || true + sleep 1 + + # 初始化数据库 + cd "$INSTALL_DIR" + python3 -c " +import sys; sys.path.insert(0,'.') +from server import init_db +init_db() +print(' DB 初始化完成') +" + # 后台启动 + nohup python3 "$INSTALL_DIR/server.py" >> "$INSTALL_DIR/cibird.log" 2>&1 & + echo $! > "$INSTALL_DIR/cibird.pid" + sleep 2 + + # 验证是否启动成功 + if kill -0 $(cat "$INSTALL_DIR/cibird.pid") 2>/dev/null; then + ok "服务启动成功!(PID $(cat $INSTALL_DIR/cibird.pid))" + else + err "服务启动失败,查看日志:cat $INSTALL_DIR/cibird.log" + fi +} + +# ── 写入快捷命令 ─────────────────────────────────────────── +write_shortcut() { + SHORTCUT="/usr/local/bin/cibird" + cat > "$SHORTCUT" <<'SCRIPT' +#!/bin/bash +INSTALL_DIR="$HOME/cibird" +GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m' +CYAN='\033[0;36m'; BOLD='\033[1m'; DIM='\033[2m'; NC='\033[0m' + +get_pid() { [ -f "$INSTALL_DIR/cibird.pid" ] && cat "$INSTALL_DIR/cibird.pid" || echo ""; } +is_running() { PID=$(get_pid); [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; } +get_port() { python3 -c "import json; print(json.load(open('$INSTALL_DIR/config.json'))['port'])" 2>/dev/null || echo "8848"; } + +case "$1" in + start) + if is_running; then + echo -e " ${YELLOW}词鸟已经在运行中${NC}" + else + cd "$INSTALL_DIR" + nohup python3 server.py >> cibird.log 2>&1 & + echo $! > cibird.pid + sleep 1 + echo -e " ${GREEN}✓ 词鸟已启动${NC} 访问 http://$(curl -s ifconfig.me 2>/dev/null || echo '你的IP'):$(get_port)" + fi + ;; + stop) + PID=$(get_pid) + [ -n "$PID" ] && kill "$PID" 2>/dev/null && echo -e " ${GREEN}✓ 词鸟已停止${NC}" || echo -e " ${DIM}没有运行中的词鸟${NC}" + rm -f "$INSTALL_DIR/cibird.pid" + ;; + restart) + $0 stop; sleep 1; $0 start + ;; + log) + tail -f "$INSTALL_DIR/cibird.log" + ;; + status) + PORT=$(get_port) + if is_running; then + echo -e " ${GREEN}● 词鸟运行中${NC} PID $(get_pid)" + echo -e " ${DIM}访问地址:http://$(curl -s ifconfig.me 2>/dev/null || echo '你的IP'):$PORT${NC}" + else + echo -e " ${RED}○ 词鸟未运行${NC}" + fi + ;; + *) + echo "" + echo -e " ${BOLD}🦜 CiBird 词鸟 管理命令${NC}" + echo "" + PORT=$(get_port) + if is_running; then + echo -e " ${GREEN}● 状态:运行中${NC} PID $(get_pid)" + else + echo -e " ${RED}○ 状态:未运行${NC}" + fi + echo -e " ${DIM}访问地址:http://你的IP:$PORT${NC}" + echo "" + echo -e " ${CYAN}cibird start${NC} 启动" + echo -e " ${CYAN}cibird stop${NC} 停止" + echo -e " ${CYAN}cibird restart${NC} 重启" + echo -e " ${CYAN}cibird status${NC} 查看状态" + echo -e " ${CYAN}cibird log${NC} 查看日志" + echo "" + ;; +esac +SCRIPT + chmod +x "$SHORTCUT" 2>/dev/null || true + ok "快捷命令 cibird 已安装(可用 cibird start/stop/status)" +} + +# ── 获取公网 IP ──────────────────────────────────────────── +get_public_ip() { + PUBLIC_IP=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null \ + || curl -s --connect-timeout 5 api.ipify.org 2>/dev/null \ + || echo "你的VPS公网IP") +} + + +# ── 导入单词 ─────────────────────────────────────────────── +import_words() { + echo "" + echo -e " ${BOLD}📖 导入多邻国单词本${NC}" + echo -e " ${DIM}从 GitHub 拉取 words.txt 导入到词库${NC}" + echo "" + WORDS_URL="https://raw.githubusercontent.com/zhangyang-games/cibird/main/words.txt" + curl -sL "$WORDS_URL" | python3 -c " +import sys,sqlite3,pathlib +DB=pathlib.Path.home()/'cibird/cibird.db' +if not DB.exists(): print(' 找不到数据库'); exit(1) +words=[l.strip().split('|',1) for l in sys.stdin if '|' in l] +conn=sqlite3.connect(DB) +existing=set(r[0].lower() for r in conn.execute('SELECT word FROM words')) +added=skipped=0 +for w in words: + if len(w)!=2: continue + word,meaning=w + if word.lower() in existing: skipped+=1; continue + conn.execute('INSERT INTO words(word,meaning,phonetic,pos,examples,note) VALUES(?,?,?,?,?,?)',(word,meaning,'','','[]','')) + existing.add(word.lower()); added+=1 +conn.commit(); conn.close() +print(f' ✓ 导入完成!新增 {added} 个,跳过 {skipped} 个') +" || echo -e " ${RED}✗ 导入失败,请检查网络${NC}" +} +# ═══════════════════════════════════════════════════════════ +# MAIN +# ═══════════════════════════════════════════════════════════ +print_banner + +echo -e " 欢迎!这个脚本会帮你在 VPS 上部署 CiBird 词鸟。" +echo -e " ${DIM}整个过程大约需要 2-3 分钟,请跟着提示一步步来。${NC}" +echo "" +read -p " 按回车键开始安装,Ctrl+C 取消..." _ + +check_deps +install_python_deps +download_files +choose_provider +setup_auth +write_config +start_service +write_shortcut +get_public_ip + +# ── 可选:导入单词 ───────────────────────────────────────── +echo "" +read -p " 👉 是否导入你的多邻国单词本?(输入 y 导入,回车跳过):" IMPORT_CHOICE +if [ "$IMPORT_CHOICE" = "y" ] || [ "$IMPORT_CHOICE" = "Y" ]; then + import_words +fi + +# ── 完成提示 ────────────────────────────────────────────── +echo "" +echo -e "${BOLD}${GREEN}" +echo " ┌──────────────────────────────────────────────┐" +echo " │ 🎉 CiBird 词鸟安装完成! │" +echo " └──────────────────────────────────────────────┘" +echo -e "${NC}" +echo -e " ${BOLD}🌐 访问地址:${CYAN}http://$PUBLIC_IP:$PORT${NC}" +echo -e " ${BOLD}👤 用户名:${NC}$USERNAME" +echo -e " ${BOLD}🔑 密码:${NC}你刚才设置的密码" +echo "" +echo -e " ${DIM}💡 管理命令:${NC}" +echo -e " ${DIM} cibird 查看状态${NC}" +echo -e " ${DIM} cibird stop 停止服务${NC}" +echo -e " ${DIM} cibird start 启动服务${NC}" +echo -e " ${DIM} cibird log 查看日志(排查问题用)${NC}" +echo "" +echo -e " ${DIM}⚠️ 如果访问不了,请确认防火墙已开放 $PORT 端口${NC}" +echo -e " ${DIM} Oracle Cloud 需要在安全列表里手动添加规则${NC}" +echo "" +echo -e " ${BOLD}展翅高飞!🦜${NC}" +echo ""