之前基于 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();