电报:从电报客户端获取文件ID

Posted

技术标签:

【中文标题】电报:从电报客户端获取文件ID【英文标题】:Telegram: get fileid from telegram client 【发布时间】:2017-05-10 15:58:29 【问题描述】:

Telegram 机器人使用fileid 下载文件。我怎样才能从 Telegram 客户端(我的非官方版本)获得这个 fileidmtproto 中的文件有 this location class 表示它们的地址。

文件位置参数

dc_id int 保存文件的数据中心编号 volume_id 长服务器音量 local_id int 文件 ID 秘密长校验和以访问文件

问题是我不知道如何生成适用于来自File Location 类的机器人的fileid

更新 1:

我尝试做一些逆向工程。所以,我发现File Location 类和FileId 之间存在某种关系。

这是我的File Location 示例地址。

id:0 // 此字段仅适用于私密聊天 access_hash:0 // 此字段仅适用于秘密聊天 volume_id:429640340 (199BCA94 HEX) secret: -3528741004939935589 (CF0764C08833409B HEX) // 根据 TG 文档,它应该是文件 CheckSum local_id:6005 (1775 HEX)

这是我根据 FileID 从我的 Bot 检索到的前 FileLocation 类:

文件 ID:AgADBAADL6gxG06L8w0nhNO87UW3iZTKmxkABJtAM4jAZAfPdRcAAgI

很明显FileID的值是Base64的格式。所以我已经解码了:

十六进制值: 0200030400032FA8311B4E8BF30D2784D3BCED45B78994CA9B1900049B403388C06407CF7517000202

现在我们可以在这个十六进制值中看到FileLocation 值:

未知:0200030400032FA8311B4E8BF30D2784D3BCED45B789 VolumeId:94CA9B19 HEX 未知:0004 秘密:9B403388C06407CF HEX local_id:7517 Hex 未知:000202

注意:这些值以Big-Endian 格式存储。

现在我们需要解码Unknown 值。我感谢任何有助于解码这些值的努力。

【问题讨论】:

Telegram-API 的 PhotoSize.location 和 Bot-API 的 PhotoSize.file_id 似乎没有关系 【参考方案1】:

这是机器人 API 文件 ID 的 TL 方案:https://github.com/danog/MadelineProto/blob/master/src/danog/MadelineProto/TL_botAPI.tl

我已经在 MadelineProto 中实现了 bot API 文件 id 转换:您基本上必须对文件 id 进行 base64decode,将它们通过基于空字节的 RLE 解码器,然后使用给定的 TL 方案对其进行解码。 请参阅 TL/Conversion/BotAPI* 以了解 MessageMedia 对象在序列化之前如何转换为 File 对象。

我设法使用special MTProto bot I built using the same lib 对文件 ID 进行了逆向工程(我忘了在这里搜索 xd)。

【讨论】:

请在此处发布您的逆向工程结果摘要,这样比共享 php 代码更有帮助

以上是关于电报:从电报客户端获取文件ID的主要内容,如果未能解决你的问题,请参考以下文章

如何使用电报内联机器人获取组 ID 和聊天 ID?

如何使用 Telethon 获取电报私人频道 ID

如何在电报中获取电话号码的 user_id

从 iCloud 驱动器获取文件而不下载?

PHP电报机器人:从id.txt向所有用户发送消息

电报机器人奇怪的错误:错误的请求:指定了错误的文件标识符/HTTP URL