返回

模拟 Telegram 验证码请求:Telethon 实践

python

模拟 Telegram 发送验证码请求

理解 Telegram 的验证码请求机制,并准确复现,是进行自动化测试、构建第三方客户端或研究其安全性的基础。 这个过程涉及模拟 TL_auth_sendCode 方法,以便获取 next_type 参数,这对后续的验证步骤至关重要。原始代码片段提供了关键的参数和设置信息。 此文旨在剖析这一过程,提供不同解决思路。

问题分析

核心问题在于如何精确模拟客户端发出的 TL_auth_sendCode 请求。 其中的挑战包括:

  1. 构造 TL_codeSettings 对象: 这个对象包含了设备、安全、呼叫相关的多个参数,这些参数值可能受设备环境和配置的影响。需要依据规则设置参数。
  2. 设备和应用相关信息的获取: BuildVars.APP_HASH, BuildVars.APP_ID 这类值,是每个 Telegram 客户端独有的标识符,获取此类信息需根据具体情境确定。
  3. 使用合适的库: 需要选择能良好处理 Telegram 二进制协议(MTProto)的库,例如 Telethon,但可能需额外的配置才能实现完全一致的模拟。

解决方案一: 完整模拟环境

这种方案要求尽可能复现客户端的环境,使请求在 Telegram 服务器看来,与真实客户端的请求无异。

  • TL_codeSettings的精确构造: 分析代码逻辑,准确判断各个标志位如何计算, allow_flashcallallow_missed_callallow_app_hashallow_firebase参数应基于设备环境计算出来,如果条件允许直接取模拟器或者真机的真实数据,或者提供这些数据来满足测试。TextUtils.isEmpty(BuildVars.SAFETYNET_KEY)需要设置一个真实或虚拟的值。

  • ** BuildVars相关变量的替换:** 通过逆向工程分析客户端应用或咨询 Telegram API 文档,获取BuildVars.APP_HASHBuildVars.APP_ID,这些参数不能直接猜测。确保在代码中正确设置它们。

  • 请求的构建与发送: 利用诸如 Telethon 的 MTProto 客户端库构建auth.sendCode请求。需确保 TL_auth_sendCode 请求对象参数准确无误,例如,电话号码(phone),API Hash 和 API ID 都正确,并且settings 对象与客户端计算一致。

from telethon import TelegramClient
from telethon.tl import functions, types

# 替换成你的API ID 和 API Hash
api_id =  YOUR_APP_ID 
api_hash = "YOUR_APP_HASH"

# 设置你要测试的电话号码
phone_number = "+1234567890"

client = TelegramClient('anon', api_id, api_hash)

async def send_auth_code_request():
  async with client:
    settings = types.CodeSettings(
       allow_flashcall=True, 
       allow_missed_call=True,
       allow_app_hash=True,
       allow_firebase=False # 这里的false,或者依据实际情况修改成True
    )


    try:
        result = await client(functions.auth.SendCodeRequest(
          phone_number=phone_number,
          api_id = api_id,
          api_hash = api_hash,
          settings=settings
        ))

        print("Send Code Result:", result)
        # result 对象将会包含 next_type 属性或其他你需要的信息。
    except Exception as e:
        print(f"An error occurred: {e}")
  
import asyncio
asyncio.run(send_auth_code_request())

操作步骤:

  1. 安装 Telethon:pip install telethon
  2. 获取正确的 api_idapi_hash ,设置 phone_number
  3. 调整 types.CodeSettings 以匹配所需条件,并参照原始代码调整逻辑,可能需从实际客户端获取配置信息。
  4. 运行代码,观察返回结果,特别是 next_type 参数。

解决方案二:简化设置,着重关键参数

若不需要完全一致的模拟,此方案专注于 Telegram 验证的核心流程,并简化 TL_codeSettings 设置。

  • 简化的 TL_codeSettings 设置: 直接设置 allow_flashcall, allow_missed_call 参数,无需过于深入考虑其他依赖因素。 将allow_app_hash设置为一个合适的值(可以是真,可以是假), 并确保 allow_firebase设置和真实设备环境的一致性。

  • 利用已有 MTProto 库: 复用已实现的库,比如 Telethon。构建 TL_auth_sendCode 请求时,直接设置简化后的 TL_codeSettings 对象,确保 API 信息,手机号码等基础数据正确。

  • 捕捉并分析响应: 注意解析 Telethon 响应中 auth.sentCode返回的对象。这个对象应该包含验证方法的相关信息。 例如 next_type

from telethon import TelegramClient
from telethon.tl import functions, types
import asyncio


api_id = YOUR_APP_ID 
api_hash = "YOUR_APP_HASH"

phone_number = "+1234567890"

client = TelegramClient('anon', api_id, api_hash)
async def send_auth_code_request():
  async with client:
      settings = types.CodeSettings(
           allow_flashcall=True, 
           allow_missed_call=True,
           allow_app_hash=True,  
           allow_firebase=False # 或依据环境设为True
       )
      result = await client(functions.auth.SendCodeRequest(
            phone_number=phone_number,
            api_id = api_id,
            api_hash = api_hash,
            settings=settings
          ))
      print("Simplified result:", result)

asyncio.run(send_auth_code_request())

操作步骤:

  1. 安装 Telethon。
  2. 设置正确的 api_id, api_hash 以及手机号码,并修改代码里的相应参数。
  3. 设定一个简化的 TL_codeSettings 配置。
  4. 运行代码。分析返回的 result。 寻找 next_type 参数。

安全建议

  • 妥善保管 api_idapi_hash,不要将其泄露,或直接放到版本管理中。
  • 验证 API 调用时的上下文信息。例如电话号码的格式和安全限制。
  • 使用受信任的 Telegram 客户端库。确保使用了官方认可或者可信赖的第三方库,避免不必要的安全问题。
  • 对于高度敏感的应用场景,建议详细研究官方文档并遵循安全指南。

每个解决方案有自己的优点和缺点。第一个方案需要尽可能多地模拟 Telegram 环境。 第二个方案着眼于 Telegram 的核心授权过程,简化了一些环境配置的要求,从而更关注获取 next_type 这个参数,并可以以此参数来模拟后续授权过程。 具体采取哪一种方法,要根据实际需求来权衡。