new(whatsapp.gblib): FB Analytics.
This commit is contained in:
parent
4010fca0cf
commit
52dbc5a109
2 changed files with 85 additions and 0 deletions
|
@ -55,6 +55,18 @@ export class QualityDialog extends IGBDialog {
|
||||||
public static setup(bot: BotAdapter, min: GBMinInstance) {
|
public static setup(bot: BotAdapter, min: GBMinInstance) {
|
||||||
const service = new CSService();
|
const service = new CSService();
|
||||||
|
|
||||||
|
min.dialogs.add(
|
||||||
|
new WaterfallDialog('/report', [
|
||||||
|
async step => {
|
||||||
|
const locale = step.context.activity.locale;
|
||||||
|
await min.conversationalService.sendText(min, step, await min.whatsAppDirectLine.getLatestCampaignReport());
|
||||||
|
return await step.replaceDialog('/ask', { isReturning: true });
|
||||||
|
}
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
min.dialogs.add(
|
min.dialogs.add(
|
||||||
new WaterfallDialog('/check', [
|
new WaterfallDialog('/check', [
|
||||||
async step => {
|
async step => {
|
||||||
|
|
|
@ -1540,4 +1540,77 @@ private async sendButtonList(to: string, buttons: string[]) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getLatestCampaignReport() {
|
||||||
|
const businessAccountId = this.whatsappBusinessManagerId;
|
||||||
|
const userAccessToken = this.whatsappServiceKey;
|
||||||
|
|
||||||
|
if (!(businessAccountId && userAccessToken)){
|
||||||
|
return 'No report for campaigns.';
|
||||||
|
}
|
||||||
|
|
||||||
|
let campaignData;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Step 1: Fetch the latest campaign data
|
||||||
|
const campaignResponse = await fetch(
|
||||||
|
`https://graph.facebook.com/v20.0/${businessAccountId}/message_campaigns?` +
|
||||||
|
`fields=id,name,status,message_template_name,language,` +
|
||||||
|
`scheduled_time,completed_time,audience_size,delivered_count,read_count&` +
|
||||||
|
`limit=1&order=created_time_desc`, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${userAccessToken}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await campaignResponse.json();
|
||||||
|
if (!campaignResponse.ok) {
|
||||||
|
throw new Error(data.error.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.data || data.data.length === 0) {
|
||||||
|
throw new Error('No campaigns found');
|
||||||
|
}
|
||||||
|
|
||||||
|
campaignData = data.data[0];
|
||||||
|
console.log('Latest campaign retrieved:', campaignData.name);
|
||||||
|
|
||||||
|
// Step 2: Calculate key metrics
|
||||||
|
const metrics = {
|
||||||
|
name: campaignData.name,
|
||||||
|
status: campaignData.status,
|
||||||
|
template: campaignData.message_template_name,
|
||||||
|
language: campaignData.language,
|
||||||
|
timing: campaignData.completed_time || campaignData.scheduled_time,
|
||||||
|
audience: campaignData.audience_size,
|
||||||
|
delivered: campaignData.delivered_count,
|
||||||
|
read: campaignData.read_count,
|
||||||
|
deliveryRate: ((campaignData.delivered_count / campaignData.audience_size) * 100).toFixed(2),
|
||||||
|
readRate: ((campaignData.read_count / campaignData.delivered_count) * 100).toFixed(2)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 3: Format and return the report
|
||||||
|
return `
|
||||||
|
Latest Campaign Summary
|
||||||
|
----------------------
|
||||||
|
Name: ${metrics.name}
|
||||||
|
Status: ${metrics.status}
|
||||||
|
Template: ${metrics.template}
|
||||||
|
Language: ${metrics.language}
|
||||||
|
Time: ${new Date(metrics.timing).toLocaleString()}
|
||||||
|
|
||||||
|
Metrics
|
||||||
|
-------
|
||||||
|
Audience Size: ${metrics.audience.toLocaleString()}
|
||||||
|
Delivered: ${metrics.delivered.toLocaleString()}
|
||||||
|
Read: ${metrics.read.toLocaleString()}
|
||||||
|
Delivery Rate: ${metrics.deliveryRate}%
|
||||||
|
Read Rate: ${metrics.readRate}%
|
||||||
|
`.trim();
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching campaign data:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue