如何在Google AppScript中实现Firebase Messaging主题订阅
解决Google AppScript中订阅Firebase Messaging主题的方案
由于Firebase Admin SDK无法在Google AppScript中直接使用,你可以通过调用Firebase Messaging的REST API完成主题订阅操作,具体实现步骤如下:
1. 获取Firebase项目服务账号密钥
- 登录Firebase控制台进入目标项目
- 点击设置图标→项目设置→服务账号→生成新的私钥,下载JSON格式密钥文件
2. 在AppScript中实现OAuth2身份验证(获取访问令牌)
借助AppScript的OAuth2库生成访问令牌,用于调用Firebase REST API:
- 打开AppScript编辑器,点击「资源」→「库」,添加OAuth2库,库ID为
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF,选择最新版本 - 编写获取令牌的函数:
function getFirebaseAccessToken() { var serviceAccount = { "type": "service_account", "project_id": "你的Firebase项目ID", "private_key_id": "密钥文件中的private_key_id", "private_key": "密钥文件中的private_key(将换行符替换为\\n)", "client_email": "密钥文件中的client_email", "client_id": "密钥文件中的client_id", "token_uri": "https://oauth2.googleapis.com/token" }; var oAuth2Service = OAuth2.createService('Firebase') .setTokenUrl(serviceAccount.token_uri) .setPrivateKey(serviceAccount.private_key) .setIssuer(serviceAccount.client_email) .setPropertyStore(PropertiesService.getScriptProperties()) .setScope('https://www.googleapis.com/auth/firebase.messaging'); if (!oAuth2Service.hasAccess()) { throw new Error('获取访问令牌失败:' + oAuth2Service.getLastError()); } return oAuth2Service.getAccessToken(); }
3. 调用REST API完成主题订阅
使用UrlFetchApp发送请求,将表格中存储的clientToken订阅到指定主题:
// 单token订阅示例 function subscribeTokenToTopic(token, topicName) { var accessToken = getFirebaseAccessToken(); var url = `https://fcm.googleapis.com/v1/projects/你的Firebase项目ID/topics/${topicName}:batchAdd`; var payload = { "tokens": [token] }; var options = { 'method': 'post', 'contentType': 'application/json', 'headers': { 'Authorization': 'Bearer ' + accessToken }, 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(url, options); Logger.log('订阅成功:' + response.getContentText()); return response.getContentText(); } catch (e) { Logger.log('订阅失败:' + e.toString()); throw e; } } // 从表格读取token批量订阅的示例 function processSheetTokens() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('存储token的工作表名'); var data = sheet.getDataRange().getValues(); // 假设第一列是clientToken,从第二行开始跳过表头 for (var i = 1; i < data.length; i++) { var token = data[i][0]; if (token) { subscribeTokenToTopic(token, '你的目标主题名'); // 可选:标记该token已处理 sheet.getRange(i+1, 2).setValue('已订阅'); } } }
4. 关键注意事项
- 批量订阅可一次性传入最多1000个token,使用上述
batchAdd接口即可 - 确保服务账号在IAM控制台中拥有
Firebase Messaging Admin权限 - 私钥中的换行符必须替换为
\\n,否则会导致身份验证失败 - 建议通过
PropertiesService存储服务账号信息,避免硬编码在脚本中
内容的提问来源于stack exchange,提问作者SKB_BGPL
相关产品推荐
相关产品推荐

