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

能否无需BotFather自动为用户创建Telegram机器人?

关于自动创建Telegram机器人的解决方案

核心限制:无法绕过BotFather创建机器人

所有Telegram机器人的创建必须通过官方的BotFather完成,这是Telegram的强制规则。机器人的唯一身份凭证(token)只能由BotFather生成,没有任何官方或非官方渠道能跳过这一步直接创建机器人账号。你的需求只能通过自动化和BotFather的交互流程来实现,而不是绕过它。

解决手动验证码的问题

你当前使用的telegram库是基于MTProto协议的客户端,模拟普通用户登录。手动输入验证码的问题可以通过以下两种方式解决:

1. 复用已登录的会话字符串

第一次登录成功后,client.session.save()会生成一个会话字符串,把这个字符串保存到配置文件或数据库中,后续登录时直接加载这个字符串,无需再次输入验证码:

// 替换原来的stringSession初始化
const savedSession = this.configService.get<string>('TELEGRAM_SESSION');
private stringSession = new StringSession(savedSession || '');

async createBot() {
  const client = new TelegramClient(this.stringSession, this.apiId, this.apiHash, {
    connectionRetries: 5,
  });

  await client.start({
    // 如果会话有效,这里的phoneNumber和phoneCode不会被触发
    phoneNumber: 'XXXXXXXXXX',
    phoneCode: async () => {
      // 仅在会话过期时需要处理,这里可以对接自动验证码服务
      const code = await this.getVerificationCodeFromSmsService();
      return code;
    },
    onError: (err) => console.log(err),
  });

  // 每次登录后更新保存的会话字符串
  const newSession = client.session.save();
  // 保存到配置或数据库
  this.configService.set('TELEGRAM_SESSION', newSession);
}

2. 对接自动验证码接收服务

如果需要完全自动化首次登录(或会话过期后的重新登录),可以对接第三方短信接收平台的API,自动获取Telegram发送的验证码。把手动输入的逻辑替换成调用API的逻辑即可:

// 示例:对接短信服务的方法
private async getVerificationCodeFromSmsService(): Promise<string> {
  // 调用第三方短信API获取验证码
  const response = await fetch('你的短信服务API地址', {
    method: 'POST',
    body: JSON.stringify({ phone: 'XXXXXXXXXX' }),
    headers: { 'Content-Type': 'application/json' },
  });
  const data = await response.json();
  return data.code;
}

自动化创建机器人的完整流程

基于已登录的用户会话,你可以通过代码自动和BotFather交互,完成机器人创建:

async createBot(botName: string, botUsername: string) {
  const client = new TelegramClient(this.stringSession, this.apiId, this.apiHash, {
    connectionRetries: 5,
  });
  await client.connect();

  // 发送/newbot指令给BotFather
  await client.sendMessage('BotFather', { message: '/newbot' });

  // 等待BotFather回复,然后发送机器人名称
  const nameResponse = await client.waitForEvent('message', {
    filter: (msg) => msg.senderId?.toString() === 'BotFather' && msg.text.includes('Choose a name'),
  });
  await client.sendMessage('BotFather', { message: botName });

  // 发送机器人用户名(必须以bot结尾)
  const usernameResponse = await client.waitForEvent('message', {
    filter: (msg) => msg.senderId?.toString() === 'BotFather' && msg.text.includes('Choose a username'),
  });
  await client.sendMessage('BotFather', { message: botUsername });

  // 提取BotFather返回的token
  const tokenResponse = await client.waitForEvent('message', {
    filter: (msg) => msg.senderId?.toString() === 'BotFather' && msg.text.includes('Use this token'),
  });
  const tokenMatch = tokenResponse.text.match(/(\d+:\w+)/);
  const botToken = tokenMatch ? tokenMatch[0] : null;

  return botToken;
}

注意事项

  • 账号风险:频繁创建机器人可能触发Telegram的反垃圾机制,导致账号被限制或封禁,建议使用专门的小号来执行此操作。
  • 会话维护:会话字符串可能会在长时间未使用或账号异常时过期,需要做好会话刷新的逻辑。
  • 用户名唯一性:机器人的用户名必须是唯一的且以bot结尾,代码中需要处理用户名重复的情况(捕获BotFather的错误回复并重试)。

内容的提问来源于stack exchange,提问作者Val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:43:15