G-Sheet脚本调用Guilded API发私信遇‘POST is not allowed’错误求助
解决Guilded API POST不允许错误的排查步骤
1. 检查API端点与URL格式
- 你当前使用的是频道消息端点,但
isPrivate参数的作用是让消息在现有频道内仅被提及用户可见,而非创建全新的私信会话。如果要发送真正的一对一私信,需要先调用创建私信会话的接口获取对应频道ID,再发送消息。 - 修正URL拼接:你的请求URL末尾多了斜杠,应改为
https://www.guilded.gg/api/v1/channels/d2ba****/messages(去掉末尾斜杠),部分API对路径格式敏感,多余斜杠会导致请求被拦截。
2. 修正请求体格式错误
- Mentions格式错误:Guilded API不支持直接用用户名提及用户,必须使用用户ID,且需按指定结构传入:
mentions: { users: ["目标用户ID"] // 替换为实际用户的Guilded ID } - Embeds字段错误:
author字段需要是对象格式,不能直接传字符串,正确写法:embeds: [{ author: { name: "API" } }]
3. 验证Token权限与频道类型
- 确认你的Bearer Token(
gapi_*****)拥有发送消息的权限,临时Bot Token可能权限受限,需在Guilded后台检查Bot的权限设置。 - 确认
channelid对应的频道是允许发送消息的类型:如果是普通服务器频道,需确保Bot有该频道的发言权限;如果是私信频道,必须先通过API创建私信会话获取正确的频道ID,不能直接使用服务器内的普通频道ID。
修正后的示例脚本
function message () { var url = "https://www.guilded.gg/api/v1/channels/"; var channelid = "d2ba*****"; // 若发私信,需替换为创建私信会话后得到的频道ID var key = "Bearer gapi_*****"; const message = { content : "It's alive!", embeds :[{ author: { name: "API" } }], mentions: { users: ["目标用户ID"] // 替换为实际用户ID }, isPrivate : true, // 此参数仅让消息在频道内对提及用户可见,非创建私信 } const params = { method: "POST", headers: { Authorization: key, "Content-Type": "application/json" }, payload: JSON.stringify(message), muteHttpExceptions: true, }; Logger.log(JSON.stringify(params)); const response = UrlFetchApp.fetch(url + channelid + "/messages", params); // 移除末尾斜杠 var data = JSON.parse(response); Logger.log(data); }
额外提示
如果需要发送真正的一对一私信,需先调用POST /users/{userId}/dm接口创建私信会话,获取返回的频道ID后,再用该ID调用消息发送接口。
内容的提问来源于stack exchange,提问作者Aaron Raven
相关产品推荐
相关产品推荐

