Takeout API
Telegram 的 API 允许用户通过 Takeout API 导出他们的所有信息。
account.takeout#4dba4501 id:long = account.Takeout;inputTakeoutFileLocation#29be5899 = InputFileLocation;---functions---account.initTakeoutSession#8ef3eab0 flags:# contacts:flags.0?true message_users:flags.1?true message_chats:flags.2?true message_megagroups:flags.3?true message_channels:flags.4?true files:flags.5?true file_max_size:flags.5?long = account.Takeout;invokeWithTakeout#aca9fd2e {X:Type} takeout_id:long query:!X = X;account.finishTakeoutSession#1d2652ee flags:# success:flags.0?true = Bool;
使用account.initTakeoutSession初始化外卖会话:传递适当的标志以启用相应方法的使用,如下所述。
调用下面描述的方法时,每个查询都必须使用invokeWithTakeout进行包装,并id返回account.initTakeoutSession。
导出完成后,使用account.finishTakeoutSession终止会话。
分割范围
messageRange#ae30253 min_id:int max_id:int = MessageRange;---functions---messages.getSplitRanges#1cff7e08 = Vector<MessageRange>;invokeWithMessagesRange#365275f2 {X:Type} range:MessageRange query:!X = X;
某些方法调用需要使用消息范围进行额外的分页。
首先,通过调用messages.getSplitRanges(像往常一样将其包装在invokeWithTakeout中)来获取消息范围列表。
然后,当调用需要消息范围分页的方法时,先使用invokeWithMessagesRange包装该方法,然后再像往常一样用invokeWithTakeout包装它。
首先传递第一个消息范围;继续传递相同的消息范围,同时使用通常的 `offset_*,`limit、`,` 等参数进行分页;一旦没有更多结果,就切换到下一个消息范围,从头开始重新分页。offset_*重复此操作,直到处理完messages.getSplitRanges返回的所有消息范围。limit
程序
示例实现:tdesktop。
以下是导出账户信息所需步骤的概述。
所有请求都必须包装在invokeWithTakeout构造函数中,包括用于保存文件的upload.getFile调用。
除非另有规定,所有请求均不需要使用拆分范围进行分页。
-
如果用户想要下载聊天记录、群组或频道中的消息:
-
首先,使用分割范围和messages.getDialogs获取并保存对话框列表;在每个分割范围的开头,发出一个初始请求,将所有偏移量设置为0,limit=1以获取全部对话框,count从而显示正确的进度条。
-
如果用户想要导出频道和群组消息,则请求并保存有关左侧频道和超级群组的信息。
-
对于所有对话框,检查它们是否与用户选择的对话框类型匹配,如果匹配,则使用拆分范围和`messages.getHistory`下载所有消息;对于每个拆分范围,发出一个初始请求,并将所有偏移量设置为 `true`0,limit=1以获取初始消息计数,从而显示正确的进度条。
使用初始请求返回的单个消息limit=1来跳过没有任何消息的范围,因为这些范围会返回空messages向量或单个`messageEmpty`
。 如果用户还选择仅下载特定日期范围内的消息,则跳过以下范围:- 最后一条消息(由同一初始limit=1调用返回)大于date指定日期范围的上限。
- 第一个消息(通过对messages.getHistory进行新的调用并传入参数limit=1,offset_id=1,返回add_offset=-1)小于date指定日期区间的下限。
对于下载并保存的每条消息,同时下载并保存所有附加媒体,包括消息和标题中出现的自定义表情符号,并遵守用户设定的单个文件下载大小限制。
如果用户选择仅下载自己的消息,而不是下载其他用户发送的消息,请使用messages.search并peer设置为inputPeerSelf,而不是messages.getHistory。
-
-
如果用户想要导出他们的故事:
- 使用stories.getStoriesArchive获取、下载和存储所有已发布的故事,包括标题中出现的自定义表情符号。
-
如果用户想要导出个人信息:
- 调用users.getFullUser并存储inputUserSelf的结果。
-
如果用户想要导出自己的个人资料图片:
- 调用photos.getUserPhotos获取并下载所有个人资料图片列表。
-
如果用户想要导出联系人列表:
- 请看这里 »
-
如果用户想要导出他们的会话:
- 调用并存储account.getAuthorizations和account.getWebAuthorizations的结果
-
如果用户想要导出上述未提及的任何其他数据,例如与 Telegram 新功能相关的个人数据,而这些功能在 Takeout API 中还没有任何特定的导出方法。
- 使用upload.getFile和inputTakeoutFileLocation;这将下载一个 JSON 文件,其中包含与尚未有专门提取方法的功能相关的所有个人数据。
联系方式
savedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact;---functions---contacts.getSaved#82f1e39f = Vector<SavedContact>;
此方法不需要使用消息范围进行分页。
使用contacts.getSaved导出完整的联系人列表,请参阅此处 »了解另一种可用于获取 Telegram 帐户中所有联系人的完整列表而无需使用 takeout 会话的替代方法。
左声道
messages.chats#64ff9fd5 chats:Vector<Chat> = messages.Chats; messages.chatsSlice#9cd81144 count:int chats:Vector<Chat> = messages.Chats;---functions---channels.getLeftChannels#8341ecc0 offset:int = messages.Chats;
此方法不需要使用消息范围进行分页。
使用channels.getLeftChannels获取我们离开的频道或超级群组列表。