如何模拟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
相关产品推荐
相关产品推荐

