diff --git a/抖音js逆向学习/抖音直播间弹幕/README.md b/抖音js逆向学习/抖音直播间弹幕/README.md index cdec985..d9f9951 100644 --- a/抖音js逆向学习/抖音直播间弹幕/README.md +++ b/抖音js逆向学习/抖音直播间弹幕/README.md @@ -66,7 +66,7 @@ print(info) 打印的效果,二进制文件 - b'\x08\xe8\x07\x10\xd0\x0f' + 序列化后的二进制数据:b'\x08\xe8\x07\x10\xd0\x0f' 2.将数据反序列化 @@ -80,15 +80,15 @@ print(p.logId) 打印的效果 - 1000 - 2000 + 反序列化后的真实数据:1000 , 2000 -## 二、websocket 连接 +## 二、反序列化抖音数据 -直播间弹幕是实时响应的,这样数据显示方式大概率就是websocket协议 -## 三、数据流过程 +## 三、websocket 连接 + +直播间弹幕是实时响应的,这样数据显示方式用websocket协议最方便,但也是最容易破解的。 + +## 四、数据流过程 ![debugger](./img/3.png) - - diff --git a/抖音js逆向学习/抖音直播间弹幕/extractors/__init__.py b/抖音js逆向学习/抖音直播间弹幕/extractors/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/抖音js逆向学习/抖音直播间弹幕/douyin.proto b/抖音js逆向学习/抖音直播间弹幕/extractors/douyin.proto similarity index 100% rename from 抖音js逆向学习/抖音直播间弹幕/douyin.proto rename to 抖音js逆向学习/抖音直播间弹幕/extractors/douyin.proto diff --git a/抖音js逆向学习/抖音直播间弹幕/douyin_pb2.py b/抖音js逆向学习/抖音直播间弹幕/extractors/douyin_pb2.py similarity index 100% rename from 抖音js逆向学习/抖音直播间弹幕/douyin_pb2.py rename to 抖音js逆向学习/抖音直播间弹幕/extractors/douyin_pb2.py diff --git a/抖音js逆向学习/抖音直播间弹幕/extractors/解析直播间广播数据.py b/抖音js逆向学习/抖音直播间弹幕/extractors/解析直播间广播数据.py new file mode 100644 index 0000000..a9a9adc --- /dev/null +++ b/抖音js逆向学习/抖音直播间弹幕/extractors/解析直播间广播数据.py @@ -0,0 +1,38 @@ +from 抖音直播间弹幕.extractors.douyin_pb2 import PushFrame, Response, ChatMessage +import binascii +import gzip + + +def 解析直播间广播数据(content): + # 将16进制转换成原始字节 + res_bytes = binascii.unhexlify(content) + + # 转成PushFrame数据对象 + frame = PushFrame() + frame.ParseFromString(res_bytes) + + # 对PushFrame的 payload 内容进行gzip解压 + origin_bytes = gzip.decompress(frame.payload) + + # 根据Response+gzip解压数据,生成Response数据对象 + response = Response() + response.ParseFromString(origin_bytes) + + for item in response.messagesList: + if item.method != "WebcastChatMessage": + continue + + # 生成ChatMessage数据对象 + message = ChatMessage() + message.ParseFromString(item.payload) + webcast_chat_message = { + 'user_id': message.user.id, + 'user_nickName': message.user.nickName, + 'content': message.content + } + print(webcast_chat_message) + + +if __name__ == '__main__': + content = '082b10c1a1bd82d7b3cd9a6118b84520082a150a0d636f6d70726573735f747970651204677a69702aca010a0f696d2d696e7465726e616c5f65787412b601696e7465726e616c5f7372633a707573687365727665727c7773735f6d73675f747970653a727c777264735f6b76733a496e70757450616e656c436f6d706f6e656e7453796e63446174612d313638373939353839363435353036343837325f57656263617374526f6f6d52616e6b4d6573736167652d313638383033393333303238353338343632365f57656263617374526f6f6d53746174734d6573736167652d313638383033393439383233383538363231332a400a09696d2d637572736f721233742d313638383033393530333237315f722d373235303037343435393734323132333430385f642d315f752d315f7264632d312a170a06696d2d6e6f77120d313638383033393530333237312a190a0e696d2d6c6976655f637572736f721207642d315f752d31320270623a036d7367429e2a1f8b08000000000000ffec5d09701bd779f60348117aa264cc5a5421a693b250a589d850da03d772468d0110e0211ee04d314e364b60098004b0d0eee2209d746235b1ad7854d31a57b265f962145b971d59922d9a8e8fa8b19df1217beab4eeb8699dc63c24c5534fdca44d3daddd01408204095004b920a1e8c99eb145eebeddf7defffefffbbff7bd7fe11907dcd8c9f53859516ae0fc3d9cd0c08922ebe6b0030e385192fe77eaf3878e3ef593fdbfbce4d2bc70e88ecf4f8d3c73c98503cbf11258e2f3863946e0793fc305244e60249e15256cf3ed786548e484ef944d3cfca3b1d13b6f272a4549f006dcdf29dd00d76ee931f5c6ff940d29b51f6d54adc38a61d11693d566b4dbcb869427c13b1be15b1b55778dad295d3336f262797979dd61056cf44852b072e7ce20551149bce30e171f1af006825ee70e27efdfe9f5bb774efd66a7e8677d3ea6aabdcb1c662556d8110cb8ff5a0afac2157c4fdf0eaf9f757333ed19e469af69ba3d8290a541ec4b0b5c5b5eb4454fea70ca781244615b3623139b16c62db02e8ef17161cec784f58c2ecde335eab2321c584a3505da4d970ffcf0f2c9fd934fed9f1c7d523739fae4f83df74c9e7aec24d80f606b36a3d8cb0644a72fd433fd64034310691e8d175970b876f2feef5df9eefef18786b1a22df6f81fcd3aad26f9d3c9b3fbc7461e1e7f6838f13267c10655afba48034860ac541238390a7e0af08223e0b65c0ecf30f8066ccfa67936c2f93926c80e4c3d838c3244faf68bcb8a717011bc0ce191c25983a15ea701da2f0ae0930a95021b56e464fc671a5d4c9716db685b56eb6391ad6265d7ba01beae5015601715b073b99d62a2fe60ba8e752e770a3235dcb5ec11cbd032f6178bb9a9650d2cb8e9a6bfc2baa7fe8bcd5821fe9bbbde3d7df8c02305d8a3852a80210b95d742e536a49c99fe7560a1fb14379d512aaf2a572d4c5e55e65198bcaa7c18e4cc1c702afb179a3b85430560b8600af5bd5150ddd0aa8bd4f73518c4deee8eb6419bdb5dddcc45c3545b75348a775679061b9c2d0cd567a9a7eb5a7ba5c196bdba267d0de3c6773b0c5c53c063eda8ee0cf8cdfdcd35c001ba867eaeb81b285f010f62184297085d227499195d22cc245344422868b128284b74893013b2d03cb050842e11ba6cd6fc6aaf030c3e5fac52616be3d08932ea68ed4f00dc1276ba9844504e7634419372bdbd9c5362025c04fb52922b1dffc163e3dfffd1d8e89d930f9d9f38f8d495c3e74b8be17437cb8694da3ed53a4c712b380958c8cc06b039e853f99b0af8f56ccc2ad6d5f49dec71a75bc45fcfc64cb26dfcb6ac3c4496ad635f59ec8de5f1c9236c16d31d85968f15f09bd90ee802b693aedbdfcc764cb36c9fc97a58b37b00f69759dcab5197697060d994de27d415902449f615ac5fbf7dfb607c555246ca68de0736c3f5537324f221c1c961aae927ec031a08259e893b67af0b83948ed6194c38ae27f701355c3b759bd78529499c1802af8c281e00a715a320d9c245f0850216f6b02e3787fd5ea1baf90df08902a2795fc979bf089e0150e567bd81769113b06340b5ee247804c08780ea77a7ceee5b1f779997ef79fe538531e129cd16b3d96c6ee66acc5d74072932fe4073438d95b787edac89edb55530cdd5565e688ad858c16cabf6b7b813cef6f23dcfcbe76c0f827736c14d536390b29be60d62db93f1e1ca778f5c7ef9aeb2db89caa0c0f526f7d6c88c7b6b6f96ccdf5bbb5002cf9764643f64622be46653569afdb09a6cb8c58ad88f1b93fd401911da5bcb839d0bc47e20f6237fd6fa42ec0797ddf0714edecff8e30223260e969970ba77d26c28db8e575a54da35d3ec0262596e609645fb15d5066cc36c306b0217c12d70ad7f80e9e57d3e3e82ad19fffeb98973c7b50a1538024615f09c6206412c66d26206e3637b381f2370ee908f1518a7874d9b1165054c16df6c47566b7bd1ed62da6bdf525eb4c562ada26d7899e356c571a0d424357ff0a34c92c1571cf0b79924832387de3ff8ea3cc9e039392483ff914632f8c146f8fed4a6ee47773c5b5e5e5ea640dbbaf3131b3b1efbe72418cc7e61ccf5a48429b32bfd9206d3fec96c574a9832a4363246c6a5a5366ad5d340fd671a402a28a252491875a3e06700c78eccce3e723044c380c90ebda5cb6ef40c41cb91dfc8094f7202a4f226bf41381be537d7d3b8a3fc468efc6615a3656ae6b1cad13235f390794dca977924006032f368ec33d6f4b3c13e5f8b47176e76501d4d5172b0dd6f21770ff8eca12ed7ee3a2640b4593a0dc128eb6c3350551e8fa37ab08d6df2199afb066dfc9e14f5e06515868026029a08682e454688c2b85c611c41762423cc6f0b454013014d0434b3029a9a070407187c7d35848489aee4a04f2942c25c68fd72aa52cc1f21a1cd62b3d8ed73858439127ce55ab0761d09cae60909edf6d854a451042eac2ddc9ca22d5c471b7093c94011b8d1b02425219af8dc2b095f9aad247c26ae243c05e071a03a76e9ddcfc615a5c51fddf1eceeb28b672f8eeed8b1638ea030e8696d6cae35db1d52f3a09eb691d6fa70ed606d4707dd4cf9f50e8f95097aab82549823f4b6e1829486e473bd07c107399115fe531a59e1c512f87209a245ae458b5808abd54c215a04d12228e944b448ded2222899473bc479b0439c465fb8985158b2be10d12f3734fd92adc2f02505bca098d1ec2d4d0a186125a767412de0d2948b19dbed5ca6c63053c3d89645dc535eb4c5865b4d16ebb4ca302913849f665219bee380573317263c327c669ecaf0b41c2ac3c9342ac3f736c277a74bc73c3f14cb7200ca72e66739368bdd62b7a71c9f5aaa3fd52fa4d72e4cd56bebf3f5f8945af52a507f2d96e318a84a25411be307a80a530e50c93f40c3d9a65069521c3d238bc010c147041ff34a60882c1459681e58689af2312b1b28f3f86053dea61d09e4974c3b1ce1fa8ea60e93bbb123c8d092c912c4c97a296068f775791b89664f7fa89d08d40f841c5dc4de8696bd7b76b70c8ad53a73276d76fb750e9da5dd39b738214298086122848910268adf791fbf91b210290bf367ad23848910665a84a9f938e800839f4ceb0aab4c368bd5b642050ae35dc9419f90ae501e5da1c56ab1da7054a070f57585f1135359eb0abf9ca22b54eb083d41190d346ea268c264c45199c2bc9cfd8be0df678b0b7f1117175e02f04da07ae9d4bbf7feefef7e5c548a8d3d3f34b1efb1897d8f7df2e223897f3f55d4cf161932037a2268937883a937d2101da8e8dfe335454d2dcdf5fa16830f9706da288f8e8cb677186baac27bf46d2ede6d8b46f7920375a46eb0b7734ff770419a67c8e7a20f82f772a23f7c278dfef085123852b2006f820a1bc6bdbdd16cc0f514e24d106f827229c49b20dee48f78dcd15a9783375929e921e2676e607e0695365c72bb8b2c6d98c0bd33a50da75483f0ad22884d090bad1e569a961c9e2a8264ba5fa8478f3ffdd6e4dd73f4865d0f7c0ae28561fea73091818c3ff4787979799d43ee744116dc4e2de42694a96e824aba89b3a058d5a02ed40012e095008fc364a52c3039f3fbe4be0238842aed1a58a0ba09bb4946a27c69231c8b35cd59250501a78717e20c0423b16e264ca6737a5b2c1bb4c5535e2dfe9c840b4b98e88c76bab5b7a715f70a5dd6fa1ec92858edb8bb86a09a8ce66adba08be0da5dad5551bdc71971720384b17390dfed745a19636b4da82a5265dc6b6fa82dbd797ce86fc646be3bf1e091b1911f8c8dde59d7036fcbae3f330b38c04532adf799b54cde0aa26fffeaf7c7d668928b123e9c4943fc5913fc2473a5d273975e9ba7217e460e0df1c76934c4ffbc11fee394c263fcd889f92725115391f80483d54cc97552d2b0d0990cf59c33190679b90a3c1b680417fe0843ab5aad01a48230542a4c54fc9ca45a9e739299076855ce494279c98a7453b0ec04266da3cb4e60d2b5ba600283cb4a56e0b94a9a3336bceca43953cb0b26cdf872c90a64a1cbb550b90d2967a67f1d58a89ce5a396182b65a111e48a95b2d00899a62d238db0c00ba5a71112f06f0683f3ad525d6f537d7f7fbfc8ec36386b1aed44a7a915a7431d837d96be9e7eab2da4338bbca7abdb56d7de6cf7ba5b44aabdc156e5b3fa3d7b1c75ed73eb9422988960268299d78499083cc9149a101c5a2c1c423013c1ccfc5ecb0866229899016626d4c46f4fab898d56a3d54cad8c9a38d1951cf409a98965aa528a5bac162b5213afb09e14ce53139b683365b42eb74aa99ea07112c76902d7a51712ff6cb68af5425cc5fa0c804f03d5d02393a77f0a4a6f1e3f7662fcd88989a3fbc78f9dbcf2c0b939553205aaaf65d0dd2b490dd5fadec656af8ee9d8c3990d5177b3d3491bfd4433c57bbd5d3e5390af1d2e98db967cab1f09a257dd800f820737c9b0e1f68b34d2e0574ae08b250b3021e848f5b444a24a8f98901b9909417926da70cb833c1331218809c96f0b5de90f9f23c6e586665c90e2377bc56fa2d27e99e356852629f083f767d207feb629738dd17b0f1d187f63556a8c4edef71cdab8bdc6072665d0eb2e50b2b954a34ad5ebe6f17714de06eadb62d90a4d562a495c1f9768ab6491682ff41985bc39c9884affa3938c797592119dbf43169a07162ae3c196a5054af46983ec4f1826905f32836870d2517ba3a92b6a68ac667c644597d053dd49b65491d46e4a089b4d3c2976b5189a07a5417d853d6c8c74988496bd5d94680e54f19de63dc6c85c69204298086122848910268adf791fbf11c244169adf168a1026429891842af0bd648d516b95d56e5e195560a22b39e8538a2a3017c2bd9c4a0ef3471598e0e2912a70854555f36b8c5aac55b42dfb1aa37355817aa3414f535446552052d3ad7a79d137660b335f8c0b332f00781ea8ce8c0c7ff80e28c526ef7b6ef2bee7c68f1d193ff4f0c499f3f3bf60de284a0315fdbd416bb0af2f505f231a5bcc6c5d37dbcf045d016bafcdb497a9615a2cbcb5a3c63d5c90a639f9dcf04170bf1cdac06b940d455448662a64fab3e5880a415408a24250a2997f54081a7799c61d914a8b5deb7f24654311e572bd522ef36481f2eaf772a436cc1b596052d70747376790051ede0cff5595411678fcd0a32fbc354f16f8a84a864ce583a2f999ca6b45f0ef8b1299cae51f5f282f2f4779cafc3cc54c9929ab35254f59ec9a98a7975ec82d8254b748cc2a93ba41d5a0fef358664051950a63e27b0220253190ff8d56bb50eaca8ef1ca164a4d2cb619a74d3677f43306736783876e331bf6463b429d75351d4dbd7db6c000d7596114bbf8e6aa9eba6677b8be96b60fb4ebdbf658bbbddd5ebfa06369ba5b9cabc4408b1a2d6ab4a8aff345adf960af031c04ffa6cac5e78eb24703e8447342c065b759ec26e43890e3c85bc791ed971f0acac8c4270c92d907fc6233d44e25282d6ca0dfe715a51a3e24d80292c0069cdc742a736933342fe642f5c8f1375f7b3635af297be2d79f5d18227080ddbd1996420d5c07d78e9fb977e2f073134f1c2d9df95ff8a7b034f6bbb1d1d18933f74f3c7154ad2c9df90bb6c09dd8827796de550cbf570c3570d3951f3e7ae58e03e3c74e8c8ddc33f1c4d1c9d3a789f1a103ea5bb4470b6ed78aac8f630436d0cf4803414e5b39eb070443e004a9fdeaec6bd81e26c0fa63d7a56f3576b5d3c3f9d9584ba28f77b2beca9dd366c4f80602d1b0978b7c2d24f876c5ec4fdc4a99b792f6ada4ddd73b6d861589bd54a72b5021f1e28e9e01897373ce7e3e66945b493bdfd3b795b4c77e5ae10e09aea9abb792f6a9dbb792762e7165ec695b497b2f177f2e13fba99f139c1c13cf358302ef0a39a578bfb692763feb0d6c25ed12e70ffa5889dbd1276ef3f1ac8b915881df856f8b0dceae201f0c05b77938afdb2331c1585301691781e3db225e97e449f9091fe4020c1bf0fa5989db456c133d7c847179fdb196f86062f9ee22b6b90536ec950676f5f092c4fbb7c5c39fd7b5cb48ea6893c940eb708a26708a32e8e96d6c488aad40af6b1749997404ad23f41449d0b89ed8969cbd5dc4366fc0151225612076616cf6e28f9b7d41fc4d3841e0054694622f876bbfaaf58a0c1f6092d3acadd412daef9423f340e691d93cc827956806af8f19449100190a8a04c83c5024b8c167503372fcad449e021f2fcfb07df3f976f8ca860cdb37c3875efbafb7e76ddfecdb20c3f6cd8bebe7133627d6c327d6c7099b8216c4f3e6bc005dba8233c96237704eb11b7c166183a9ee2a523fa0d00052499af04a258d27eabe4179eabe657eaf94ba6f4b656d70865888b7192f84bf4e11cfacd128b4af17c2df285405d884027e6b79fbf9be988771f1910063c82476f9d6f236e917f104769962906b3f02abc8eaee79029b37152a05f69a62469fbfecb15850fdbfecb94cd7fa37e41be57423bc7dd177e6ba4ef9121d490a2bb9a8d5bc0c56321e51929c6453971432f6895c6313bec7e8f4b6fb5c518fa1cb5b4d0d74d6b7740f462aa868241cc09b1a1bdb7037df6d8e782902b7363655f41b0c446d055e3b778712c52d14b7f2336e214f2aa3274528602551008a5bb2c7ada94d7894c2ade28ebbb9ca6ac7512844a1108542140a6508852b758e62151d562e42e1945044932439e1e774068ef45f68f8e12d192bdf7e3871761e47faf82d3204d85f62f303eccf31f82a9610b58d8d1c4221366d884d7cd82725c42e557045a60d34d316ab49b5585237eb30eedf8199d3f08b9917614a6f34739e5d0c05936b94488b19e3e780265e787cfcee3b538edd146b35c99fa6f964c71ef52df14f76d0950a131d8ffb9a23d90ae2b21c2c39e23e896778c254dcffc19a19cd1df67f852a80fda170d6f0a88b3540fb6121fcef58e0fa54019d72ce4ea6c8e2cca6cf4b7d882babf5b5c4a76078b60dcc6375df8f01b07f50e47c5dcc3c408e515f1092c832e2e946fbabd9dc8ccd58393efade1f0efcad324d9ebcd22ef0aa324f5de055e561b022ab1f3759be9ce1e5d6a43f04b9524addabca132b340454f6f393fe646802ee24f19fa38ad9cd8bb59ddde180cbe1e9f6783ba33e2355e1ea96062837535357dd19d6edadb538a83e31d06add5ddb1b6d7636092eb75910f9dd8668c7bc72af085621588560d5d261150aee390aee08b0ae166045b00ac12a04abb28355f11aa7070122c05613a9d92c5526ab0d213584d410019647780261644480e5830b44480d21b58ec8f40668720713ab932a0883c98453b41ea7709a60840a23a9c771a34ea7a78d3a9220291d6e625c150413aa20985ecfd4af298ad6933861d0517a92620497b38228fbcf2b9f5d1822ca9f03de18f60bb03e46149c95c190e8113921cc09df8e8822e317ddf1d32b95c2b723824b64fac362656d2018921c6c80f359797f900f7001a97520e0ac622536f676469ad69b68834eafc70d3a939164a68febf3bcbf850df44fedcb4e7784a270d2a4a74c3a0369987d69abc44ae29c6b75b489a44c7a938124a85b6fae01ff0f0000ffff010000ffff59a7abbf081a0100' + 解析直播间广播数据(content) diff --git a/抖音js逆向学习/抖音直播间弹幕/test_v6.py b/抖音js逆向学习/抖音直播间弹幕/test_v6.py deleted file mode 100644 index e6d7692..0000000 --- a/抖音js逆向学习/抖音直播间弹幕/test_v6.py +++ /dev/null @@ -1,14 +0,0 @@ -from douyin_pb2 import PushFrame, Response, ChatMessage - -# p = PushFrame() -# p.seqId = 1000 -# p.logId = 2000 - -# info = p.SerializeToString() -# print(info) - -info = b'\x08\xe8\x07\x10\xd0\x0f' -p = PushFrame() -p.ParseFromString(info) -print(p.seqId) -print(p.logId) diff --git a/抖音js逆向学习/抖音直播间弹幕/test_序列化.py b/抖音js逆向学习/抖音直播间弹幕/test_序列化.py new file mode 100644 index 0000000..9e4d652 --- /dev/null +++ b/抖音js逆向学习/抖音直播间弹幕/test_序列化.py @@ -0,0 +1,13 @@ +from 抖音直播间弹幕.extractors.douyin_pb2 import PushFrame + +p = PushFrame() +p.seqId = 1000 +p.logId = 2000 + +info = p.SerializeToString() +print(f"序列化后的二进制数据:{info}") + +info = b'\x08\xe8\x07\x10\xd0\x0f' +p = PushFrame() +p.ParseFromString(info) +print(f"反序列化后的真实数据:{p.seqId}, {p.logId}") diff --git a/抖音js逆向学习/抖音直播间弹幕/v6.py b/抖音js逆向学习/抖音直播间弹幕/v6.py index c7b11c2..bda0395 100644 --- a/抖音js逆向学习/抖音直播间弹幕/v6.py +++ b/抖音js逆向学习/抖音直播间弹幕/v6.py @@ -1,4 +1,4 @@ -from douyin_pb2 import PushFrame, Response, ChatMessage +from 抖音直播间弹幕.extractors.douyin_pb2 import PushFrame, Response, ChatMessage from urllib.parse import unquote_plus from websocket import WebSocketApp import requests @@ -67,8 +67,7 @@ def on_message(ws, content): ws.send(s.SerializeToString()) - # 获取数据内容(需根据不同method,使用不同的结构对象对 数据 进行解析) - # 注意:此处只处理 WebcastChatMessage ,其他处理方式都是类似的。 + # 获取数据内容(需根据不同method,使用不同的结构对象对 数据 进行解析)注意:此处只处理 WebcastChatMessage ,其他处理方式都是类似的。 for item in response.messagesList: if item.method != "WebcastChatMessage": continue