如何用Telegraf JS内联键盘在Telegram内置浏览器打开URL并解决400报错
Telegraf JS 内联URL按钮400错误修复方案
报错原因
该400 Bad Request异常大多是因为Telegraf版本语法不匹配、遗漏必填参数导致的:
- Telegraf v3版本中,Markup生成的键盘配置必须调用
.extra()方法转换为API可识别的参数格式,直接传入会触发参数校验失败 - 少部分情况是URL没有完整携带HTTP/HTTPS协议,或包含未转义的特殊字符
修复代码
Telegraf v3 版本修复
在inlineKeyboard调用后追加.extra()即可:
ctx.reply( `Hi! ${ctx.from.first_name} 👋 \n \n Shall we start? 👇 `, Markup.inlineKeyboard( [ Markup.button.url( "Covid-19 🇮🇳 IN", "https://www.covid19india.org/" ), Markup.button.url("WHO 🌎", "https://covid19.who.int/"), ], { columns: 2 } ).extra() );
Telegraf v4+ 版本修复
v4已经废弃了extra()方法,确保正确导入Markup即可,标准写法如下:
const { Telegraf, Markup } = require('telegraf') // 业务逻辑中的回复代码 ctx.reply( `Hi! ${ctx.from.first_name} 👋 \n \n Shall we start? 👇 `, Markup.inlineKeyboard( [ Markup.button.url( "Covid-19 🇮🇳 IN", "https://www.covid19india.org/" ), Markup.button.url("WHO 🌎", "https://covid19.who.int/"), ], { columns: 2 } ) );
内置浏览器打开说明
Telegram默认点击内联URL按钮就是用内置浏览器打开,不需要额外配置,上述修复完成后即可满足需求。如果遇到部分设备跳外部浏览器的情况,是用户个人Telegram设置的问题,无法通过机器人代码强制修改。
其他排查点
- 确认使用的URL是完整的HTTPS/HTTP开头,不能省略协议直接写域名
- 检查是否有其他中间件篡改了ctx.reply的传参结构
- 确认Telegraf版本和参考的开发文档版本一致,避免语法不兼容
内容的提问来源于stack exchange,提问作者Tushar Jain
相关产品推荐
相关产品推荐

