You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何模拟Telegram Mini-App的InitData对象?能否为个人账号生成带哈希的InitData?

如何模拟Telegram Mini-App的InitData对象?能否为个人账号生成带哈希的InitData?

当然可以生成带哈希的InitData用于测试/学习(正如你说的,仅为了玩和测试),不过得先搞懂Telegram生成InitData哈希的核心逻辑,下面一步步来:

首先得明确:InitData的哈希是Telegram用来验证数据是否被篡改的关键,它基于HMAC-SHA-256算法生成,密钥是你的机器人Token的后半段(就是Token里冒号后面的那部分)。

步骤1:准备必要的信息

你需要提前收集这些内容:

  • 你的机器人Token:从@BotFather那里获取,比如123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11,我们需要的是冒号后的ABC-DEF1234ghIkl-zyx57W2v1u123ew11
  • 你的个人账号信息:包括user_id、first_name、username(可选)、language_code等,这些可以通过Telegram客户端或者@userinfobot查询到
  • auth_date:当前的Unix时间戳(比如1690000000,可以用在线工具或者代码生成)
  • chat_instance:测试用的话可以随便填一个字符串,比如-1234567890123456789

步骤2:构造待签名的字符串

Telegram要求把除了hash之外的所有InitData字段,按键的字典序排序,然后拼接成key=value&key2=value2的格式:

  • 注意user字段必须是无空格的紧凑JSON格式,比如{"id":123456,"first_name":"John","last_name":"Doe","username":"johndoe","language_code":"en"},不能有任何空格
  • 排序后拼接的示例:
    auth_date=1690000000&chat_instance=-1234567890123456789&user={"id":123456,"first_name":"John","last_name":"Doe","username":"johndoe","language_code":"en"}
    

步骤3:计算HMAC-SHA-256哈希

用机器人Token的后半段作为密钥,对上面的拼接字符串计算HMAC-SHA-256哈希,再转成十六进制字符串,这就是InitData里的hash字段。

给你一个Python的示例代码,直接就能跑:

import hmac
import hashlib
import json

# 替换成你的机器人Token后半段
bot_token_secret = "ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
# 替换成你的个人账号信息
user_info = {
    "id": 123456,
    "first_name": "John",
    "last_name": "Doe",
    "username": "johndoe",
    "language_code": "en"
}
auth_date = "1690000000"  # 替换成当前Unix时间戳
chat_instance = "-1234567890123456789"  # 测试用随便填

# 把user转成紧凑JSON格式
user_str = json.dumps(user_info, separators=(',', ':'))

# 按字典序排序所有字段(除了hash)
sorted_fields = sorted([
    ("auth_date", auth_date),
    ("chat_instance", chat_instance),
    ("user", user_str)
])
# 拼接待签名的字符串
sign_payload = '&'.join([f"{k}={v}" for k, v in sorted_fields])

# 计算HMAC-SHA-256哈希
init_data_hash = hmac.new(
    bot_token_secret.encode('utf-8'),
    sign_payload.encode('utf-8'),
    hashlib.sha256
).hexdigest()

# 最终生成的InitData对象
final_init_data = {
    "auth_date": auth_date,
    "chat_instance": chat_instance,
    "user": user_info,
    "hash": init_data_hash
}

print("生成的InitData:")
print(json.dumps(final_init_data, indent=2))

关键注意事项

  • 必须用机器人Token的后半段作为密钥,用整个Token或者前半段都会导致哈希验证不通过
  • user字段的JSON必须是紧凑格式,不能有任何空格,否则签名会不匹配
  • 字段排序必须严格按键的字典序,不能乱序
  • 再次提醒:仅用于测试和学习,不要用这个方法绕过Telegram的安全机制,否则可能导致你的机器人或个人账号被封禁

备注:内容来源于stack exchange,提问作者hamaronooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:58:00