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

Android端Telegram通过Deep Link打开时重复发送多个/start命令问题

解决Telegraf.js机器人在Android端自动重复发送/start命令的问题

核心解决方向

绕开无法修改请求头的限制,从请求去重和链接/配置优化两个维度处理Android端的重复触发问题:

1. 基于用户+参数的请求去重

在Telegraf中用会话或缓存记录近期处理过的带参数/start请求,短时间内的重复请求直接忽略。示例代码:

const { Telegraf, session } = require('telegraf');
const bot = new Telegraf('YOUR_BOT_TOKEN');

// 启用会话存储,分布式部署建议替换为Redis等外部缓存
bot.use(session());

bot.start(async (ctx) => {
  const userId = ctx.from.id;
  const startParam = ctx.startPayload;
  const cacheKey = `start_${userId}_${startParam}`;
  
  // 10秒内重复请求直接跳过
  if (ctx.session[cacheKey] && Date.now() - ctx.session[cacheKey] < 10000) {
    return;
  }
  
  // 更新缓存时间戳
  ctx.session[cacheKey] = Date.now();
  
  // 执行你的原有/start业务逻辑
  await ctx.reply(`欢迎使用,参数:${startParam}`);
});

bot.launch();

2. 优化Telegram启动链接格式

调整链接参数和格式,降低Android端重复触发概率:

  • 避免参数包含特殊字符,优先用短哈希值替代长字符串参数
  • 统一使用t.me/你的机器人ID?start=参数的标准链接格式

3. 启用Webhook请求丢弃机制

在启动配置中开启drop_pending_updates,清理机器人离线期间堆积的重复请求(注意:会丢失离线期间的有效请求,适合实时性要求低的场景):

bot.launch({
  webhook: {
    dropPendingUpdates: true
  }
});

4. 服务器端Nginx层拦截重复请求

如果机器人部署在Nginx后方,可通过配置对相同用户+参数的/start请求做短期限流:

http {
  limit_req_zone $remote_addr$arg_start zone=start_limit:10m rate=1r/10s;

  server {
    location /webhook {
      # 仅允许Telegram官方请求(需配置验证逻辑)
      # 10秒内同一用户+参数仅允许1次请求
      limit_req zone=start_limit burst=1 nodelay;
      proxy_pass http://localhost:3000;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:10:56