RCS Business 最強大且功能最多元的內容類型之一 訊息是複合式資訊卡。 使用複合式資訊卡時,您可以將整批相關資訊合併成單一 訊息,包含圖片或影片、標題、說明以及最多四則 建議的回覆或動作。
獨立的複合式資訊卡和複合式資訊卡輪轉介面具有強大的功能, 可協助您為使用者打造引人入勝的體驗只要 你需要分享的圖片是優待券或產品等靜態圖片。但 假如您需要根據使用者的相關資訊 傳送動態內容 例如登機證?
在本文件中,我將示範如何使用 HTML 和 方便你將圖片嵌入服務專員傳送的複合式資訊卡瞭解如何轉換 將 HTML 轉換為圖片
從 HTML 到圖片
HTML 很適合建立文字和媒體的組合。身為開發人員 我們需要建構產品,以便將登機證、資料 用量圖表或任何其他類型的使用者專屬資訊 產生的 HTML 可能是我們要使用的工具RCS Business Messaging 包含多媒體 資訊卡只支援圖片和影片媒體類型,因此如要使用 HTML 強大功能來生成動態內容,首先需要 並轉換成圖片
幸好,大部分的新型程式設計語言都支援資料庫 可轉譯至少基本 HTML 程式碼的網頁或元件 (適用於 例如 JEditorPane)、 可用來生成圖像
您也可以透過 API 拍照網頁,例如: Google 的 Page Insights API 可以透過網址自動產生螢幕擷取畫面
範例:
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?url=https://www.google.com&screenshot=true
在接下來的動作中,我們使用 Node.js Express 應用程式來產生特定的使用者 透過 HTML 將登機證轉換為圖片,然後公開上傳至 並附加複合式資訊卡中的圖片,以便傳送給使用者。
建立動態登機證
首先,我們需要產生 HTML 來產生登機證,如下所示 圖片。
完成此操作的方法有很多種,不過,我們要定義網址端點
顯示在名為 /getTicket?msisdn=+12223334444
的 Node.js 應用程式中
我們需要使用 EJS 檢視引擎提供登機證
假設有一個名為 getUserTicket
的函式會使用使用者的
電話號碼並傳回包含此類資訊的票券物件
出發時間、座位、票券類型和出發地點。
在 Express 應用程式的路由器中,我們會定義 getTicket
端點,並呼叫
getUserTicket
函式,並將票證傳送至 EJS 範本。
router.get('/getTicket', function(req, res, next) {
// Get the passed in phone number
let msisdn = req.body.msisdn;
// Get the ticket object for this user
let ticket = getUserTicket(msisdn);
// Render the ticket in HTML using an EJS template
res.render('ticket', {ticket: ticket});
});
票券 EJS 範本會定義下列 HTML 以轉譯 Bonjour 範例 火車票。
<div>
<div>
<div class="left"><img width="200" src="/images/bonjour-rail-logo.png" /></div>
<div class="right muted-text"><%= ticket.dateOfDeparture; %></div>
<div class="cl"></div>
</div>
<div>
<div class="left highlighted-text-color"><h2><%= ticket.startingLocation.city %></h2><br/><%= ticket.startingLocation.station %></div>
<div class="right highlighted-text-color"><h2><%= ticket.endingLocation.city %></h2><br/><%= ticket.endingLocation.station %></div>
<div class="cl"></div>
</div>
<div>
<div class="left">
<h3>PLATFORM <%= ticket.platform %></h3>
<div>
<div class="left">
<div><h4>DEPART</h4></div>
<div><%= ticket.departureTime %></div>
</div>
<div class="left">
<div><h4>ARRIVE</h4></div>
<div><%= ticket.arrivalTime %></div>
</div>
<div class="cl"></div>
</div>
<div>
<div class="left">
<div><h4>TICKET TYPE</h4></div>
<div><%= ticket.ticketType %></div>
</div>
<div class="left">
<div><h4>SEAT</h4></div>
<div><%= ticket.seat %></div>
</div>
<div class="cl"></div>
</div>
</div>
<div class="right">
<img src="<%= ticket.qrCode %>" width="170" />
</div>
<div class="cl"></div>
</div>
</div>
使用 HTML 建立圖片
我們已經定義 HTML 來建立登機證,但必須 並轉換成圖片
有許多開放原始碼 Node.js 模組可用於轉換兩種原始 HTML 轉換為圖片為了方便說明,我們要使用 node-webshot 這是 PhantomJS 周圍的光包裝函式。
PhantomJS 是可以執行程式碼的無指令碼瀏覽器,能將 HTML 轉譯成圖片。 由於 PhantomJS 依賴 WebKit 進行轉譯,因此可以在 包括圖像、CSS 和 JavaScript
安裝節點 webshot (npm install --save node-webshot
) 後,進行轉換
轉換為圖片的 HTML 很簡單。
var webshot = require('node-webshot');
let url = '/getTicket?msisdn=' + msisdn;
let htmlAsImageFileLocation = 'ticket.png';
// Define screenshot options
var options = {
screenSize: {
width: 550,
height: 450
},
shotSize: {
width: 550,
height: 450
},
userAgent: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g'
};
// Save html as an image
webshot(url, htmlAsImageFileLocation, options, function(err) {
// TODO: Upload image to a publicly accessible URL
});
將檔案儲存到可公開存取的網址
如要使用 Webshot 生成的圖片,我們需要開放大眾存取的圖片 網址。如果您在專用網路伺服器上產生圖片,或許可以 將檔案儲存到公用資料夾,但在本範例中,我們要上傳 將檔案上傳至 Google Cloud Storage。
下列函式會擷取本機圖片位置,並將其上傳至 Google Cloud Storage,傳回新建立的媒體連結。
function uploadImage(imageLocation) {
const {Storage} = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
// Define the Cloud storage location and filename
const bucketName = 'sample-image-uploads';
const yourFileDestination = 'uploaded-image.png';
// Set the options for the upload to be readable by anyone
const options = {
destination: yourFileDestination,
predefinedAcl: 'publicRead'
};
// Return a promise that includes the storage upload
return new Promise(function(resolve, reject) {
// Uploads a local file to the bucket
storage.bucket(bucketName).upload(imageLocation, options)
.then(results => {
// Return the image URL
resolve(results[0].metadata.mediaLink);
}).catch(error => {
reject(error);
});
});
}
接下來,我們需要將之前註解的 TODO
替換為呼叫,以便使用
這個 uploadImage
函式。
// Save html as image
webshot(url, htmlAsImageFileLocation, options, function(err) {
let uploadRequest = uploadImage(filename);
uploadRequest.then(function(imageUrl) {
// TODO: Use the imageUrl in a rich card to send to the user
});
});
傳送含有圖片的複合式資訊卡
就快完成了。完成最後一步
sendBoardingPass(imageUrl, msisdn)
函式,可建立 RBM 複合式資訊卡
並傳送給使用者
如要透過 RBM 傳送複合式資訊卡,我使用 第一個代理程式範例。
function sendBoardingPass(imageUrl, msisdn) {
let title = 'Here is your boarding pass.';
let suggestions = [
{
reply: {
text: 'See more options',
postbackData: 'more_options',
}
},
];
let params = {
messageText: title,
msisdn: msisdn,
imageUrl: imageUrl,
suggestions: suggestions,
height: 'TALL',
};
// Send the boarding pass
rbmApiHelper.sendRichCard(params);
}
以下是最終結果的螢幕截圖。
總結與摘要
想讓複合式資訊卡發揮更多功用,最簡單的方法就是使用動態 HTML 並將 HTML 轉換為圖片大部分新型程式設計語言支援 協助您完成轉換的程式庫或 API。您可能需要 嘗試調整圖片大小 讓圖片看起來符合您的用途 不過在 Shorts 中製作更吸引人的圖像 RBM 服務專員。
祝您編寫程式一切順利!