如何用Node.js在Telegram以非Bot身份发消息供其他Bot接收?
解决方案
Telegram官方限制了Bot之间直接发送消息,所以你需要通过模拟普通用户会话来发送消息,这样目标Bot就能正常接收,且消息不会被标记为Bot发送。以下是Node.js的实现方案:
核心思路
放弃使用Bot API,改用Telegram的MTProto协议模拟普通用户身份发送消息。这种方式发送的消息和真实用户发送的完全一致,目标Bot可以正常读取,且不需要添加任何命令。
实现步骤
1. 获取普通用户API凭证
你需要先从Telegram官方获取普通用户的api_id和api_hash:
- 用你的普通用户账号登录Telegram开发者平台
- 创建新应用后,即可获取对应的
api_id和api_hash(这不是Bot的token,是用户级别的API凭证)
2. 安装依赖
使用支持MTProto协议的Node.js库,推荐telegram包:
npm install telegram input
3. 编写发送代码
以下是完整的示例代码,实现模拟普通用户发送消息给目标Bot:
const { TelegramClient } = require('telegram'); const { StringSession } = require('telegram/sessions'); const input = require('input'); // 替换为你的用户API凭证 const apiId = 123456; const apiHash = 'your_api_hash_here'; // 会话文件,用于保存登录状态,避免重复验证 const stringSession = new StringSession(''); (async () => { console.log('正在登录...'); const client = new TelegramClient(stringSession, apiId, apiHash, { connectionRetries: 5, }); await client.start({ phoneNumber: async () => await input.text('请输入你的手机号:'), password: async () => await input.text('请输入你的账号密码(如果有):'), phoneCode: async () => await input.text('请输入收到的验证码:'), onError: (err) => console.log(err), }); console.log('登录成功!'); console.log('你的会话字符串:', client.session.save()); // 保存这个字符串,下次登录可直接复用 // 发送消息给目标Bot,替换为目标Bot的用户名(比如@your_target_bot)或者chat_id await client.sendMessage('@your_target_bot', { message: '需要原样传输的消息内容' }); console.log('消息发送完成'); })();
4. 后续优化
- 首次运行后,保存输出的会话字符串,下次直接传入
StringSession即可跳过手机号和验证码验证 - 可将会话字符串存储在环境变量或配置文件中,避免硬编码泄露
注意事项
- 必须使用普通用户的
api_id和api_hash,不能用Bot token - 遵守Telegram服务条款,禁止用此方式发送垃圾消息或进行违规操作
- 确保你的普通用户账号状态正常,未被封禁
内容的提问来源于stack exchange,提问作者Lcx
相关产品推荐
相关产品推荐

