能否无需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
相关产品推荐
相关产品推荐

