@memberjunction/actions-bizapps-social 2.111.1 → 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 { LinkedInBaseAction } from '../linkedin-base.action';
|
|
3
3
|
import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
|
|
4
|
-
import { LogStatus, LogError } from '@memberjunction/
|
|
4
|
+
import { LogStatus, LogError } from '@memberjunction/global';
|
|
5
5
|
import { BaseAction } from '@memberjunction/actions';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -9,219 +9,219 @@ import { BaseAction } from '@memberjunction/actions';
|
|
|
9
9
|
*/
|
|
10
10
|
@RegisterClass(BaseAction, 'LinkedInGetFollowersAction')
|
|
11
11
|
export class LinkedInGetFollowersAction extends LinkedInBaseAction {
|
|
12
|
-
|
|
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
|
-
followerData = await this.getOrganizationFollowers(organizationUrn, includeGrowth, timeRange);
|
|
49
|
-
} else {
|
|
50
|
-
// Get personal profile follower statistics
|
|
51
|
-
const userUrn = await this.getCurrentUserUrn();
|
|
52
|
-
followerData = await this.getPersonalFollowers(userUrn);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Update output parameters
|
|
56
|
-
const outputParams = [...Params];
|
|
57
|
-
const followersParam = outputParams.find(p => p.Name === 'FollowerCount');
|
|
58
|
-
if (followersParam) followersParam.Value = followerData.followerCount || 0;
|
|
59
|
-
const statsParam = outputParams.find(p => p.Name === 'FollowerStatistics');
|
|
60
|
-
if (statsParam) statsParam.Value = followerData;
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
Success: true,
|
|
64
|
-
ResultCode: 'SUCCESS',
|
|
65
|
-
Message: `Successfully retrieved follower statistics`,
|
|
66
|
-
Params: outputParams
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
} catch (error) {
|
|
70
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
Success: false,
|
|
74
|
-
ResultCode: 'ERROR',
|
|
75
|
-
Message: `Failed to get followers: ${errorMessage}`,
|
|
76
|
-
Params
|
|
77
|
-
};
|
|
12
|
+
/**
|
|
13
|
+
* Get follower statistics for personal profile or organization
|
|
14
|
+
*/
|
|
15
|
+
protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
|
|
16
|
+
const { Params, ContextUser } = params;
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
// Initialize OAuth
|
|
20
|
+
const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
|
|
21
|
+
if (!(await this.initializeOAuth(companyIntegrationId))) {
|
|
22
|
+
throw new Error('Failed to initialize OAuth connection');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Extract parameters
|
|
26
|
+
const entityType = this.getParamValue(Params, 'EntityType') || 'organization'; // 'personal' or 'organization'
|
|
27
|
+
const organizationId = this.getParamValue(Params, 'OrganizationID');
|
|
28
|
+
const includeGrowth = this.getParamValue(Params, 'IncludeGrowth') === true;
|
|
29
|
+
const timeRange = this.getParamValue(Params, 'TimeRange'); // Optional: {start: Date, end: Date}
|
|
30
|
+
|
|
31
|
+
let followerData: any = {};
|
|
32
|
+
|
|
33
|
+
if (entityType === 'organization') {
|
|
34
|
+
// Get organization follower statistics
|
|
35
|
+
let organizationUrn: string;
|
|
36
|
+
if (!organizationId) {
|
|
37
|
+
// Get first admin organization if not specified
|
|
38
|
+
const orgs = await this.getAdminOrganizations();
|
|
39
|
+
if (orgs.length === 0) {
|
|
40
|
+
throw new Error('No organizations found. Please specify OrganizationID.');
|
|
41
|
+
}
|
|
42
|
+
organizationUrn = orgs[0].urn;
|
|
43
|
+
LogStatus(`Using organization: ${orgs[0].name}`);
|
|
44
|
+
} else {
|
|
45
|
+
organizationUrn = `urn:li:organization:${organizationId}`;
|
|
78
46
|
}
|
|
79
|
-
}
|
|
80
47
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
organicGains: stats.followerGains.organicFollowerGains || 0,
|
|
111
|
-
paidGains: stats.followerGains.paidFollowerGains || 0,
|
|
112
|
-
totalGains: (stats.followerGains.organicFollowerGains || 0) + (stats.followerGains.paidFollowerGains || 0),
|
|
113
|
-
timeRange: timeRange
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Get demographics if available
|
|
118
|
-
try {
|
|
119
|
-
const demographicsResponse = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', {
|
|
120
|
-
params: {
|
|
121
|
-
q: 'organizationalEntity',
|
|
122
|
-
organizationalEntity: organizationUrn,
|
|
123
|
-
projection: '(followerCountsByAssociationType,followerCountsByFunction,followerCountsBySeniority,followerCountsByIndustry,followerCountsByRegion,followerCountsByCountry)'
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
if (demographicsResponse.data.elements?.[0]) {
|
|
128
|
-
const demographics = demographicsResponse.data.elements[0];
|
|
129
|
-
result.demographics = {
|
|
130
|
-
byFunction: demographics.followerCountsByFunction || [],
|
|
131
|
-
bySeniority: demographics.followerCountsBySeniority || [],
|
|
132
|
-
byIndustry: demographics.followerCountsByIndustry || [],
|
|
133
|
-
byRegion: demographics.followerCountsByRegion || [],
|
|
134
|
-
byCountry: demographics.followerCountsByCountry || []
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
} catch (error) {
|
|
138
|
-
LogError(`Failed to get follower demographics: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return result;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
LogError(`Failed to get organization followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
144
|
-
throw error;
|
|
145
|
-
}
|
|
48
|
+
followerData = await this.getOrganizationFollowers(organizationUrn, includeGrowth, timeRange);
|
|
49
|
+
} else {
|
|
50
|
+
// Get personal profile follower statistics
|
|
51
|
+
const userUrn = await this.getCurrentUserUrn();
|
|
52
|
+
followerData = await this.getPersonalFollowers(userUrn);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Update output parameters
|
|
56
|
+
const outputParams = [...Params];
|
|
57
|
+
const followersParam = outputParams.find((p) => p.Name === 'FollowerCount');
|
|
58
|
+
if (followersParam) followersParam.Value = followerData.followerCount || 0;
|
|
59
|
+
const statsParam = outputParams.find((p) => p.Name === 'FollowerStatistics');
|
|
60
|
+
if (statsParam) statsParam.Value = followerData;
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
Success: true,
|
|
64
|
+
ResultCode: 'SUCCESS',
|
|
65
|
+
Message: `Successfully retrieved follower statistics`,
|
|
66
|
+
Params: outputParams,
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
Success: false,
|
|
73
|
+
ResultCode: 'ERROR',
|
|
74
|
+
Message: `Failed to get followers: ${errorMessage}`,
|
|
75
|
+
Params,
|
|
76
|
+
};
|
|
146
77
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get organization follower statistics
|
|
82
|
+
*/
|
|
83
|
+
private async getOrganizationFollowers(organizationUrn: string, includeGrowth: boolean, timeRange?: any): Promise<any> {
|
|
84
|
+
try {
|
|
85
|
+
const params: any = {
|
|
86
|
+
q: 'organizationalEntity',
|
|
87
|
+
organizationalEntity: organizationUrn,
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Add time range if specified for growth metrics
|
|
91
|
+
if (includeGrowth && timeRange) {
|
|
92
|
+
params.timeIntervals = `List((start:${new Date(timeRange.start).getTime()},end:${new Date(timeRange.end || Date.now()).getTime()}))`;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Get follower statistics
|
|
96
|
+
const response = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', { params });
|
|
97
|
+
|
|
98
|
+
const stats = response.data.elements?.[0] || {};
|
|
99
|
+
|
|
100
|
+
const result: any = {
|
|
101
|
+
followerCount: stats.followerCounts?.organicFollowerCount || 0,
|
|
102
|
+
paidFollowerCount: stats.followerCounts?.paidFollowerCount || 0,
|
|
103
|
+
totalFollowerCount: (stats.followerCounts?.organicFollowerCount || 0) + (stats.followerCounts?.paidFollowerCount || 0),
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// Add growth metrics if requested
|
|
107
|
+
if (includeGrowth && stats.followerGains) {
|
|
108
|
+
result.followerGrowth = {
|
|
109
|
+
organicGains: stats.followerGains.organicFollowerGains || 0,
|
|
110
|
+
paidGains: stats.followerGains.paidFollowerGains || 0,
|
|
111
|
+
totalGains: (stats.followerGains.organicFollowerGains || 0) + (stats.followerGains.paidFollowerGains || 0),
|
|
112
|
+
timeRange: timeRange,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Get demographics if available
|
|
117
|
+
try {
|
|
118
|
+
const demographicsResponse = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', {
|
|
119
|
+
params: {
|
|
120
|
+
q: 'organizationalEntity',
|
|
121
|
+
organizationalEntity: organizationUrn,
|
|
122
|
+
projection:
|
|
123
|
+
'(followerCountsByAssociationType,followerCountsByFunction,followerCountsBySeniority,followerCountsByIndustry,followerCountsByRegion,followerCountsByCountry)',
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (demographicsResponse.data.elements?.[0]) {
|
|
128
|
+
const demographics = demographicsResponse.data.elements[0];
|
|
129
|
+
result.demographics = {
|
|
130
|
+
byFunction: demographics.followerCountsByFunction || [],
|
|
131
|
+
bySeniority: demographics.followerCountsBySeniority || [],
|
|
132
|
+
byIndustry: demographics.followerCountsByIndustry || [],
|
|
133
|
+
byRegion: demographics.followerCountsByRegion || [],
|
|
134
|
+
byCountry: demographics.followerCountsByCountry || [],
|
|
135
|
+
};
|
|
179
136
|
}
|
|
137
|
+
} catch (error) {
|
|
138
|
+
LogError(`Failed to get follower demographics: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return result;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
LogError(`Failed to get organization followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
144
|
+
throw error;
|
|
180
145
|
}
|
|
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
|
-
Name: 'FollowerStatistics',
|
|
215
|
-
Type: 'Output',
|
|
216
|
-
Value: null
|
|
217
|
-
}
|
|
218
|
-
];
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Get action description
|
|
223
|
-
*/
|
|
224
|
-
public get Description(): string {
|
|
225
|
-
return 'Retrieves follower statistics for LinkedIn personal profiles or organization pages, including demographics and growth metrics where available';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Get personal profile follower statistics
|
|
150
|
+
* Note: LinkedIn provides limited follower data for personal profiles
|
|
151
|
+
*/
|
|
152
|
+
private async getPersonalFollowers(userUrn: string): Promise<any> {
|
|
153
|
+
try {
|
|
154
|
+
// Get basic profile information including follower count
|
|
155
|
+
const response = await this.axiosInstance.get('/me', {
|
|
156
|
+
params: {
|
|
157
|
+
projection: '(id,firstName,lastName,headline,publicProfileUrl,followerCount)',
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
followerCount: response.data.followerCount || 0,
|
|
163
|
+
profileInfo: {
|
|
164
|
+
name: `${response.data.firstName?.localized?.en_US || ''} ${response.data.lastName?.localized?.en_US || ''}`.trim(),
|
|
165
|
+
headline: response.data.headline?.localized?.en_US || '',
|
|
166
|
+
profileUrl: response.data.publicProfileUrl || '',
|
|
167
|
+
},
|
|
168
|
+
note: 'LinkedIn API provides limited follower statistics for personal profiles',
|
|
169
|
+
};
|
|
170
|
+
} catch (error) {
|
|
171
|
+
LogError(`Failed to get personal followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
172
|
+
|
|
173
|
+
// Fallback: return basic info
|
|
174
|
+
return {
|
|
175
|
+
followerCount: 0,
|
|
176
|
+
note: 'Unable to retrieve follower count for personal profile',
|
|
177
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
178
|
+
};
|
|
226
179
|
}
|
|
227
|
-
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Define the parameters this action expects
|
|
184
|
+
*/
|
|
185
|
+
public get Params(): ActionParam[] {
|
|
186
|
+
return [
|
|
187
|
+
...this.commonSocialParams,
|
|
188
|
+
{
|
|
189
|
+
Name: 'EntityType',
|
|
190
|
+
Type: 'Input',
|
|
191
|
+
Value: 'organization', // 'personal' or 'organization'
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
Name: 'OrganizationID',
|
|
195
|
+
Type: 'Input',
|
|
196
|
+
Value: null,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
Name: 'IncludeGrowth',
|
|
200
|
+
Type: 'Input',
|
|
201
|
+
Value: false,
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
Name: 'TimeRange',
|
|
205
|
+
Type: 'Input',
|
|
206
|
+
Value: null, // Optional: {start: Date, end: Date}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
Name: 'FollowerCount',
|
|
210
|
+
Type: 'Output',
|
|
211
|
+
Value: null,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
Name: 'FollowerStatistics',
|
|
215
|
+
Type: 'Output',
|
|
216
|
+
Value: null,
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Get action description
|
|
223
|
+
*/
|
|
224
|
+
public get Description(): string {
|
|
225
|
+
return 'Retrieves follower statistics for LinkedIn personal profiles or organization pages, including demographics and growth metrics where available';
|
|
226
|
+
}
|
|
227
|
+
}
|