Google Apps Script调用Botmaker API POST请求发送WhatsApp消息
Botmaker WhatsApp接口Google Apps Script实现方案
你遇到的401鉴权失败错误,从响应头返回的reason-phrase可以直接定位:服务端未从请求中读取到有效的access-token值。另外UrlFetchApp构造multipart/form-data请求有特殊规则,手动设置Content-Type头会导致请求解析异常,以下是可直接运行的实现代码。
核心实现函数
/** * 调用Botmaker v3接口发送WhatsApp消息/附件 * @param {string} accessToken Botmaker平台生成的有效access-token * @param {string} chatChannelNumber 已绑定的WhatsApp渠道号码(纯数字,带国家码) * @param {string} platformContactId 消息接收方的WhatsApp号码(纯数字,带国家码) * @param {Blob=} fileBlob 待发送的文档附件,传入Google Drive/Sheet导出的Blob对象即可 * @param {string=} messageText 消息附带的文本内容 * @returns {Object} 接口返回的状态码与响应数据 */ function sendBotmakerWhatsApp(accessToken, chatChannelNumber, platformContactId, fileBlob, messageText) { const API_URL = 'https://go.botmaker.com/api/v1.0/message/binary/v3'; // 构造表单参数,对应cURL中-F标记的字段 const payload = { chatPlatform: 'whatsapp', chatChannelNumber: chatChannelNumber, platformContactId: platformContactId, mediaType: 'document' }; // 按需加入附件和文本参数 if (fileBlob) payload.file = fileBlob; if (messageText) payload.messageText = messageText; const options = { method: 'post', headers: { 'Accept': 'application/json', 'access-token': accessToken }, payload: payload, muteHttpExceptions: true // 避免接口报错时脚本直接中断,方便拿到错误信息调试 }; const response = UrlFetchApp.fetch(API_URL, options); const responseText = response.getContentText(); // 调试日志,正式上线可注释 console.log('响应状态码:', response.getResponseCode()); console.log('响应内容:', responseText); return { status: response.getResponseCode(), data: responseText ? JSON.parse(responseText) : null }; }
测试调用示例
function testMessageSend() { // 替换为你自己的真实参数 const ACCESS_TOKEN = '你的Botmaker真实access-token'; const CHANNEL_NUMBER = '你的WhatsApp渠道号,例如8613xxxxxxxxx'; const TARGET_CONTACT = '接收消息的用户号码,例如8613xxxxxxxxx'; // 示例:读取Google Drive中存储的业务报表作为附件,替换为实际文件ID即可 const attachFile = DriveApp.getFileById('你的Google Drive文件ID').getBlob(); const result = sendBotmakerWhatsApp( ACCESS_TOKEN, CHANNEL_NUMBER, TARGET_CONTACT, attachFile, '本月业务数据报表,请查收' ); }
关键注意事项
- 不要手动在headers中添加
Content-Type: multipart/form-data:当payload传入普通键值对对象时,UrlFetchApp会自动生成带正确boundary分隔符的multipart请求头,手动设置反而会丢失boundary导致服务端无法解析表单参数。 - 鉴权头
access-token必须传入平台生成的有效值,不要使用cURL示例中的myAccessToken占位符,注意不要在token前后加多余的引号、空格。 - 所有号码参数均为纯数字格式,带国家码,不要添加
+、-等特殊符号。 - 若仅发送纯文本消息,可将
mediaType字段值改为text,无需传入fileBlob参数。 - 首次运行脚本时会弹出授权申请,同意脚本的外部网络请求、Google Drive访问权限即可正常执行。
内容的提问来源于stack exchange,提问作者Gerzayn Fuentes Campos
相关产品推荐
相关产品推荐

