@memberjunction/actions-bizapps-social 2.111.0 → 2.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +6 -6
- package/dist/base/base-social.action.d.ts.map +1 -1
- package/dist/base/base-social.action.js +18 -24
- package/dist/base/base-social.action.js.map +1 -1
- package/dist/providers/buffer/buffer-base.action.d.ts.map +1 -1
- package/dist/providers/buffer/buffer-base.action.js +35 -34
- package/dist/providers/buffer/buffer-base.action.js.map +1 -1
- package/dist/providers/facebook/actions/boost-post.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/boost-post.action.js +33 -33
- package/dist/providers/facebook/actions/boost-post.action.js.map +1 -1
- package/dist/providers/facebook/actions/create-album.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/create-album.action.js +34 -36
- package/dist/providers/facebook/actions/create-album.action.js.map +1 -1
- package/dist/providers/facebook/actions/create-post.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/create-post.action.js +20 -20
- package/dist/providers/facebook/actions/create-post.action.js.map +1 -1
- package/dist/providers/facebook/actions/get-page-insights.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/get-page-insights.action.js +25 -27
- package/dist/providers/facebook/actions/get-page-insights.action.js.map +1 -1
- package/dist/providers/facebook/actions/get-page-posts.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/get-page-posts.action.js +19 -23
- package/dist/providers/facebook/actions/get-page-posts.action.js.map +1 -1
- package/dist/providers/facebook/actions/get-post-insights.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/get-post-insights.action.js +28 -32
- package/dist/providers/facebook/actions/get-post-insights.action.js.map +1 -1
- package/dist/providers/facebook/actions/respond-to-comments.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/respond-to-comments.action.js +42 -44
- package/dist/providers/facebook/actions/respond-to-comments.action.js.map +1 -1
- package/dist/providers/facebook/actions/schedule-post.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/schedule-post.action.js +29 -29
- package/dist/providers/facebook/actions/schedule-post.action.js.map +1 -1
- package/dist/providers/facebook/actions/search-posts.action.d.ts.map +1 -1
- package/dist/providers/facebook/actions/search-posts.action.js +37 -39
- package/dist/providers/facebook/actions/search-posts.action.js.map +1 -1
- package/dist/providers/facebook/facebook-base.action.d.ts.map +1 -1
- package/dist/providers/facebook/facebook-base.action.js +44 -59
- package/dist/providers/facebook/facebook-base.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js +33 -31
- package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/create-scheduled-post.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/create-scheduled-post.action.js +28 -32
- package/dist/providers/hootsuite/actions/create-scheduled-post.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/delete-scheduled-post.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js +19 -19
- package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/get-analytics.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/get-analytics.action.js +24 -26
- package/dist/providers/hootsuite/actions/get-analytics.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/get-scheduled-posts.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js +22 -22
- package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/get-social-profiles.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/get-social-profiles.action.js +32 -34
- package/dist/providers/hootsuite/actions/get-social-profiles.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/search-posts.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/search-posts.action.js +43 -52
- package/dist/providers/hootsuite/actions/search-posts.action.js.map +1 -1
- package/dist/providers/hootsuite/actions/update-scheduled-post.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/actions/update-scheduled-post.action.js +30 -28
- package/dist/providers/hootsuite/actions/update-scheduled-post.action.js.map +1 -1
- package/dist/providers/hootsuite/hootsuite-base.action.d.ts.map +1 -1
- package/dist/providers/hootsuite/hootsuite-base.action.js +18 -20
- package/dist/providers/hootsuite/hootsuite-base.action.js.map +1 -1
- package/dist/providers/instagram/actions/create-post.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/create-post.action.js +27 -26
- package/dist/providers/instagram/actions/create-post.action.js.map +1 -1
- package/dist/providers/instagram/actions/create-story.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/create-story.action.js +35 -35
- package/dist/providers/instagram/actions/create-story.action.js.map +1 -1
- package/dist/providers/instagram/actions/get-account-insights.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/get-account-insights.action.js +38 -59
- package/dist/providers/instagram/actions/get-account-insights.action.js.map +1 -1
- package/dist/providers/instagram/actions/get-business-posts.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/get-business-posts.action.js +29 -29
- package/dist/providers/instagram/actions/get-business-posts.action.js.map +1 -1
- package/dist/providers/instagram/actions/get-comments.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/get-comments.action.js +36 -36
- package/dist/providers/instagram/actions/get-comments.action.js.map +1 -1
- package/dist/providers/instagram/actions/get-post-insights.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/get-post-insights.action.js +23 -25
- package/dist/providers/instagram/actions/get-post-insights.action.js.map +1 -1
- package/dist/providers/instagram/actions/schedule-post.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/schedule-post.action.js +25 -25
- package/dist/providers/instagram/actions/schedule-post.action.js.map +1 -1
- package/dist/providers/instagram/actions/search-posts.action.d.ts.map +1 -1
- package/dist/providers/instagram/actions/search-posts.action.js +56 -60
- package/dist/providers/instagram/actions/search-posts.action.js.map +1 -1
- package/dist/providers/instagram/instagram-base.action.d.ts.map +1 -1
- package/dist/providers/instagram/instagram-base.action.js +25 -27
- package/dist/providers/instagram/instagram-base.action.js.map +1 -1
- package/dist/providers/linkedin/actions/create-article.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/create-article.action.js +55 -45
- package/dist/providers/linkedin/actions/create-article.action.js.map +1 -1
- package/dist/providers/linkedin/actions/create-post.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/create-post.action.js +31 -29
- package/dist/providers/linkedin/actions/create-post.action.js.map +1 -1
- package/dist/providers/linkedin/actions/get-followers.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/get-followers.action.js +28 -28
- package/dist/providers/linkedin/actions/get-followers.action.js.map +1 -1
- package/dist/providers/linkedin/actions/get-organization-posts.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/get-organization-posts.action.js +20 -20
- package/dist/providers/linkedin/actions/get-organization-posts.action.js.map +1 -1
- package/dist/providers/linkedin/actions/get-personal-posts.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/get-personal-posts.action.js +19 -19
- package/dist/providers/linkedin/actions/get-personal-posts.action.js.map +1 -1
- package/dist/providers/linkedin/actions/get-post-analytics.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/get-post-analytics.action.js +25 -23
- package/dist/providers/linkedin/actions/get-post-analytics.action.js.map +1 -1
- package/dist/providers/linkedin/actions/schedule-post.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/schedule-post.action.js +32 -30
- package/dist/providers/linkedin/actions/schedule-post.action.js.map +1 -1
- package/dist/providers/linkedin/actions/search-posts.action.d.ts.map +1 -1
- package/dist/providers/linkedin/actions/search-posts.action.js +28 -30
- package/dist/providers/linkedin/actions/search-posts.action.js.map +1 -1
- package/dist/providers/linkedin/linkedin-base.action.d.ts.map +1 -1
- package/dist/providers/linkedin/linkedin-base.action.js +33 -38
- package/dist/providers/linkedin/linkedin-base.action.js.map +1 -1
- package/dist/providers/tiktok/tiktok-base.action.d.ts.map +1 -1
- package/dist/providers/tiktok/tiktok-base.action.js +25 -26
- package/dist/providers/tiktok/tiktok-base.action.js.map +1 -1
- package/dist/providers/twitter/actions/create-thread.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/create-thread.action.js +25 -29
- package/dist/providers/twitter/actions/create-thread.action.js.map +1 -1
- package/dist/providers/twitter/actions/create-tweet.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/create-tweet.action.js +23 -23
- package/dist/providers/twitter/actions/create-tweet.action.js.map +1 -1
- package/dist/providers/twitter/actions/delete-tweet.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/delete-tweet.action.js +19 -19
- package/dist/providers/twitter/actions/delete-tweet.action.js.map +1 -1
- package/dist/providers/twitter/actions/get-analytics.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/get-analytics.action.js +40 -47
- package/dist/providers/twitter/actions/get-analytics.action.js.map +1 -1
- package/dist/providers/twitter/actions/get-mentions.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/get-mentions.action.js +30 -31
- package/dist/providers/twitter/actions/get-mentions.action.js.map +1 -1
- package/dist/providers/twitter/actions/get-timeline.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/get-timeline.action.js +29 -29
- package/dist/providers/twitter/actions/get-timeline.action.js.map +1 -1
- package/dist/providers/twitter/actions/schedule-tweet.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/schedule-tweet.action.js +26 -26
- package/dist/providers/twitter/actions/schedule-tweet.action.js.map +1 -1
- package/dist/providers/twitter/actions/search-tweets.action.d.ts.map +1 -1
- package/dist/providers/twitter/actions/search-tweets.action.js +56 -58
- package/dist/providers/twitter/actions/search-tweets.action.js.map +1 -1
- package/dist/providers/twitter/twitter-base.action.d.ts.map +1 -1
- package/dist/providers/twitter/twitter-base.action.js +58 -68
- package/dist/providers/twitter/twitter-base.action.js.map +1 -1
- package/dist/providers/youtube/youtube-base.action.d.ts +1 -1
- package/dist/providers/youtube/youtube-base.action.d.ts.map +1 -1
- package/dist/providers/youtube/youtube-base.action.js +22 -25
- package/dist/providers/youtube/youtube-base.action.js.map +1 -1
- package/package.json +5 -6
- package/src/base/base-social.action.ts +217 -224
- package/src/providers/buffer/buffer-base.action.ts +435 -441
- package/src/providers/facebook/actions/boost-post.action.ts +350 -386
- package/src/providers/facebook/actions/create-album.action.ts +291 -307
- package/src/providers/facebook/actions/create-post.action.ts +224 -227
- package/src/providers/facebook/actions/get-page-insights.action.ts +383 -403
- package/src/providers/facebook/actions/get-page-posts.action.ts +214 -225
- package/src/providers/facebook/actions/get-post-insights.action.ts +300 -316
- package/src/providers/facebook/actions/respond-to-comments.action.ts +319 -336
- package/src/providers/facebook/actions/schedule-post.action.ts +289 -292
- package/src/providers/facebook/actions/search-posts.action.ts +399 -413
- package/src/providers/facebook/facebook-base.action.ts +653 -670
- package/src/providers/hootsuite/actions/bulk-schedule-posts.action.ts +257 -257
- package/src/providers/hootsuite/actions/create-scheduled-post.action.ts +184 -189
- package/src/providers/hootsuite/actions/delete-scheduled-post.action.ts +160 -161
- package/src/providers/hootsuite/actions/get-analytics.action.ts +249 -254
- package/src/providers/hootsuite/actions/get-scheduled-posts.action.ts +206 -207
- package/src/providers/hootsuite/actions/get-social-profiles.action.ts +206 -205
- package/src/providers/hootsuite/actions/search-posts.action.ts +351 -369
- package/src/providers/hootsuite/actions/update-scheduled-post.action.ts +211 -209
- package/src/providers/hootsuite/hootsuite-base.action.ts +301 -307
- package/src/providers/instagram/actions/create-post.action.ts +276 -296
- package/src/providers/instagram/actions/create-story.action.ts +378 -394
- package/src/providers/instagram/actions/get-account-insights.action.ts +384 -420
- package/src/providers/instagram/actions/get-business-posts.action.ts +233 -242
- package/src/providers/instagram/actions/get-comments.action.ts +365 -377
- package/src/providers/instagram/actions/get-post-insights.action.ts +265 -273
- package/src/providers/instagram/actions/schedule-post.action.ts +233 -235
- package/src/providers/instagram/actions/search-posts.action.ts +512 -538
- package/src/providers/instagram/instagram-base.action.ts +368 -393
- package/src/providers/linkedin/actions/create-article.action.ts +275 -266
- package/src/providers/linkedin/actions/create-post.action.ts +179 -177
- package/src/providers/linkedin/actions/get-followers.action.ts +211 -211
- package/src/providers/linkedin/actions/get-organization-posts.action.ts +146 -147
- package/src/providers/linkedin/actions/get-personal-posts.action.ts +138 -139
- package/src/providers/linkedin/actions/get-post-analytics.action.ts +190 -189
- package/src/providers/linkedin/actions/schedule-post.action.ts +191 -189
- package/src/providers/linkedin/actions/search-posts.action.ts +275 -283
- package/src/providers/linkedin/linkedin-base.action.ts +407 -421
- package/src/providers/tiktok/tiktok-base.action.ts +305 -320
- package/src/providers/twitter/actions/create-thread.action.ts +203 -207
- package/src/providers/twitter/actions/create-tweet.action.ts +187 -188
- package/src/providers/twitter/actions/delete-tweet.action.ts +128 -129
- package/src/providers/twitter/actions/get-analytics.action.ts +402 -411
- package/src/providers/twitter/actions/get-mentions.action.ts +218 -219
- package/src/providers/twitter/actions/get-timeline.action.ts +232 -233
- package/src/providers/twitter/actions/schedule-tweet.action.ts +221 -222
- package/src/providers/twitter/actions/search-tweets.action.ts +540 -543
- package/src/providers/twitter/twitter-base.action.ts +541 -560
- package/src/providers/youtube/youtube-base.action.ts +320 -333
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { RegisterClass } from '@memberjunction/global';
|
|
2
2
|
import { InstagramBaseAction } from '../instagram-base.action';
|
|
3
3
|
import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
|
|
4
|
-
import { LogError } from '@memberjunction/
|
|
4
|
+
import { LogError } from '@memberjunction/global';
|
|
5
5
|
import { BaseAction } from '@memberjunction/actions';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -10,441 +10,405 @@ import { BaseAction } from '@memberjunction/actions';
|
|
|
10
10
|
*/
|
|
11
11
|
@RegisterClass(BaseAction, 'Instagram - Get Account Insights')
|
|
12
12
|
export class InstagramGetAccountInsightsAction extends InstagramBaseAction {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
Success: false,
|
|
98
|
-
Message: 'Instagram API rate limit exceeded. Please try again later.',
|
|
99
|
-
ResultCode: 'RATE_LIMIT'
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (error.code === 'INSUFFICIENT_PERMISSIONS') {
|
|
104
|
-
return {
|
|
105
|
-
Success: false,
|
|
106
|
-
Message: 'Insufficient permissions to access Instagram account insights',
|
|
107
|
-
ResultCode: 'INSUFFICIENT_PERMISSIONS'
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
Success: false,
|
|
113
|
-
Message: `Failed to retrieve account insights: ${error.message}`,
|
|
114
|
-
ResultCode: 'ERROR'
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
13
|
+
protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
|
|
14
|
+
try {
|
|
15
|
+
const companyIntegrationId = this.getParamValue(params.Params, 'CompanyIntegrationID');
|
|
16
|
+
const period = this.getParamValue(params.Params, 'Period') || 'day';
|
|
17
|
+
const startDate = this.getParamValue(params.Params, 'StartDate');
|
|
18
|
+
const endDate = this.getParamValue(params.Params, 'EndDate');
|
|
19
|
+
const includeDemographics = this.getParamValue(params.Params, 'IncludeDemographics') !== false;
|
|
20
|
+
|
|
21
|
+
// Initialize OAuth
|
|
22
|
+
if (!(await this.initializeOAuth(companyIntegrationId))) {
|
|
23
|
+
return {
|
|
24
|
+
Success: false,
|
|
25
|
+
Message: 'Failed to initialize Instagram authentication',
|
|
26
|
+
ResultCode: 'AUTH_FAILED',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Define metrics based on period
|
|
31
|
+
const metrics = this.getAccountMetrics(period);
|
|
32
|
+
|
|
33
|
+
// Get account insights
|
|
34
|
+
const insights = await this.getInsights(this.instagramBusinessAccountId, metrics, period as any);
|
|
35
|
+
|
|
36
|
+
// Parse insights data
|
|
37
|
+
const parsedInsights = this.parseAccountInsights(insights);
|
|
38
|
+
|
|
39
|
+
// Get account info
|
|
40
|
+
const accountInfo = await this.getAccountInfo();
|
|
41
|
+
|
|
42
|
+
// Get demographics if requested
|
|
43
|
+
let demographics = null;
|
|
44
|
+
if (includeDemographics) {
|
|
45
|
+
demographics = await this.getAccountDemographics();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Get content performance summary
|
|
49
|
+
const contentSummary = await this.getContentPerformanceSummary(startDate, endDate);
|
|
50
|
+
|
|
51
|
+
// Calculate growth metrics
|
|
52
|
+
const growthMetrics = this.calculateGrowthMetrics(parsedInsights, accountInfo);
|
|
53
|
+
|
|
54
|
+
// Store result in output params
|
|
55
|
+
const outputParams = [...params.Params];
|
|
56
|
+
outputParams.push({
|
|
57
|
+
Name: 'ResultData',
|
|
58
|
+
Type: 'Output',
|
|
59
|
+
Value: JSON.stringify({
|
|
60
|
+
account: {
|
|
61
|
+
id: this.instagramBusinessAccountId,
|
|
62
|
+
username: accountInfo.username,
|
|
63
|
+
name: accountInfo.name,
|
|
64
|
+
biography: accountInfo.biography,
|
|
65
|
+
followersCount: accountInfo.followers_count,
|
|
66
|
+
followsCount: accountInfo.follows_count,
|
|
67
|
+
mediaCount: accountInfo.media_count,
|
|
68
|
+
profilePictureUrl: accountInfo.profile_picture_url,
|
|
69
|
+
websiteUrl: accountInfo.website,
|
|
70
|
+
},
|
|
71
|
+
insights: parsedInsights,
|
|
72
|
+
demographics,
|
|
73
|
+
growth: growthMetrics,
|
|
74
|
+
contentPerformance: contentSummary,
|
|
75
|
+
period,
|
|
76
|
+
dataCollectedAt: new Date().toISOString(),
|
|
77
|
+
}),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
Success: true,
|
|
82
|
+
Message: 'Successfully retrieved Instagram account insights',
|
|
83
|
+
ResultCode: 'SUCCESS',
|
|
84
|
+
Params: outputParams,
|
|
85
|
+
};
|
|
86
|
+
} catch (error: any) {
|
|
87
|
+
LogError('Failed to retrieve Instagram account insights', error);
|
|
88
|
+
|
|
89
|
+
if (error.code === 'RATE_LIMIT') {
|
|
90
|
+
return {
|
|
91
|
+
Success: false,
|
|
92
|
+
Message: 'Instagram API rate limit exceeded. Please try again later.',
|
|
93
|
+
ResultCode: 'RATE_LIMIT',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
118
96
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
'profile_views',
|
|
127
|
-
'website_clicks'
|
|
128
|
-
];
|
|
129
|
-
|
|
130
|
-
if (period === 'day') {
|
|
131
|
-
return [
|
|
132
|
-
...baseMetrics,
|
|
133
|
-
'follower_count',
|
|
134
|
-
'email_contacts',
|
|
135
|
-
'phone_call_clicks',
|
|
136
|
-
'text_message_clicks',
|
|
137
|
-
'get_directions_clicks'
|
|
138
|
-
];
|
|
139
|
-
} else if (period === 'week' || period === 'days_28') {
|
|
140
|
-
return [
|
|
141
|
-
...baseMetrics,
|
|
142
|
-
'accounts_engaged'
|
|
143
|
-
];
|
|
144
|
-
}
|
|
97
|
+
if (error.code === 'INSUFFICIENT_PERMISSIONS') {
|
|
98
|
+
return {
|
|
99
|
+
Success: false,
|
|
100
|
+
Message: 'Insufficient permissions to access Instagram account insights',
|
|
101
|
+
ResultCode: 'INSUFFICIENT_PERMISSIONS',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
145
104
|
|
|
146
|
-
|
|
105
|
+
return {
|
|
106
|
+
Success: false,
|
|
107
|
+
Message: `Failed to retrieve account insights: ${error.message}`,
|
|
108
|
+
ResultCode: 'ERROR',
|
|
109
|
+
};
|
|
147
110
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
return response;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Get appropriate metrics based on period
|
|
115
|
+
*/
|
|
116
|
+
private getAccountMetrics(period: string): string[] {
|
|
117
|
+
const baseMetrics = ['impressions', 'reach', 'profile_views', 'website_clicks'];
|
|
118
|
+
|
|
119
|
+
if (period === 'day') {
|
|
120
|
+
return [...baseMetrics, 'follower_count', 'email_contacts', 'phone_call_clicks', 'text_message_clicks', 'get_directions_clicks'];
|
|
121
|
+
} else if (period === 'week' || period === 'days_28') {
|
|
122
|
+
return [...baseMetrics, 'accounts_engaged'];
|
|
164
123
|
}
|
|
165
124
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
LogError('Failed to get demographics', error);
|
|
222
|
-
return null;
|
|
125
|
+
return baseMetrics;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Get account information
|
|
130
|
+
*/
|
|
131
|
+
private async getAccountInfo(): Promise<any> {
|
|
132
|
+
const response = await this.makeInstagramRequest(this.instagramBusinessAccountId, 'GET', null, {
|
|
133
|
+
fields: 'username,name,biography,followers_count,follows_count,media_count,profile_picture_url,website',
|
|
134
|
+
access_token: this.getAccessToken(),
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return response;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Get account demographics
|
|
142
|
+
*/
|
|
143
|
+
private async getAccountDemographics(): Promise<any> {
|
|
144
|
+
try {
|
|
145
|
+
// Get follower demographics
|
|
146
|
+
const demographicMetrics = ['audience_city', 'audience_country', 'audience_gender_age', 'audience_locale', 'online_followers'];
|
|
147
|
+
|
|
148
|
+
const demographics = await this.getInsights(this.instagramBusinessAccountId, demographicMetrics, 'lifetime');
|
|
149
|
+
|
|
150
|
+
// Parse demographic data
|
|
151
|
+
const parsed: any = {
|
|
152
|
+
locations: {
|
|
153
|
+
cities: {},
|
|
154
|
+
countries: {},
|
|
155
|
+
},
|
|
156
|
+
genderAge: {},
|
|
157
|
+
languages: {},
|
|
158
|
+
onlineHours: {},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
demographics.forEach((metric: any) => {
|
|
162
|
+
const value = metric.values?.[0]?.value;
|
|
163
|
+
|
|
164
|
+
switch (metric.name) {
|
|
165
|
+
case 'audience_city':
|
|
166
|
+
parsed.locations.cities = value || {};
|
|
167
|
+
break;
|
|
168
|
+
case 'audience_country':
|
|
169
|
+
parsed.locations.countries = value || {};
|
|
170
|
+
break;
|
|
171
|
+
case 'audience_gender_age':
|
|
172
|
+
parsed.genderAge = this.parseGenderAge(value || {});
|
|
173
|
+
break;
|
|
174
|
+
case 'audience_locale':
|
|
175
|
+
parsed.languages = value || {};
|
|
176
|
+
break;
|
|
177
|
+
case 'online_followers':
|
|
178
|
+
parsed.onlineHours = this.parseOnlineHours(value || {});
|
|
179
|
+
break;
|
|
223
180
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Parse gender/age demographics
|
|
228
|
-
*/
|
|
229
|
-
private parseGenderAge(data: any): any {
|
|
230
|
-
const parsed: any = {
|
|
231
|
-
male: {},
|
|
232
|
-
female: {},
|
|
233
|
-
unknown: {}
|
|
234
|
-
};
|
|
181
|
+
});
|
|
235
182
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
return parsed;
|
|
183
|
+
return parsed;
|
|
184
|
+
} catch (error) {
|
|
185
|
+
LogError('Failed to get demographics', error);
|
|
186
|
+
return null;
|
|
244
187
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Parse gender/age demographics
|
|
192
|
+
*/
|
|
193
|
+
private parseGenderAge(data: any): any {
|
|
194
|
+
const parsed: any = {
|
|
195
|
+
male: {},
|
|
196
|
+
female: {},
|
|
197
|
+
unknown: {},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
Object.keys(data).forEach((key) => {
|
|
201
|
+
const [gender, ageRange] = key.split('.');
|
|
202
|
+
if (parsed[gender]) {
|
|
203
|
+
parsed[gender][ageRange] = data[key];
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
return parsed;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Parse online hours data
|
|
212
|
+
*/
|
|
213
|
+
private parseOnlineHours(data: any): any {
|
|
214
|
+
const parsed: any = {};
|
|
215
|
+
|
|
216
|
+
Object.keys(data).forEach((hour) => {
|
|
217
|
+
parsed[hour] = {
|
|
218
|
+
count: data[hour],
|
|
219
|
+
hour: parseInt(hour),
|
|
220
|
+
label: `${hour}:00`,
|
|
221
|
+
};
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
return parsed;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Get content performance summary
|
|
229
|
+
*/
|
|
230
|
+
private async getContentPerformanceSummary(startDate?: string, endDate?: string): Promise<any> {
|
|
231
|
+
try {
|
|
232
|
+
// Get recent posts
|
|
233
|
+
const queryParams: any = {
|
|
234
|
+
fields: 'id,media_type,like_count,comments_count,timestamp',
|
|
235
|
+
access_token: this.getAccessToken(),
|
|
236
|
+
limit: 50,
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
if (startDate) {
|
|
240
|
+
queryParams.since = Math.floor(new Date(startDate).getTime() / 1000);
|
|
241
|
+
}
|
|
242
|
+
if (endDate) {
|
|
243
|
+
queryParams.until = Math.floor(new Date(endDate).getTime() / 1000);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const response = await this.makeInstagramRequest<{ data: any[] }>(
|
|
247
|
+
`${this.instagramBusinessAccountId}/media`,
|
|
248
|
+
'GET',
|
|
249
|
+
null,
|
|
250
|
+
queryParams
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
const posts = response.data || [];
|
|
254
|
+
|
|
255
|
+
// Calculate performance metrics
|
|
256
|
+
const summary = {
|
|
257
|
+
totalPosts: posts.length,
|
|
258
|
+
avgLikes: 0,
|
|
259
|
+
avgComments: 0,
|
|
260
|
+
totalEngagements: 0,
|
|
261
|
+
topPerformingPost: null as any,
|
|
262
|
+
mediaTypeBreakdown: {
|
|
263
|
+
IMAGE: 0,
|
|
264
|
+
VIDEO: 0,
|
|
265
|
+
CAROUSEL_ALBUM: 0,
|
|
266
|
+
REELS: 0,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
if (posts.length > 0) {
|
|
271
|
+
let totalLikes = 0;
|
|
272
|
+
let totalComments = 0;
|
|
273
|
+
let topPost = posts[0];
|
|
274
|
+
|
|
275
|
+
posts.forEach((post) => {
|
|
276
|
+
totalLikes += post.like_count || 0;
|
|
277
|
+
totalComments += post.comments_count || 0;
|
|
278
|
+
|
|
279
|
+
// Track media types
|
|
280
|
+
if (summary.mediaTypeBreakdown[post.media_type] !== undefined) {
|
|
281
|
+
summary.mediaTypeBreakdown[post.media_type]++;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Find top performing post
|
|
285
|
+
const engagement = (post.like_count || 0) + (post.comments_count || 0);
|
|
286
|
+
const topEngagement = (topPost.like_count || 0) + (topPost.comments_count || 0);
|
|
287
|
+
if (engagement > topEngagement) {
|
|
288
|
+
topPost = post;
|
|
289
|
+
}
|
|
258
290
|
});
|
|
259
291
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
access_token: this.getAccessToken(),
|
|
272
|
-
limit: 50
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
if (startDate) {
|
|
276
|
-
queryParams.since = Math.floor(new Date(startDate).getTime() / 1000);
|
|
277
|
-
}
|
|
278
|
-
if (endDate) {
|
|
279
|
-
queryParams.until = Math.floor(new Date(endDate).getTime() / 1000);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const response = await this.makeInstagramRequest<{ data: any[] }>(
|
|
283
|
-
`${this.instagramBusinessAccountId}/media`,
|
|
284
|
-
'GET',
|
|
285
|
-
null,
|
|
286
|
-
queryParams
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
const posts = response.data || [];
|
|
290
|
-
|
|
291
|
-
// Calculate performance metrics
|
|
292
|
-
const summary = {
|
|
293
|
-
totalPosts: posts.length,
|
|
294
|
-
avgLikes: 0,
|
|
295
|
-
avgComments: 0,
|
|
296
|
-
totalEngagements: 0,
|
|
297
|
-
topPerformingPost: null as any,
|
|
298
|
-
mediaTypeBreakdown: {
|
|
299
|
-
IMAGE: 0,
|
|
300
|
-
VIDEO: 0,
|
|
301
|
-
CAROUSEL_ALBUM: 0,
|
|
302
|
-
REELS: 0
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
if (posts.length > 0) {
|
|
307
|
-
let totalLikes = 0;
|
|
308
|
-
let totalComments = 0;
|
|
309
|
-
let topPost = posts[0];
|
|
310
|
-
|
|
311
|
-
posts.forEach(post => {
|
|
312
|
-
totalLikes += post.like_count || 0;
|
|
313
|
-
totalComments += post.comments_count || 0;
|
|
314
|
-
|
|
315
|
-
// Track media types
|
|
316
|
-
if (summary.mediaTypeBreakdown[post.media_type] !== undefined) {
|
|
317
|
-
summary.mediaTypeBreakdown[post.media_type]++;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Find top performing post
|
|
321
|
-
const engagement = (post.like_count || 0) + (post.comments_count || 0);
|
|
322
|
-
const topEngagement = (topPost.like_count || 0) + (topPost.comments_count || 0);
|
|
323
|
-
if (engagement > topEngagement) {
|
|
324
|
-
topPost = post;
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
summary.avgLikes = Math.round(totalLikes / posts.length);
|
|
329
|
-
summary.avgComments = Math.round(totalComments / posts.length);
|
|
330
|
-
summary.totalEngagements = totalLikes + totalComments;
|
|
331
|
-
summary.topPerformingPost = {
|
|
332
|
-
id: topPost.id,
|
|
333
|
-
likes: topPost.like_count,
|
|
334
|
-
comments: topPost.comments_count,
|
|
335
|
-
engagement: (topPost.like_count || 0) + (topPost.comments_count || 0),
|
|
336
|
-
publishedAt: topPost.timestamp
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return summary;
|
|
341
|
-
} catch (error) {
|
|
342
|
-
LogError('Failed to get content performance', error);
|
|
343
|
-
return null;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Parse account insights
|
|
349
|
-
*/
|
|
350
|
-
private parseAccountInsights(insights: any[]): Record<string, any> {
|
|
351
|
-
const parsed: Record<string, any> = {};
|
|
352
|
-
|
|
353
|
-
insights.forEach(metric => {
|
|
354
|
-
const name = metric.name;
|
|
355
|
-
const values = metric.values || [];
|
|
356
|
-
|
|
357
|
-
if (values.length > 0) {
|
|
358
|
-
parsed[name] = {
|
|
359
|
-
value: values[0].value || 0,
|
|
360
|
-
title: metric.title,
|
|
361
|
-
description: metric.description,
|
|
362
|
-
period: metric.period
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
// For time series data
|
|
366
|
-
if (values.length > 1) {
|
|
367
|
-
parsed[name].timeSeries = values.map((v: any) => ({
|
|
368
|
-
value: v.value,
|
|
369
|
-
endTime: v.end_time
|
|
370
|
-
}));
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
});
|
|
292
|
+
summary.avgLikes = Math.round(totalLikes / posts.length);
|
|
293
|
+
summary.avgComments = Math.round(totalComments / posts.length);
|
|
294
|
+
summary.totalEngagements = totalLikes + totalComments;
|
|
295
|
+
summary.topPerformingPost = {
|
|
296
|
+
id: topPost.id,
|
|
297
|
+
likes: topPost.like_count,
|
|
298
|
+
comments: topPost.comments_count,
|
|
299
|
+
engagement: (topPost.like_count || 0) + (topPost.comments_count || 0),
|
|
300
|
+
publishedAt: topPost.timestamp,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
374
303
|
|
|
375
|
-
|
|
304
|
+
return summary;
|
|
305
|
+
} catch (error) {
|
|
306
|
+
LogError('Failed to get content performance', error);
|
|
307
|
+
return null;
|
|
376
308
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Parse account insights
|
|
313
|
+
*/
|
|
314
|
+
private parseAccountInsights(insights: any[]): Record<string, any> {
|
|
315
|
+
const parsed: Record<string, any> = {};
|
|
316
|
+
|
|
317
|
+
insights.forEach((metric) => {
|
|
318
|
+
const name = metric.name;
|
|
319
|
+
const values = metric.values || [];
|
|
320
|
+
|
|
321
|
+
if (values.length > 0) {
|
|
322
|
+
parsed[name] = {
|
|
323
|
+
value: values[0].value || 0,
|
|
324
|
+
title: metric.title,
|
|
325
|
+
description: metric.description,
|
|
326
|
+
period: metric.period,
|
|
388
327
|
};
|
|
389
328
|
|
|
390
|
-
//
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
if (firstValue > 0) {
|
|
398
|
-
growth.followersGrowthRate = ((lastValue - firstValue) / firstValue) * 100;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// Calculate engagement rate
|
|
403
|
-
const reach = insights.reach?.value || 0;
|
|
404
|
-
const profileViews = insights.profile_views?.value || 0;
|
|
405
|
-
const websiteClicks = insights.website_clicks?.value || 0;
|
|
406
|
-
|
|
407
|
-
if (reach > 0) {
|
|
408
|
-
const totalEngagements = profileViews + websiteClicks;
|
|
409
|
-
growth.engagementRate = (totalEngagements / reach) * 100;
|
|
329
|
+
// For time series data
|
|
330
|
+
if (values.length > 1) {
|
|
331
|
+
parsed[name].timeSeries = values.map((v: any) => ({
|
|
332
|
+
value: v.value,
|
|
333
|
+
endTime: v.end_time,
|
|
334
|
+
}));
|
|
410
335
|
}
|
|
411
|
-
|
|
412
|
-
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
return parsed;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Calculate growth metrics
|
|
344
|
+
*/
|
|
345
|
+
private calculateGrowthMetrics(insights: any, accountInfo: any): any {
|
|
346
|
+
const growth: any = {
|
|
347
|
+
followersGrowth: 0,
|
|
348
|
+
followersGrowthRate: 0,
|
|
349
|
+
reachGrowth: 0,
|
|
350
|
+
impressionsGrowth: 0,
|
|
351
|
+
engagementRate: 0,
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// Calculate follower growth if we have time series data
|
|
355
|
+
const followerData = insights.follower_count;
|
|
356
|
+
if (followerData?.timeSeries && followerData.timeSeries.length > 1) {
|
|
357
|
+
const firstValue = followerData.timeSeries[0].value;
|
|
358
|
+
const lastValue = followerData.timeSeries[followerData.timeSeries.length - 1].value;
|
|
359
|
+
growth.followersGrowth = lastValue - firstValue;
|
|
360
|
+
|
|
361
|
+
if (firstValue > 0) {
|
|
362
|
+
growth.followersGrowthRate = ((lastValue - firstValue) / firstValue) * 100;
|
|
363
|
+
}
|
|
413
364
|
}
|
|
414
365
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
return [
|
|
420
|
-
...this.commonSocialParams,
|
|
421
|
-
{
|
|
422
|
-
Name: 'Period',
|
|
423
|
-
Type: 'Input',
|
|
424
|
-
Value: 'day'
|
|
425
|
-
},
|
|
426
|
-
{
|
|
427
|
-
Name: 'StartDate',
|
|
428
|
-
Type: 'Input',
|
|
429
|
-
Value: null
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
Name: 'EndDate',
|
|
433
|
-
Type: 'Input',
|
|
434
|
-
Value: null
|
|
435
|
-
},
|
|
436
|
-
{
|
|
437
|
-
Name: 'IncludeDemographics',
|
|
438
|
-
Type: 'Input',
|
|
439
|
-
Value: true
|
|
440
|
-
}
|
|
441
|
-
];
|
|
442
|
-
}
|
|
366
|
+
// Calculate engagement rate
|
|
367
|
+
const reach = insights.reach?.value || 0;
|
|
368
|
+
const profileViews = insights.profile_views?.value || 0;
|
|
369
|
+
const websiteClicks = insights.website_clicks?.value || 0;
|
|
443
370
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
public get Description(): string {
|
|
448
|
-
return 'Retrieves comprehensive account-level insights including follower demographics, reach, impressions, and growth metrics.';
|
|
371
|
+
if (reach > 0) {
|
|
372
|
+
const totalEngagements = profileViews + websiteClicks;
|
|
373
|
+
growth.engagementRate = (totalEngagements / reach) * 100;
|
|
449
374
|
}
|
|
450
|
-
|
|
375
|
+
|
|
376
|
+
return growth;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Define the parameters for this action
|
|
381
|
+
*/
|
|
382
|
+
public get Params(): ActionParam[] {
|
|
383
|
+
return [
|
|
384
|
+
...this.commonSocialParams,
|
|
385
|
+
{
|
|
386
|
+
Name: 'Period',
|
|
387
|
+
Type: 'Input',
|
|
388
|
+
Value: 'day',
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
Name: 'StartDate',
|
|
392
|
+
Type: 'Input',
|
|
393
|
+
Value: null,
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
Name: 'EndDate',
|
|
397
|
+
Type: 'Input',
|
|
398
|
+
Value: null,
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
Name: 'IncludeDemographics',
|
|
402
|
+
Type: 'Input',
|
|
403
|
+
Value: true,
|
|
404
|
+
},
|
|
405
|
+
];
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Get the description for this action
|
|
410
|
+
*/
|
|
411
|
+
public get Description(): string {
|
|
412
|
+
return 'Retrieves comprehensive account-level insights including follower demographics, reach, impressions, and growth metrics.';
|
|
413
|
+
}
|
|
414
|
+
}
|