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

使用Discord4j(Kotlin)实现Discord嵌入消息自动crosspost

Discord4j 嵌入消息自动crosspost实现方案

首先明确前置规则:Discord的crosspost(跨频道发布)功能仅支持公告类频道(NewsChannel),普通文字频道调用发布接口会返回频道类型错误,代码里需要先做类型校验避免异常。

你现有代码中channel.createMessage(embed)执行完成后会返回已发送的Message实例,直接调用该实例的crosspost()方法即可触发发布,修改后的完整代码如下:

import discord4j.core.`object`.entity.channel.NewsChannel
import reactor.core.publisher.Mono

fun sendEmbedMessage(gateway: GatewayDiscordClient, embed: EmbedCreateSpec, channelId: String) {
    gateway.getChannelById(Snowflake.of(channelId))
        .ofType(GuildMessageChannel::class.java)
        .flatMap { channel ->
            channel.createMessage(embed)
                .flatMap { sentMsg ->
                    // 仅公告频道执行发布操作
                    if (channel is NewsChannel) {
                        sentMsg.crosspost()
                    } else {
                        Mono.just(sentMsg)
                    }
                }
        }
        // 增加错误兜底,避免权限不足、频道类型错误导致流程中断
        .onErrorResume { error ->
            println("消息处理失败: ${error.message}")
            Mono.empty()
        }
        .subscribe()
}

注意事项

  • 权限要求:机器人需要在目标公告频道拥有发送消息、发布消息(对应权限位PUBLISH_MESSAGES)两个权限,否则接口会返回403无权限错误。
  • 版本适配:上述代码适配Discord4j 3.2.x及以上稳定版本,低版本中crosspost方法可能归属在频道操作类中,升级依赖即可正常调用。
  • 如果你的业务场景中传入的channelId100%对应公告频道,可以省略NewsChannel类型判断逻辑,直接在拿到sentMsg后调用crosspost()即可,但不建议省略校验,避免线上异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:15:44