如何在Kotlin的Spring Boot项目中给Telegram机器人发送文件?
解决TelegramBots库发送文件的问题
1. 正确初始化SendDocument的方式
你遇到的SendDocumentBuilder包私有问题,是因为该库的Builder类属于内部实现,并未对外公开。在6.3.0版本中,正确创建SendDocument实例有两种可行方式:
方式一:直接实例化并设置属性
通过构造器创建对象后手动配置必要参数:
val sendDocument = SendDocument() // 设置目标聊天ID(支持字符串或Long类型) sendDocument.chatId = "目标聊天ID" // 设置文件,支持三种类型: // 1. 本地文件(需转换为InputFile) sendDocument.document = InputFile(File("/path/to/your/file.pdf")) // 2. Telegram服务器已存在的文件ID // sendDocument.document = InputFile("已上传的文件ID") // 3. 可公网访问的文件URL // sendDocument.document = InputFile(URL("https://example.com/file.pdf")) // 可选:设置文件说明标题 sendDocument.caption = "这是一份测试文件"
方式二:使用静态工厂方法快速初始化
SendDocument提供了静态fromChatId方法简化创建流程:
val sendDocument = SendDocument.fromChatId("目标聊天ID", InputFile(File("/path/to/your/file.pdf"))) // 可选补充标题 sendDocument.caption = "请查收文件"
2. 发送文件的执行流程
创建好SendDocument实例后,直接在你的LongPolling机器人实现类中调用execute方法即可,无需切换WebHook或直接调用Telegram API端点:
// 你的LongPollingBot实现类中 override fun onUpdateReceived(update: Update?) { // 触发发送文件的条件(比如收到特定指令) if (update?.message?.text == "/sendfile") { val chatId = update.message.chatId.toString() val sendDocument = SendDocument.fromChatId(chatId, InputFile(File("test.pdf"))) sendDocument.caption = "测试文件发送" try { execute(sendDocument) } catch (e: TelegramApiException) { e.printStackTrace() } } }
3. 库API的限制说明
SendDocumentBuilder确实为包私有,属于库内部实现逻辑,对外不开放直接调用,这是API设计的正常限制。- LongPolling模式完全支持发送文件,无需切换到WebHook,也不需要绕过库直接调用Telegram API端点。
- 发送文件需遵守Telegram API的基础限制:普通文件最大50MB,压缩包类文件最大1.5GB;本地文件需确保机器人进程有读取权限;网络文件URL需能被Telegram服务器正常访问。
额外提示
如果需要发送图片、音频等其他类型的文件,可以使用对应的实体类(如SendPhoto、SendAudio),创建和发送逻辑与SendDocument完全一致,都是直接实例化或用静态工厂方法构建对象后调用execute。
内容的提问来源于stack exchange,提问作者fckNewbee
相关产品推荐
相关产品推荐

