From 99549c52fc50000b284d33a5ed19e7f2bf93735e Mon Sep 17 00:00:00 2001 From: FedoraLinux Date: Thu, 19 May 2022 19:12:03 +0800 Subject: [PATCH] =?UTF-8?q?2022-05-19=20=E4=BF=AE=E5=A4=8D=E6=94=B9?= =?UTF-8?q?=E7=94=A8wss=E5=8D=8F=E8=AE=AE=E5=90=8E=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 ++++ config/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 145 bytes config/__pycache__/helper.cpython-38.pyc | Bin 0 -> 475 bytes messages/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 147 bytes messages/__pycache__/base.cpython-38.pyc | Bin 0 -> 1846 bytes messages/__pycache__/chat.cpython-38.pyc | Bin 0 -> 940 bytes messages/__pycache__/gift.cpython-38.pyc | Bin 0 -> 1138 bytes messages/__pycache__/like.cpython-38.pyc | Bin 0 -> 988 bytes messages/__pycache__/member.cpython-38.pyc | Bin 0 -> 1057 bytes .../__pycache__/roomuserseq.cpython-38.pyc | Bin 0 -> 1189 bytes messages/__pycache__/social.cpython-38.pyc | Bin 0 -> 945 bytes messages/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2207 bytes messages/utils.py | 12 ++++--- protobuf/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 147 bytes .../__pycache__/message_pb2.cpython-38.pyc | Bin 0 -> 75281 bytes protobuf/__pycache__/wss_pb2.cpython-38.pyc | Bin 0 -> 1086 bytes protobuf/wss.proto | 14 ++++++++ protobuf/wss_pb2.py | 34 ++++++++++++++++++ scripts/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 146 bytes scripts/__pycache__/mitmproxy.cpython-38.pyc | Bin 0 -> 783 bytes scripts/__pycache__/watcher.cpython-38.pyc | Bin 0 -> 1526 bytes scripts/__pycache__/webdriver.cpython-38.pyc | Bin 0 -> 2065 bytes scripts/mitmproxy.py | 9 +++-- scripts/watcher.py | 3 +- scripts/webdriver.py | 5 +++ store/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 144 bytes store/__pycache__/mongo.cpython-38.pyc | Bin 0 -> 1526 bytes 27 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 config/__pycache__/__init__.cpython-38.pyc create mode 100644 config/__pycache__/helper.cpython-38.pyc create mode 100644 messages/__pycache__/__init__.cpython-38.pyc create mode 100644 messages/__pycache__/base.cpython-38.pyc create mode 100644 messages/__pycache__/chat.cpython-38.pyc create mode 100644 messages/__pycache__/gift.cpython-38.pyc create mode 100644 messages/__pycache__/like.cpython-38.pyc create mode 100644 messages/__pycache__/member.cpython-38.pyc create mode 100644 messages/__pycache__/roomuserseq.cpython-38.pyc create mode 100644 messages/__pycache__/social.cpython-38.pyc create mode 100644 messages/__pycache__/utils.cpython-38.pyc create mode 100644 protobuf/__pycache__/__init__.cpython-38.pyc create mode 100644 protobuf/__pycache__/message_pb2.cpython-38.pyc create mode 100644 protobuf/__pycache__/wss_pb2.cpython-38.pyc create mode 100644 protobuf/wss.proto create mode 100644 protobuf/wss_pb2.py create mode 100644 scripts/__pycache__/__init__.cpython-38.pyc create mode 100644 scripts/__pycache__/mitmproxy.cpython-38.pyc create mode 100644 scripts/__pycache__/watcher.cpython-38.pyc create mode 100644 scripts/__pycache__/webdriver.cpython-38.pyc create mode 100644 store/__pycache__/__init__.cpython-38.pyc create mode 100644 store/__pycache__/mongo.cpython-38.pyc diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b98b726 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "douyin", + "mitmproxy" + ] +} \ No newline at end of file diff --git a/config/__pycache__/__init__.cpython-38.pyc b/config/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e9ddf5baecd431a69faec6508cf088c6ae3f97b GIT binary patch literal 145 zcmWIL<>g`kf;T@~lR)%i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!GnmQ{>zr9wbu zNk)ENjFEwnk%4JUN`7f&W?p=GYEpboW?5=Xa(-S~W_nC~d}dx|NqoFsLFFwDo80`A O(wtN~ka?ehm;nIAIU*bY literal 0 HcmV?d00001 diff --git a/config/__pycache__/helper.cpython-38.pyc b/config/__pycache__/helper.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33ae2ff7bbbc0fed669839f9747d4f4b42609775 GIT binary patch literal 475 zcmYjN!AiqG5S`tuF-oI1y-BaVs1&`3h#-gu6}5;G0wL{gZOS$Yo2?S5r|MDs1;vxU zv{w%z_yc-!Hd^SwzL~eP``$3;zCRBbU*8Yy56thDOb11>i>Ig~aNtD3fCPltno1f_ z?r?Swfx~GF8Z)2x3L3<)lUVnTJC;qtDp{{RJjDTm22C^_lfLuJUSLc(S%y2%Gb2nb#ayVy zoN)@Rl=U}W6m=6RqR6;;tVF7f7q^Q{4z(~W%SCEf8KVG`_&1o}A4>VJLIZzdQArrm zeFNpA=+8!fD?BReC#CLXY1mwEHrF>po(;<+jc!CclF79QJ6YOIuEL&>xlpTlY23dX yX4l~&09m3nq871gFf*Iu0%g*!##VN3Ri`qXf(2|CZ+npOp%gm=Sz!fh#G}6{oO1#I literal 0 HcmV?d00001 diff --git a/messages/__pycache__/__init__.cpython-38.pyc b/messages/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6708204a2c1ee043c824460f8aad501526a28822 GIT binary patch literal 147 zcmWIL<>g`kf;T@~lR)%i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!GTmQ{>zr9wbu zNk)ENjFEwnk%4JUN`7f&W?p=GYEpboW?5=XZfbFHVtQ(EOniK1US>&ryk0@&Ee@O9 Q{FKt1R6CG~pMjVG02B%%00000 literal 0 HcmV?d00001 diff --git a/messages/__pycache__/base.cpython-38.pyc b/messages/__pycache__/base.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0835db36777917761798c2456267e284abc35f GIT binary patch literal 1846 zcmZt{%WfP+u)F8EvkyDQ@grO;OGsG+R%8)`5Q_BGK)m2?x&#tQds@;wVe1H7; z4Sok5WWP&I$WtwJUJAgYr*+k@d%BiL`B_~Z=lu+C-u@U6d$80;00fCCCo$tRb~xkC za}vAU1K(6S7PHlKS za!vQU%!GNRbXsM?EImu55?{!=>}i=-ePFsu6vrkQrlX=x`8APE(DT;^gO3lNj<%kS z^hsSE?mpPveem#**Jq==O1>9INs)gi4ojg_+865Z2t3;vj!aVtoy;|%8fBfO<7ISx z=N2=gz+HTZ1!$*Kw9T!parCf#JQGfl2^xd2k3>pC2Q}7 z_dj$0CT#JK4)jGEI;C{S3=sUz3Wi5GO-8ULc$CApvza^+0P z1)DHVP8;%MLa(5B@T~#!xHn+~KZmzh$O({w6~b!3in#xBao2?~n}gP%ZDnV8XMVN> zR+gtk-?>_ulEGU%;Nee{H(t6I&fM6$b+s8y?J#Hb)n2dc!&%42ls${Ln?M)Parlr zg@QSlJyL5w_Dbx-I1p8OR0wWZUD=l~EazQUu0obgpiXM3pKudad3IW*r7(V9R9r}j zwFh<9Eb~m(Nk{?=jrGT#FauYfCkkdJ?WtpO8>!ZZBGoG$_Ix>M2!y<*=_s@nnyNpwaO5(6EjnB_B zF|>|&Ll_6zG@zR@ag=7KCYtLM=ULaY%@=zLN8K#74y4CW@t+1T;UW>}w%P+g=n8e2 zPkk2BkVb5ox{KedFj%&yKJC2ngAmRcasT$+7VWSO$gR+AHg4PgS?GPOhhCc;m~reF zJ2z&2y`e=-kR(dWB>5DsFXlzdnwT@X4HG5_R!EYVC`rnipB0F=lH}X7w3u;bgP;vc zY%Xn5@R7i!)WuXHB<6Miyt`Vl5bg=h|DQH!bc3t0eRg zu%5O5L2?l6zqHpNDEJTP$@g{>Sy3O%oA>5@{ob4Ryw%z!K;M77AAX{QtWc?v3Cal^ zeGE(xK||u=%|aS6mr<0B(1=Xeq~r+^rl?&KQIqC7!>tK=Mx6RLh$MZ7<~xzp+IuPa zWY_`KeC%oIqp?a1loL4mJ}^mKDu~Mj73`9@hA@N)HxvhV)c>{82EJNt*b_MI< z#^L{t>feC>lPu)%k?itkUizffYKVzl=_z|jf{oGr*x7ueucfHK_qiar)pG4TVdjRA&LtB@1NZ? zI0t{uTi~#1<5snewY~4u@lS9@oaft|M~TQnl$)Ht&b+X+C>%#w?IudN0TqS=EY<}F ztC3mMGAyHbbLwgjUUF-qk~A4+qhh=A)@C;jhp_X?*rceWEvgisV?8W!J;LoR3$P|_ FvR_U)(zE~o literal 0 HcmV?d00001 diff --git a/messages/__pycache__/gift.cpython-38.pyc b/messages/__pycache__/gift.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bab22655ee70c9cc39437b5d53f7140a5ba2825 GIT binary patch literal 1138 zcmZuwPiqrV5P$FOCfTHEp;)bmNG~}o*ib^f6cMq9>Y+gh9$W&C&CW~Ruz%XO8#See ziuJB{4-I(fckq+EYY$TJ3n&QAY!X~)-?B6F-kY8I{bpugEiX41uAjd?4FbW~C2h*f z#?4cFvuzZ>fJe+DEg~KZPjIrW$ck;x=4_9F4V5zn6=i?4ybAChbE{YQCF{D}EX69z z`~xKq2OZqn&-_dUbXi^qVwUhB8j5)wm?waPIAfj#7TBmU2~<&6pau@=D%3Gi!z}HE z!+d|1B;ci}WK-Z>e6tl4IXmZ5cEY3p)?*jE>sp!|H1Rb~m}I%11nL4&W-1z9FkQ!s z-`k^|{{Cd+oj zl=WU2%>QoJ08!!s(0w#$B7mb5Q#KVK))C^lHD&8KAFkCsUTwYJY{i=`*l0c9Y3=W{ zdgCU3c6s{w>h!~pZ{IIZzqq!s^AHQ_WVs#|Ry|4sKO$4Fq4$k!YEq)Vl;p6WajQ&Y ze&2O#G)mMmDNRGlIE8UUc2mluu^-KD^b#ean#@w(C5xuFB&Y+$s8i94Zek}br{-A2 zsaw^z@xnNVI?dC;cv$=!W_dB$?E(I|+FArD1upUwBjY@t!Fxh&&nS;0n!G9g0zfPQ A-2eap literal 0 HcmV?d00001 diff --git a/messages/__pycache__/like.cpython-38.pyc b/messages/__pycache__/like.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f6268dd9ab065c557fac02c8274e922132856da GIT binary patch literal 988 zcmZuw&ui2`6rLZ+Hf?vSQn4T+J-CM)TFO!{MWpCK5AGrq4~B&yo5^an`B5{8vZaS& ztLRO=co0hW*n_uvPzwG7{spd3jK)O%Sl3zg~2{ zQ9_2eD4Pb0Wf*D^oFtO^#KM{RG+-8^h`G-L&C)2jL!>74Z6bA7+v1ik=?XC`$FP&M zOqxvwu2S|RSFCj!u+(nZ%5^YUHU^7j80s20msnI1i%BZkHnF(mQiBR0$XXz?2)`67i zPLzg8TmhV`E*$R9rn*ra*oknWFmb~KTV|x^a#_#6v@@zOO|I$+0DKBb!LtDwFw_D% z`GA~iTE9?#I9Ctm>TOFR%^fQW96#{I~#eT4Bj zVEAmS6t{hs%Qa0ZDkxn#bRfeawQ3_^h!8?Bz>=s^Vc-3syB10+qP zO0+w$Fmy=@Z>T5N3J@1Vapm$ki(eaYS5#wQht)WV$9sPY^R%;Rvw;H{Tg4Y^_0lCCkvBQ!Cms9PA55uR8KkI0n3N|-SvP?Xsm z+6PdrY(et?}b_w*WsGb zp#LwfNGbSJx(v3fS6!K}=+dL8{4LBWoM2hZosj!dm@oZyWhzg+O1r*<7OK^n$QiExzE({FSfGp=eQnd Lw(|s}jLYONyCeU* literal 0 HcmV?d00001 diff --git a/messages/__pycache__/roomuserseq.cpython-38.pyc b/messages/__pycache__/roomuserseq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20474b22a2642cb83d0bfb508c477388abd4c89c GIT binary patch literal 1189 zcmZ`&&1+LZ5Z~SRUhu`;8m8?ND*Ws{PtM3}-_CBl;Cicz)%Es=cUJKQA2 zJdH;^8HUbn$>*yDFwM(OC~J5)IDkYC@C+!Dl&K(PCa7Smq-+R7n6LtfNWf}|q_AO4 zh!Frv#p5@Fz?%!DD#?Y}9#)MG1VV(>$^thCWvcNbX z5vMgJU6)7=WiwU}l;=de7Wk3$qa$#+pPAD`*!=5#h!J9IM$@2Ri3J78I;6t{%R;|q zNn`+1vuUkRu+1#+UQcvL7MdV$6&H`?ZcXOA$()$TU7N|x&g4q1aR{}&{BrNzgWa_! z-!?aQ-hA9%e$_&z-7l}ZkDqnd-tTUH-QRkvUH7-1cAr1$zWB7W{CV#~2e$Lc*o+#U zjO{Q|b*+uKLCtZsYQW||#W3v9L?t-~PtK7}KSL*mWaz-H2&m9+zT-*G;}qv!AX+Z! zY0ei~j@vs?qllM5p^=ZHhMhhjuuJr}z)lIV);6^b+p-P4n@^~tuov6&Du{w=tFHf1 joaz69sVaPSW%Pp#1lBmZC+!P8dKa;!bVu4OP1EcT#10(x literal 0 HcmV?d00001 diff --git a/messages/__pycache__/social.cpython-38.pyc b/messages/__pycache__/social.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a691c1948bf953f6be8cbe8af09d41b03d0f1f8 GIT binary patch literal 945 zcmaJLw^b1PzIcHw$URTt?A0LL)L=ladESn4)q_L`9mf4Ywj_pE%X;kV$$D)mI{^ zl=oEf@vsf9dCybQ$H!%1;OxOsH$X|^QbAlMs9?v$HH0BdxS@%t!d($HXkh6^Kk)-E z?3U$ynB$M2jV15HQ5&E#GNm(eNH`M&l4;K|QVd9OQf&pX%DmW@r+`n%aCAyi3m$&m z-tP>$ljfsI_AH49?cH{J_trop`6P(>D>>w0@KO#g=Tie!;AxE~+TuKjgN*YUR8iQ7 z(1YtMcw38*{{ufHQ!*p_RM0I1&U*P(DAxRTa&~d{@%+o1^Uq%|-hXnKHghFYZN-8A zJoX})Rw1kyqEu_(>Wxv7MqbAKB+g`O3JRLd$czcL z1$&+vGg1IHdIy{KlN~$Su|?B<*s;4EyPww~ZGQB&oML|T&M~!_1(DR2%FDL{Wj4; z5-cfPV!;?(u0mx|%dm{%n^R4ZY1$g6NtO)rQ9&@>SkR+21mdU0qQp|!qD%3EtUD#H NyGY=&0jtwG`wd^W+(-Zb literal 0 HcmV?d00001 diff --git a/messages/__pycache__/utils.cpython-38.pyc b/messages/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d3ad16abad33b3c7cd2689f702e911892d4d4a9 GIT binary patch literal 2207 zcmZuyNpBoQ6t1eNUZ!WUJznChiXbco6h)RSA%sx2NdmG>uoG+-jz%-nWvAm_#?|En zkJ>q4!~r2;ao`dmjgR~b4mlxC9P7%7zmOBJYQ{5dl5X|a@4c$}rt7_W-#n~TJOtOh zD?hYY388mz_aWu;5l{<@H{)uYljF}N`Co!#4h+1zY6b*K3+w0WBrXK6YxD@#0Tak11N*HagR9X@hvD@hVPOu1O)yQ667Zm=asZe=xT2hDI4 zDBXJ89F7x3gE)|i-bn;+WBpBo%YnBp%`JG+9)LtWe2fmTB)tN>N%whoQQ8@lWuoN_KdBtT_!?S3U!fJW4p#gTMY6i% zi61dKfUtAN_HFk8t-Vs2^2pl;0UmnO0z|s82RhV9`R++r=%zG%-iHg?odS3tp7b^Vg6^d7 z*t%!QCGxs;fs_ZMZ?Z0t8XRumnY$z^@M3O9Br<93Z5e$uswgJ(z}Sh1Tb`mC{88wCe%Mn_A#9JD! zXn04%yBglppi{)GwR@jGsEfCCKr5KpYA&H#LWRz%azBj{e=p>p>3_HM0{|CNs)bPF P;3nh5hGd?)i97xu#5XS| literal 0 HcmV?d00001 diff --git a/messages/utils.py b/messages/utils.py index 8a2a888..386fe52 100644 --- a/messages/utils.py +++ b/messages/utils.py @@ -1,6 +1,7 @@ import os from protobuf import message_pb2 - +from protobuf import wss_pb2 +import gzip from messages.member import MemberMessage from messages.like import LikeMessage from messages.roomuserseq import RoomUserSeqMessage @@ -22,13 +23,16 @@ init() def unpackMsgBin(filepath): response = message_pb2.Response() - + wss = wss_pb2.WssResponse() try: with open(filepath, 'rb') as f: - response.ParseFromString(f.read()) - + path_content = f.read() + wss.ParseFromString( path_content ) + decompressed = gzip.decompress(wss.data) + response.ParseFromString(decompressed) decodeMsg(response.messages) except Exception as e: + os.remove(filepath) pass finally: os.remove(filepath) diff --git a/protobuf/__pycache__/__init__.cpython-38.pyc b/protobuf/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a98949aedebd73f91ec041591d1ed326d3f30616 GIT binary patch literal 147 zcmWIL<>g`kf;T@~lR)%i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!GTmQ{>zr9wbu zNk)ENjFEwnk%4JUN`7f&W?p=GYEpboW?5=XK~a85eo|>#OniK1US>&ryk0@&Ee@O9 Q{FKt1R6CG~pMjVG02i$z82|tP literal 0 HcmV?d00001 diff --git a/protobuf/__pycache__/message_pb2.cpython-38.pyc b/protobuf/__pycache__/message_pb2.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..435b34f52bff0b7d7c4e104bb10b260ecd51879e GIT binary patch literal 75281 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 APyhe` literal 0 HcmV?d00001 diff --git a/protobuf/__pycache__/wss_pb2.cpython-38.pyc b/protobuf/__pycache__/wss_pb2.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cd79c036f6fdda204520625d8fb3e5bbfdc195e GIT binary patch literal 1086 zcmZ8gOK;Oa5VoC%lZ{g+X-iXtAnJ);swxN}A%sAEAdvb{+zQExw6e34)WyzPyH2b0 z#D#x>P|A(Jv=S#y6-RCy5Mw7K5w<-3=G)ov&V1wZYL#esk&mBzy{KtFQfK)x(RqcB z{ECKYuEum`gnDGSIX%TW#Cf-n;XLA^Yi78Bxa5{ITtrOVimpLrV%=(P6$a5JjXX7^Ku0eIO4r{kMX2@OMW0env_`)o(=?1Gp zoi^DD+D&FT+O~c3=nV`(cnPppEO^3uJZ$-+ejh}u#~JM0VIkVKt_TC!6G5DCfu6na zXv}$tlo^4P-T=~A0sRnqNx+9`tQc@IEBH3mVC0K4Vu& zWgd=XVL3FC1DcFuXcmzzHwZCeziDRJBKfp}W(hs3fk`BYD-bjZB50PgBh5PMz z%6N}bWe+$XgfML$N+k>oP!+n6MC6chYfDTflE|llB{~yI6sG$YVhJ2+P1Wdsf+=$! z`rar^@C>*_nXl@v8FN4cUKrc}I}Ab)<#g}*EO%DEr2d!=y$D>3zIU9?fpdCt>>Q{E z^N~B9P2ACRbk4Bz%A7eO{g;&8fk7Y>5HnUa=(%%1_voT$4wl5@bl9Y-Q&eSkDk>9C zB+6c36!oJ17pXlzXaE2J literal 0 HcmV?d00001 diff --git a/protobuf/wss.proto b/protobuf/wss.proto new file mode 100644 index 0000000..0f7f63c --- /dev/null +++ b/protobuf/wss.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +message WssResponse{ + int64 wss_push_room_id = 1; + int64 wss_push_did = 2; + int64 wss_push_log_id = 3; + int64 wss_fetch_ms = 4; + int64 wss_push_ms = 5; + string wss_msg_type = 6; + string pb = 7; + bytes data = 8; + int64 server_time = 9; + string compress_type = 10; +} \ No newline at end of file diff --git a/protobuf/wss_pb2.py b/protobuf/wss_pb2.py new file mode 100644 index 0000000..1b3fbcc --- /dev/null +++ b/protobuf/wss_pb2.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: wss.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\twss.proto\"\xdd\x01\n\x0bWssResponse\x12\x18\n\x10wss_push_room_id\x18\x01 \x01(\x03\x12\x14\n\x0cwss_push_did\x18\x02 \x01(\x03\x12\x17\n\x0fwss_push_log_id\x18\x03 \x01(\x03\x12\x14\n\x0cwss_fetch_ms\x18\x04 \x01(\x03\x12\x13\n\x0bwss_push_ms\x18\x05 \x01(\x03\x12\x14\n\x0cwss_msg_type\x18\x06 \x01(\t\x12\n\n\x02pb\x18\x07 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x08 \x01(\x0c\x12\x13\n\x0bserver_time\x18\t \x01(\x03\x12\x15\n\rcompress_type\x18\n \x01(\tb\x06proto3') + + + +_WSSRESPONSE = DESCRIPTOR.message_types_by_name['WssResponse'] +WssResponse = _reflection.GeneratedProtocolMessageType('WssResponse', (_message.Message,), { + 'DESCRIPTOR' : _WSSRESPONSE, + '__module__' : 'wss_pb2' + # @@protoc_insertion_point(class_scope:WssResponse) + }) +_sym_db.RegisterMessage(WssResponse) + +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _WSSRESPONSE._serialized_start=14 + _WSSRESPONSE._serialized_end=235 +# @@protoc_insertion_point(module_scope) diff --git a/scripts/__pycache__/__init__.cpython-38.pyc b/scripts/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffb1d1b361e924cc82a70dc5ae0b0eab4046288d GIT binary patch literal 146 zcmWIL<>g`kf;T@~lR)%i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!G{mQ{>zr9wbu zNk)ENjFEwnk%4JUN`7f&W?p=GYEpboW?5=XadJ^+K}m5;e0*kJW=VX!UP0w84x8Nk Pl+v73JCK2&ftUdR@V_Fj literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/mitmproxy.cpython-38.pyc b/scripts/__pycache__/mitmproxy.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e450e268bf4ccd59277586ff4776780251f353c0 GIT binary patch literal 783 zcmZWn&59F25bo~jnM`7`D9D->K@dDdNOJJ!Bq9jvDXf}hWmp)J=}vaC^ONoFF`JN_ zvUv3cJR}DXzEWL1?JIcE>O?}of~u~nuKKFFs!wXQ3PJku_-p@=5%S9#`{bbU8d<+U zA&8&}3GB%dnzDe=txGI~7bg*Bp_!MFQ_s#YQTNHAwPFggx)bMXikd23dDe7_y>*&gqDa zoHbjpIa9}m3ufGvw~J?weOzCBtv7~_x1f*+AlWx?mp>Xxa_`I4?FC8y*$`9MCB z&-hl`LudAIBKuKKo2Si*Zld07JvnQMyqLz>Su4uZS-pLtrPA%8%!cjlMVQ22WE2_HM=Bm0-A-eZj#Yj& zZH=dJXICWrSHlifZ~h6rO*uWJ2Xt27E~52caHrvcABI^km0<{#Fidk%Bv!A6;bqZF zwl~Ud4*d7s?(th(q`HshrmH=1WPSE`_{iEO_;h18JXJ*t%DculaH@pPO#pa3A@WS` af!P-;iwOS9ZA-80Xtc%lX_fly!2b*3ddSoO literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/watcher.cpython-38.pyc b/scripts/__pycache__/watcher.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30d739cb4a131e9c800673609c65881157051ac1 GIT binary patch literal 1526 zcmZuxUvJws5GN_gk{vn8jG+7bU<}0oy%bXm4;K%F-Akd`nYI3i=ql_i^` z(m7~>0SWdt>?_!h`yBfgdfn5$!k%_V+g-Mm0FONK?sRv*AN51C*&r}xw|_pn?-KF{ zDmMq5kpr0e9E2c(W`t9_GS2Mka0gbFxf73j6m6WWHu1S{_ih$U>by>gWQ)d<@U3r& z@I>vJh}sq7A!xn`KntXQFI!InV*2AyTJVD=^gMo4YQ@24#n>}PsA!{a_Yr8SFNwVJ2^V+9iP02d&lwV z!`|Veh*hqZ*?CnLsgj8))ciN1w!rVNd*6T2e>`tLnVV6O_xJDY@87xG7ezTw^Z1oK zi?j4X_I0AtsnPvct3*4~c@@NQnx`g?w=q2gjnIHz?yhU;Y_1cESL@-xT8C*%`Uy5z z(i!jQ3x7#|ZNFhASk#5Hq+kK~nk^G9noF`| zl$?^g7NU|^((JRYVxeoK7bST)tmr&3|R zxHBycz^jsYIxwS%a?e`)r`9Sg@_3NXV|$62Xe0t*H7L75FZb4L>D)ByMxOc*jMPUc zJ_b>RKpc}M6A2Gas88_xU7f{7db)<2BvtO=*y14Hi3N?A&UJm4++ zQbjTBY<>&c{wDa&+Y4KUR@hsIt literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/webdriver.cpython-38.pyc b/scripts/__pycache__/webdriver.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..735c6d243d02f752cc338903aaeeeeefeadce227 GIT binary patch literal 2065 zcmZ`)UvC>l5Wl_iozLe#asD=GT3V10_`z1GREZ)$gd`HJnzT(?6|Ewj?AwjA(cZ1Q zyGP>SNJv3EAP`@G2j`KmbdT`Vj{pyd*>z$9O7FC@znPs|&(8j4{IXt;9C+R<|Iquk z;y8a8t@&yd_6A0oE#2q}D5k{c9+)X{~A!GA+DfO{$aft_M8J8{gd6-skC5>=o z^?+B?8m?Jf=Jm9J8y1IrCT-%T#T7oA&fz(WBR-!l;03@{Qv2S)iv;aDt@;~?$k}e8 zqH;ugM6z$F1f~3Rpqa=N!1)cTn51OAJLvWpXPQyfatr^N6vxA&Vy73w0R>n0%OS}6 zE85$z8@=i>4TjZ$q>5$-*8lf>FNV{i{z!gZ`inHXLBji|nX^Q+Q3Z|%RkoI5~SCmxMsrhXyBQ2E*W<@eK)Zj4GKI&)9`QE5Cws`htF z=FBZY*WJGQK&2I8Vb-NE)#B425O*|+#<$3<-8mZH9#zQPiUV@q%31JTn4-lgS_1nG7|T=3$`suM`|7VYGqCqN z=MH4@GSWNb)+AEoymB5m&z&9TYalBS==S!>Y`Z-$WN0fYfj*zTucRS-;alrT)NUWp zF5y(ElbdbU&)|C736+}dGsA&4l~PD`GJmmlx2+VvG*;VfmL;N}F)a$O$Fi1Jl*NRc zc!5l)87Eh`iD&3BO>*7saT*W0`rwVJP4?Y$C%Xc+Igey{r)bg+h4SbaCi=t#u5m=oRWhj?eGE(@OX-^u06q#y@Xgph2rQy>p^S{xB^L@Kv}Z> z>tF3W-P*+SW>YQxlTv$~I9NZBBBe4k?lUYMaF)Q)hw%}VdExb`#y*^$aS1KZk!9oN zKH7i`($_gv8cv(Tsw&EP_Bt1k<~n>6ceR$Rmup&-4wc9XpNlS0($ss=P~eaV&S_%W zQ4z5WvaDl~QAjWs3eL3tWNmjh-d@|iL9AOYF9Z@1d~ozluYcn zw$G%}F?6Y%YaE&|%pG1J(L0n)6OFG-XZp>NAAt7P$B#eR+Zx_|Hq-|q+q-}7{{4Fo z_K3)baKDBd99rp~N+cU-wKwgpox!kh`(g%mP>(@4C_u|7@*)JU8=w$1Q4?l^T~zx! z@La&=T|jey>>4V;SKtFL*iiImSP5O(g56q6aup`|4hS47Xto*4)5-n4d#QH*jb@Um z&Sjs(iF6Z+hF`$v{nI&aWpZwQ!4k#Z$+c7m$RPD8P;Cy{yX=gKOFZqi2(71-5rh??0 Wer}3cnfeS-=+=;Vn^xA0=Kcd*WI;~= literal 0 HcmV?d00001 diff --git a/scripts/mitmproxy.py b/scripts/mitmproxy.py index 4ac654a..ae87cf7 100644 --- a/scripts/mitmproxy.py +++ b/scripts/mitmproxy.py @@ -3,11 +3,14 @@ import uuid from mitmproxy import http +import re class Writer: - def response(self, flow: http.HTTPFlow) -> None: - if flow.request.host == 'live.douyin.com': + def websocket_message(self, flow: http.HTTPFlow) : + re_c = re.search('webcast3-ws-web-.*\.douyin\.com', flow.request.host) + if re_c : with open('/Users/geng/douyin_live/' + uuid.uuid4().hex, 'wb') as f: - f.write(bytes(flow.response.content)) + mess = flow.websocket.messages[-1].content + f.write(bytes(mess)) addons = [Writer()] diff --git a/scripts/watcher.py b/scripts/watcher.py index 5c4beb6..e4a1c8e 100644 --- a/scripts/watcher.py +++ b/scripts/watcher.py @@ -1,6 +1,6 @@ import concurrent.futures import queue - +import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler @@ -23,6 +23,7 @@ class Watcher: try: while True: with concurrent.futures.ThreadPoolExecutor() as executor: + time.sleep(0.2) executor.submit(unpackMsgBin, q.get()) except: self.observer.stop() diff --git a/scripts/webdriver.py b/scripts/webdriver.py index 6aeb69a..01e0f73 100644 --- a/scripts/webdriver.py +++ b/scripts/webdriver.py @@ -17,6 +17,11 @@ def go(url): chrome_options.add_argument('--proxy-server=%s' % config()['webdriver']['proxy']) chrome_options.add_argument('--headless') + # 2022-04-09 添加一个忽略证书 + chrome_options.add_argument('-ignore-certificate-errors') + chrome_options.add_argument('-ignore -ssl-errors') + chrome_options.add_argument('--incognito') + proxy = Proxy() proxy.proxy_type = ProxyType.MANUAL proxy.http_proxy = config()['webdriver']['proxy'] diff --git a/store/__pycache__/__init__.cpython-38.pyc b/store/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac04b656666d3e6e80e4f78777ae6431d8294e54 GIT binary patch literal 144 zcmWIL<>g`kf;T@~lR)%i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!G%mQ{>zr9wbu zNk)ENjFEwnk%4JUN`7f&W?p=GYEpboW?5=XaY=qrYD|25W?p7Ve7s&ku_CP!@3y%35!N=4%D0wd z{{ubdFYT365BvZ)F|(;tlX7CEea-I9eDlrBzVCEA0`2FoZ{7wyd}aC_9YSa1@kRIhotA+z+E!vQQZjAfvFgL{}Sl!m%QJS2l!#q_o zpfz*2wxJ(F&kkV7$#{8KjLNlDs1Sfm zl5s41j$WJ2jNES-+lNsolUy;d0lu4!W@0j@+RkKjGAF79N5A`LFGfeRC+}wYhcp@W z5BmLs=Od98voPUbip^Dqf>&Ku|jxM~QjnDhljeE`` z9^?EvEWk~0|C&$;OVY6q@VXu35t zf8RO|3{h|w8?GJbhKg-iAg(i7(vp>sxmOlMnwhjMra(jva1e=ZDLIYCf#hi-d$xh7 zn~>QeM9|t6<9w`8-wI~612WW50o|(st?9f+9+rmziR3ThRnluHt%^7U%L@}kiKync z#O=cURSlD=9-ZQ_f*9Y*piWB}2 zS4>zRF;e#61`8X087B(kFjr=`2${bTq(zc*kp@K!6`56;h1ymK(hd1F%<`;TL%CJs zXmJW@aoqE;3bFDz*B<9_DvAi#ZO%Ux<7jcBFf~oZs4ZL}_X;Uc$c1{01O5WF!PFQA z9kVmT;&7>JyOwKt&|OR68Dt)ozV0mk)cp@Kno4E<8gpLLXVjxo?Y>-qe1+tgU&Cc> F_6H53HW&Z^ literal 0 HcmV?d00001