如何通过API/SSJS/Ampscript在Cloud Page实现旅程详情查询功能?
实现Cloud Page获取旅程及关联邮件详情方案
方案概述
AMPScript对Journey Builder的原生支持有限,这也是你之前尝试失败的核心原因。推荐使用SSJS结合Marketing Cloud REST API实现需求——SSJS可在Cloud Page服务端直接调用API,完整获取旅程设置及关联邮件的全部信息。
核心实现步骤与代码示例
1. 从输入链接提取旅程ID
用户输入的旅程链接格式通常为 https://mc.s1.example.com/journey-builder/journeys/[旅程ID]/edit,先通过正则提取ID:
function extractJourneyId(url) { const regex = /journeys\/([a-f0-9-]+)/i; const match = url.match(regex); return match ? match[1] : null; }
2. SSJS调用API获取旅程详情
使用Server-to-Server集成的认证信息调用API,获取旅程基础设置及关联邮件活动:
<script runat="server"> Platform.Load("Core", "1.1.1"); // 替换为你的Server-to-Server集成信息 const clientId = "YOUR_CLIENT_ID"; const clientSecret = "YOUR_CLIENT_SECRET"; const authEndpoint = "https://YOUR_SUBDOMAIN.auth.marketingcloudapis.com/v2/token"; const restEndpoint = "https://YOUR_SUBDOMAIN.rest.marketingcloudapis.com/interaction/v1/interactions/"; // 获取API访问令牌 function getAccessToken() { const payload = { grant_type: "client_credentials", client_id: clientId, client_secret: clientSecret, account_id: Platform.Function.GetSystemValue("MID") }; const req = HTTP.Post(authEndpoint, "application/json", Stringify(payload)); if (req.StatusCode === 200) { return ParseJSON(req.Response)[0].access_token; } throw new Error("获取访问令牌失败"); } // 获取指定ID的旅程详情 function getJourneyDetails(journeyId) { const token = getAccessToken(); const req = HTTP.Get(restEndpoint + journeyId, ["Authorization"], ["Bearer " + token]); if (req.StatusCode === 200) { return ParseJSON(req.Response)[0]; } throw new Error("获取旅程详情失败"); } // 提取旅程中的邮件活动信息 function extractEmailActivities(journey) { const emailActivities = []; if (journey?.activities) { journey.activities.forEach(activity => { if (activity.type === "EMAIL") { emailActivities.push({ activityName: activity.name, subject: activity.args.subject, senderProfileId: activity.args.senderProfileId, deliveryProfileId: activity.args.deliveryProfileId }); } }); } return emailActivities; } // 处理表单提交 if (Request.Method === "POST") { const journeyUrl = Request.GetFormField("journeyUrl"); const journeyId = extractJourneyId(journeyUrl); if (journeyId) { try { const journey = getJourneyDetails(journeyId); const emailActivities = extractEmailActivities(journey); Platform.Variable.SetValue("journey", journey); Platform.Variable.SetValue("emailActivities", emailActivities); } catch (e) { Platform.Variable.SetValue("error", e.message); } } else { Platform.Variable.SetValue("error", "无效的旅程链接"); } } </script>
3. 前端表单与结果渲染
在Cloud Page中添加交互表单和结果展示区域:
<form method="post"> <label>旅程链接:</label> <input type="text" name="journeyUrl" placeholder="输入激活/草稿状态的旅程链接" required> <button type="submit">获取详情</button> </form> %%[ var @error, @journey, @emailActivities set @error = RequestParameter("error") set @journey = RequestParameter("journey") set @emailActivities = RequestParameter("emailActivities") ]%% %%[ if not empty(@error) then ]%% <div style="color: red;">%%=v(@error)=%%</div> %%[ elseif not empty(@journey) then ]%% <h3>旅程设置</h3> <ul> <li>名称:%%=v(@journey.name)=%%</li> <li>状态:%%=v(@journey.status)=%%</li> <li>描述:%%=v(@journey.description)=%%</li> </ul> <h3>关联邮件列表</h3> <table border="1" cellpadding="8"> <tr> <th>邮件活动名称</th> <th>主题行</th> <th>发件人配置ID</th> <th>交付配置文件ID</th> </tr> %%[ set @emailCount = RowCount(@emailActivities) for @i = 1 to @emailCount do set @email = Row(@emailActivities, @i) ]%% <tr> <td>%%=Field(@email, "activityName")=%%</td> <td>%%=Field(@email, "subject")=%%</td> <td>%%=Field(@email, "senderProfileId")=%%</td> <td>%%=Field(@email, "deliveryProfileId")=%%</td> </tr> %%[ next @i ]%% </table> %%[ endif ]%%
三种技术方案能力对比
| 技术方式 | 能否获取完整旅程详情 | 优势 | 限制 |
|---|---|---|---|
| AMPScript | 仅支持有限元数据查询(如数据视图Lookup),无法获取关联邮件配置 | 语法简洁,适合基础数据渲染 | 无直接调用Journey Builder API的能力,功能受限 |
| SSJS | 结合API可获取全部详情 | 支持服务端HTTP请求,无需处理跨域 | 需要处理API认证逻辑,代码复杂度较高 |
| REST API | 完全支持获取所有旅程及关联资源信息 | 功能最全面,支持批量查询 | 需通过SSJS在服务端调用,无法直接在前端使用 |
关键注意事项
- 必须配置Server-to-Server集成,并赋予
journey_read、email_read等API权限,确保数据访问权限正常。 - 草稿状态的旅程可正常通过API获取,状态字段返回
Draft。 - 若需要展示发件人/交付配置文件的名称而非ID,可额外调用
/messaging/v1/sender-profiles/[ID]和/messaging/v1/delivery-profiles/[ID]接口获取详细信息。
内容的提问来源于stack exchange,提问作者norrinradd
相关产品推荐
相关产品推荐

