telegram 数据采集-android 数据解析 getPathToMessage
之前基于 telethon 库开发的tg采集,原本每天采集量都很理想,后面不知道为什么突然采集量就急剧下降,达到每天8万条消息。
后面修改了一下代码逻辑,以及并行采集,后面还是一样的效果,而且,还被封了一批账号。
后面就想到,tg的客户端是开源的,就打算基于客户端进行二次开发
说一下android客户端解析的方式:
1:解析 包名/files/cache4.db 文件
这个方式解析就需要看完整个源码,了解每种数据的解析方式,而且对版本有要求
相关连接:
https://dflab.blogspot.com/2019/01/cache4db-file-of-telegram-for-android_3.html
https://patents.google.com/patent/CN106549948B/zh
https://dflab.blogspot.com/2019/01/cache4db-file-of-telegram-for-android_3.html
https://github.com/RealityNet/teleparser
2:直接在消息接收并解码后 hook (目前我使用的是这种),然后判断数据包的类型,判断数据包是不是消息
源码位置在:TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java
public static abstract class Update extends TLObject 这个类里面的TLdeserialize函数
(org.telegram.tgnet.TLRPC.Update#TLdeserialize)
然后消息携带的音视频文件的话,可以通过
org.telegram.messenger.FileLoader#getPathToMessage获取
消息怎么解析,就需要你们自己来动手了。
还有不想监听的话,可以设置一个定时任务
//获取cache4.db的数据库对象 MessagesController instance = MessagesController.getInstance(UserConfig.selectedAccount); SQLiteDatabase database = instance.getMessagesStorage().getDatabase(); // 查看消息表(这段代码是直接在tg里面拷贝过来,不一定复制就能用,这里只是给一个参考)SQLiteCursor replyCursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM messages ")); while (replyCursor.next()) { NativeByteBuffer data = replyCursor.byteBufferValue(0); if (data != null) { TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); message.readAttachPath(data, getUserConfig().clientUserId); data.reuse(); message.id = replyCursor.intValue(1); message.date = replyCursor.intValue(2); message.dialog_id = replyCursor.longValue(3); addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); TLRPC.Message owner = replyMessageOwners.get(message.dialog_id); if (owner != null) { owner.replyMessage = message; message.dialog_id = owner.dialog_id; } } } replyCursor.dispose();