telegram API 中的 access_hash 是什么?

win*_*win 1 telegram mtproto telethon pyrogram

当您执行时contacts.resolveUsername,结果始终包含idaccess_hash。它给 API 用户带来了困惑,为什么你只能通过他们username或他们的对来解析用户/聊天/频道(id, access_hash)(例如,这里这里)。

我尝试在telegram API 主页上搜索信息,但没有找到有关 的含义的信息access_hash

我真的很困惑为什么你需要比id(或username)更多的东西。我想知道这件事的本质access_hash

  1. 它会随着时间的推移而改变吗?
  2. 这有什么意义吗?
  3. 存储在数据库中并确保它是恒定的是否安全?
  4. 各个账户的号码是否不同(例如,我 contacts.resolveUsername从账户 #1 拨打,然后从账户 #2 拨打,我得到的号码是否相同?)?

我知道像这样的库pyrogramtelethon将其存储access_hash在本地sqlite数据库中。id这样,它们就可以调用需要同时使用和access_hash仅使用 的高级函数id

Lon*_*ami 5

access_hash当对某些内容的访问应该以某种方式“限制”时,这些值通常出现在 Telegram 的 API 中。您可以查找access_hash用户、渠道、甚至媒体对象

我将在下面的示例中使用 Telethon,但这同样适用于与 Telegram API 交互的任何库。

它会随着时间的推移而改变吗?可能不会。据我所知,它access_hash不会随着时间的推移而改变。我还没有听到任何用户声称access_hash已更改的报告。

不可能确定,因为这需要访问 Telegram 服务器为此使用的代码(并且他们可以随时更改其实现),但我已经使用 Telegram 很长时间了,并且我可以自信地说它可能永远不会改变。

这有什么意义吗?不是靠它自己。这只是一个看起来随机的数字。然而,它证明您有权访问特定对象,无论是用户、频道还是媒体。

如果access_hash不存在,您可以尝试猜测随机 ID,例如,这可以枚举注册到 Telegram 的每个用户!:

for user_id in range(1_000_000):
    await client.get_entity(user_id)
Run Code Online (Sandbox Code Playgroud)

值得庆幸的是,上面的代码不起作用,因为为了获取用户信息,access_hash需要知道这些信息。但由于它是随机的,并且每个帐户都不同,因此几乎不可能猜测。因此,这access_hash可以保证您的帐户安全(只要无法通过其他方式“访问”该帐户,例如通过您转发的消息或您参与公共团体)。

存储在数据库中并确保它是恒定的是否安全?是的。例如,Telethon v1 将其存储access_hash在其.session文件内,这样您就可以仅使用id来引用用户和频道,只要该库access_hash之前“见过”(并缓存)了它们。

如果您之前保存过access_hash,您可以稍后自己重复使用它

from telethon import types

CHANNEL = types.InputPeerChannel(channel_id=..., access_hash=...)
Run Code Online (Sandbox Code Playgroud)

不同账户有区别吗?是的。access_hash每个帐户都是唯一的。例如,如果 Account_A 获取 Channel_X,则它可能具有id=123, access_hash=456. 但如果 Account_B 获取相同的 Channel_X,则它可能具有id=123, access_hash=789.

这意味着您无法在 Account_A 中获取access_hash然后尝试在 Account_B 中使用它,因为它不起作用(贴纸在某些时候似乎是一个例外)。

每个帐户都会看到同一事物的相同 ID(消息似乎是一个例外,但实际上它们遵循相同的规则;它们对于每个帐户都是重复的,除非它们出现在频道内,因此可能会出现“相同”消息拥有不同的 ID。)