使用GramJS(telegram.js)发送Telegram Stars礼物时出现TypeError: Api.payments.SendStars is not a constructor错误的求助
使用GramJS(telegram.js)发送Telegram Stars礼物时出现TypeError: Api.payments.SendStars is not a constructor错误的求助
看起来你碰到的核心问题是,你当前用的GramJS版本里还没有Api.payments.SendStars这个构造函数,所以才会抛出这个类型错误。咱们一步步来排查解决:
一、最可能的原因:GramJS版本太旧,没跟上Telegram的新功能
Telegram的Stars礼物购买是比较新的功能,早期的v2.x版本GramJS可能还没把payments.SendStars这个MTProto方法加入到自动生成的API绑定里。咱们先从升级版本入手:
1. 把GramJS升级到最新版
打开项目终端,运行下面的命令更新依赖:
# 用npm的话 npm install telegram@latest # 用yarn的话 yarn add telegram@latest
升级完成后重启脚本,看看错误会不会消失。
2. 先确认方法到底存在不存在
如果升级后还是报错,可以在调用SendStars之前加一行调试代码,看看Api.payments里到底有哪些方法:
// 放在调用SendStars的代码前 console.log("当前可用的payments方法:", Object.keys(Api.payments));
要是输出的列表里没看到SendStars,说明你用的版本确实还不支持这个方法——要么等GramJS官方更新,要么试试用开发版(不推荐生产环境用)。
二、版本升级后,再检查参数是否正确
假设升级后SendStars构造函数能用了,咱们再确认参数是否符合要求:
peer: 你用InputPeerUser传入自己的ID和accessHash是对的,给自己买礼物是允许的gift: 设为true表示购买礼物(不是直接发Stars到对话)id: 礼物的ID要确保是BigInt类型,避免数字溢出(从GetStarGifts返回的gift id可能是字符串或者大数字,最好显式转成BigInt)randomId: 你用BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER))生成唯一值是正确的
这里给你一个修正后的调用示例:
try { const request = new Api.payments.SendStars({ peer: new Api.InputPeerUser({ userId: me.id, accessHash: me.accessHash, }), gift: true, id: BigInt(giftToBuy.id), // 显式转成BigInt,防止大数字溢出 randomId: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)), }); await client.invoke(request); console.log("礼物购买成功!"); } catch (error) { console.error("购买礼物失败:", error); }
三、额外要注意的几个点
- 必须是个人用户账号: 机器人账号不能买Stars礼物,你用的是用户session,这部分没问题
- 账号功能正常: 先在官方Telegram客户端里手动买一次礼物,确认你的账号和所在区域能正常使用这个功能
- 支付方式绑定: 虽然调用方法时可能才会触发验证,但如果账号没绑定支持的支付方式,会抛出另一种错误,提前绑定好能少踩坑
要是升级版本后还是解决不了,你可以去GramJS的GitHub仓库提Issue,把你的版本号、错误信息和代码片段贴上去,官方维护者应该能帮到你。
内容来源于stack exchange




