@meltwater/conversations-api-services 1.0.23 → 1.0.25
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/dist/cjs/data-access/http/twitter.native.js +584 -0
- package/dist/cjs/data-access/http/youtube.native.js +94 -0
- package/dist/cjs/data-access/index.js +6 -1
- package/dist/esm/data-access/http/twitter.native.js +561 -0
- package/dist/esm/data-access/http/youtube.native.js +83 -0
- package/dist/esm/data-access/index.js +3 -1
- package/package.json +4 -1
- package/src/data-access/http/twitter.native.js +663 -0
- package/src/data-access/http/youtube.native.js +147 -0
- package/src/data-access/index.js +4 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.addOAuthToToken = addOAuthToToken;
|
|
7
|
+
exports.followUser = followUser;
|
|
8
|
+
exports.getBrandUserRelationship = getBrandUserRelationship;
|
|
9
|
+
exports.getCurrentInfo = getCurrentInfo;
|
|
10
|
+
exports.getDirectMessageImage = getDirectMessageImage;
|
|
11
|
+
exports.getMentionHandleInfo = getMentionHandleInfo;
|
|
12
|
+
exports.getUserInfoFromHandle = getUserInfoFromHandle;
|
|
13
|
+
exports.getUserInfoFromHandles = getUserInfoFromHandles;
|
|
14
|
+
exports.like = like;
|
|
15
|
+
exports.privateMessage = privateMessage;
|
|
16
|
+
exports.reply = reply;
|
|
17
|
+
exports.retweet = retweet;
|
|
18
|
+
exports.retweetWithComment = retweetWithComment;
|
|
19
|
+
exports.unFollowUser = unFollowUser;
|
|
20
|
+
exports.unLike = unLike;
|
|
21
|
+
exports.unRetweet = unRetweet;
|
|
22
|
+
exports.userFollowStatus = userFollowStatus;
|
|
23
|
+
var _superagent = _interopRequireDefault(require("superagent"));
|
|
24
|
+
var _externalIdHelpers = require("../../lib/externalId.helpers.js");
|
|
25
|
+
var _loggerHelpers = require("../../lib/logger.helpers.js");
|
|
26
|
+
var _oauth = _interopRequireDefault(require("oauth-1.0a"));
|
|
27
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
|
28
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
29
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
30
|
+
var _socialTwit = _interopRequireDefault(require("@meltwater/social-twit"));
|
|
31
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
32
|
+
function addOAuthToToken(token, TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET) {
|
|
33
|
+
if (!token.oauth) {
|
|
34
|
+
token.oauth = (0, _oauth.default)({
|
|
35
|
+
consumer: {
|
|
36
|
+
key: TWITTER_CONSUMER_KEY,
|
|
37
|
+
secret: TWITTER_CONSUMER_SECRET
|
|
38
|
+
},
|
|
39
|
+
signature_method: 'HMAC-SHA1',
|
|
40
|
+
hash_function(base_string, key) {
|
|
41
|
+
return _crypto.default.createHmac('sha1', key).update(base_string).digest('base64');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
token.consumer_key = TWITTER_CONSUMER_KEY;
|
|
45
|
+
token.consumer_secret = TWITTER_CONSUMER_SECRET;
|
|
46
|
+
}
|
|
47
|
+
return token;
|
|
48
|
+
}
|
|
49
|
+
async function getUserInfoFromHandles(token, handles, logger) {
|
|
50
|
+
try {
|
|
51
|
+
let query = `users/lookup.json?screen_name=${handles.join(',')}`;
|
|
52
|
+
let result = await postRequest({
|
|
53
|
+
token,
|
|
54
|
+
uri: query,
|
|
55
|
+
logger
|
|
56
|
+
});
|
|
57
|
+
return result.data;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
(0, _loggerHelpers.loggerError)(logger, `Error getting UserInfo`, e);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function getUserInfoFromHandle(token, handleId, logger) {
|
|
63
|
+
try {
|
|
64
|
+
let query = `users/show.json?user_id=${(0, _externalIdHelpers.removePrefix)(handleId)}`;
|
|
65
|
+
let result = await getRequest({
|
|
66
|
+
token,
|
|
67
|
+
uri: query,
|
|
68
|
+
logger
|
|
69
|
+
});
|
|
70
|
+
return result.data;
|
|
71
|
+
} catch (e) {
|
|
72
|
+
(0, _loggerHelpers.loggerError)(logger, `Error getting UserInfo`, e);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function getDirectMessageImage(token, imageUrl, logger) {
|
|
76
|
+
try {
|
|
77
|
+
let result = await getRequest({
|
|
78
|
+
token,
|
|
79
|
+
uri: imageUrl,
|
|
80
|
+
attachUrlPrefix: false,
|
|
81
|
+
logger
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
image: result.data,
|
|
85
|
+
contentType: result.contentType
|
|
86
|
+
};
|
|
87
|
+
} catch (e) {
|
|
88
|
+
(0, _loggerHelpers.loggerError)(logger, `Error getting image`, e);
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function getCurrentInfo(token, externalId, logger) {
|
|
93
|
+
try {
|
|
94
|
+
const uri = `https://api.twitter.com/2/tweets?ids=${(0, _externalIdHelpers.removePrefix)(externalId)}&tweet.fields=public_metrics&expansions=author_id`;
|
|
95
|
+
let result = await getRequest({
|
|
96
|
+
token,
|
|
97
|
+
uri,
|
|
98
|
+
attachUrlPrefix: false,
|
|
99
|
+
convertPayloadToUri: false,
|
|
100
|
+
logger
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// this makes it so 'retweeted' is only true on a retweet that isn't a comment
|
|
104
|
+
// sometimes 'retweeted' is true if user retweeted with comment, sometimes not :sadness:
|
|
105
|
+
result.data.retweeted = !!result.data.current_user_retweet;
|
|
106
|
+
return result.data.data[0].public_metrics;
|
|
107
|
+
} catch (error) {
|
|
108
|
+
(0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getCurrentInfo', error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function getMentionHandleInfo(token, externalId, logger) {
|
|
112
|
+
try {
|
|
113
|
+
const uri = `https://api.twitter.com/2/tweets/${(0, _externalIdHelpers.removePrefix)(externalId)}?tweet.fields=entities&expansions=entities.mentions.username,author_id&user.fields=id,name,username,profile_image_url`;
|
|
114
|
+
let result = await getRequest({
|
|
115
|
+
token,
|
|
116
|
+
uri,
|
|
117
|
+
attachUrlPrefix: false,
|
|
118
|
+
convertPayloadToUri: false
|
|
119
|
+
});
|
|
120
|
+
return result.data;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
(0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getMentionHandleInfo', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function retweet(token, sourceId, externalId, logger) {
|
|
126
|
+
try {
|
|
127
|
+
let response = await postRequest({
|
|
128
|
+
token,
|
|
129
|
+
uri: `https://api.twitter.com/2/users/${(0, _externalIdHelpers.removePrefix)(sourceId)}/retweets`,
|
|
130
|
+
payload: {
|
|
131
|
+
tweet_id: (0, _externalIdHelpers.removePrefix)(externalId)
|
|
132
|
+
},
|
|
133
|
+
attachUrlPrefix: false,
|
|
134
|
+
convertPayloadToUri: false,
|
|
135
|
+
logger
|
|
136
|
+
});
|
|
137
|
+
if (response.data.data.retweeted !== undefined && response.resp.statusCode === 200) {
|
|
138
|
+
return true;
|
|
139
|
+
} else {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
} catch (error) {
|
|
143
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in retweet user: ${sourceId}`, error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function unRetweet(token, sourceId, externalId, logger) {
|
|
147
|
+
try {
|
|
148
|
+
let response = await deleteRequest({
|
|
149
|
+
token,
|
|
150
|
+
uri: `https://api.twitter.com/2/users/${sourceId}/retweets/${(0, _externalIdHelpers.removePrefix)(externalId)}`,
|
|
151
|
+
logger
|
|
152
|
+
});
|
|
153
|
+
if (response.data.data.retweeted !== undefined && response.resp.statusCode === 200) {
|
|
154
|
+
return true;
|
|
155
|
+
} else {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in unretweet user: ${sourceId}`, error, {
|
|
160
|
+
[MeltwaterAttributes.SOCIALEXTERNALID]: externalId
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function like(token, externalId, logger) {
|
|
165
|
+
try {
|
|
166
|
+
let response = await postRequest({
|
|
167
|
+
token,
|
|
168
|
+
uri: 'favorites/create.json?id=' + (0, _externalIdHelpers.removePrefix)(externalId),
|
|
169
|
+
logger
|
|
170
|
+
});
|
|
171
|
+
if (response.data.favorited !== undefined && response.resp.statusCode === 200) {
|
|
172
|
+
return true;
|
|
173
|
+
} else {
|
|
174
|
+
(0, _loggerHelpers.loggerInfo)(logger, 'Twitter Error in like user statusCode non 200 ', {
|
|
175
|
+
response: JSON.stringify(response)
|
|
176
|
+
});
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
} catch (error) {
|
|
180
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Twitter Error in like user: ${externalId}`, error);
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function unLike(token, externalId, logger) {
|
|
185
|
+
try {
|
|
186
|
+
let response = await postRequest({
|
|
187
|
+
token,
|
|
188
|
+
uri: 'favorites/destroy.json?id=' + (0, _externalIdHelpers.removePrefix)(externalId),
|
|
189
|
+
logger
|
|
190
|
+
});
|
|
191
|
+
if (response.data.favorited !== undefined && response.resp.statusCode === 200) {
|
|
192
|
+
return true;
|
|
193
|
+
} else {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
} catch (error) {
|
|
197
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in unlike user: ${externalId}`, error);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function followUser(token, profileId, logger) {
|
|
202
|
+
try {
|
|
203
|
+
let response = await postRequest({
|
|
204
|
+
token,
|
|
205
|
+
uri: 'friendships/create.json',
|
|
206
|
+
payload: {
|
|
207
|
+
user_id: (0, _externalIdHelpers.removePrefix)(profileId),
|
|
208
|
+
follow: true
|
|
209
|
+
},
|
|
210
|
+
logger
|
|
211
|
+
});
|
|
212
|
+
if (response.data.following !== undefined) {
|
|
213
|
+
return true;
|
|
214
|
+
} else {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
} catch (error) {
|
|
218
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in following user: ${profileId}`, error);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async function unFollowUser(token, profileId, logger) {
|
|
222
|
+
try {
|
|
223
|
+
let response = await postRequest({
|
|
224
|
+
token,
|
|
225
|
+
uri: 'friendships/destroy.json',
|
|
226
|
+
payload: {
|
|
227
|
+
user_id: (0, _externalIdHelpers.removePrefix)(profileId)
|
|
228
|
+
},
|
|
229
|
+
logger
|
|
230
|
+
});
|
|
231
|
+
if (response.data.following !== undefined) {
|
|
232
|
+
return true;
|
|
233
|
+
} else {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
} catch (error) {
|
|
237
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in unfollowing user: ${profileId}`, error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async function userFollowStatus(token, profileId, logger) {
|
|
241
|
+
try {
|
|
242
|
+
let response = await getRequest({
|
|
243
|
+
token,
|
|
244
|
+
uri: 'friendships/lookup.json',
|
|
245
|
+
payload: {
|
|
246
|
+
user_id: (0, _externalIdHelpers.removePrefix)(profileId)
|
|
247
|
+
},
|
|
248
|
+
logger
|
|
249
|
+
});
|
|
250
|
+
if (response.data.length > 0) {
|
|
251
|
+
if (response.data[0].connections.length > 0) {
|
|
252
|
+
for (var i = 0; i < response.data[0].connections.length; i++) {
|
|
253
|
+
if (response.data[0].connections[i] === 'following') {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return false;
|
|
258
|
+
} else {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
} catch (error) {
|
|
263
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in getting user follow status: ${profileId}`, error);
|
|
264
|
+
if (error.message != 'Bad Request') {
|
|
265
|
+
// if we hit a minor rate limit here, we wait for 5 seconds before attempting again, usually long enough to continue
|
|
266
|
+
await new Promise(r => setTimeout(r, 5000));
|
|
267
|
+
return userFollowStatus(token, profileId, logger);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async function getBrandUserRelationship(token, profileId, brandProfileId, logger) {
|
|
272
|
+
try {
|
|
273
|
+
let {
|
|
274
|
+
data: {
|
|
275
|
+
relationship
|
|
276
|
+
} = {}
|
|
277
|
+
} = await getRequest({
|
|
278
|
+
token,
|
|
279
|
+
uri: `friendships/show.json?source_id=${brandProfileId}&target_id=${(0, _externalIdHelpers.removePrefix)(profileId)}`,
|
|
280
|
+
logger
|
|
281
|
+
});
|
|
282
|
+
return relationship;
|
|
283
|
+
} catch (error) {
|
|
284
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Error in getting user brand friendship info: ${profileId} and ${brandProfileId}`, error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async function reply(token, text, attachment, inReplyToId, removeInReplyToId, logger) {
|
|
288
|
+
let mediaId;
|
|
289
|
+
if (attachment) {
|
|
290
|
+
// discussionType only matters if DM or Not
|
|
291
|
+
mediaId = await uploadMedia(attachment, token, 're', logger);
|
|
292
|
+
}
|
|
293
|
+
const payload = {
|
|
294
|
+
text,
|
|
295
|
+
...(attachment && {
|
|
296
|
+
media: {
|
|
297
|
+
media_ids: [mediaId]
|
|
298
|
+
}
|
|
299
|
+
}),
|
|
300
|
+
reply: {
|
|
301
|
+
in_reply_to_tweet_id: (0, _externalIdHelpers.removePrefix)(inReplyToId)
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
if (removeInReplyToId.length) {
|
|
305
|
+
payload.reply.exclude_reply_user_ids = removeInReplyToId.map(_externalIdHelpers.removePrefix);
|
|
306
|
+
}
|
|
307
|
+
let query = 'https://api.twitter.com/2/tweets';
|
|
308
|
+
return publishTweet(token, payload, query, false, logger);
|
|
309
|
+
}
|
|
310
|
+
async function privateMessage(token, text, attachment, profileId, logger) {
|
|
311
|
+
let query = 'direct_messages/events/new.json';
|
|
312
|
+
let mediaId;
|
|
313
|
+
if (attachment) {
|
|
314
|
+
// discussionType only matters if DM or Not
|
|
315
|
+
mediaId = await uploadMedia(attachment, token, 'dm', logger);
|
|
316
|
+
}
|
|
317
|
+
const payload = {
|
|
318
|
+
event: {
|
|
319
|
+
type: 'message_create',
|
|
320
|
+
message_create: {
|
|
321
|
+
target: {
|
|
322
|
+
recipient_id: (0, _externalIdHelpers.removePrefix)(profileId)
|
|
323
|
+
},
|
|
324
|
+
message_data: {
|
|
325
|
+
text: text || ' ',
|
|
326
|
+
...(attachment && {
|
|
327
|
+
attachment: {
|
|
328
|
+
type: 'media',
|
|
329
|
+
media: {
|
|
330
|
+
id: mediaId
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
})
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
return publishTweet(token, payload, query, true, logger);
|
|
339
|
+
}
|
|
340
|
+
async function retweetWithComment(token, text, attachment, logger) {
|
|
341
|
+
let mediaId;
|
|
342
|
+
if (attachment) {
|
|
343
|
+
// discussionType only matters if DM or Not
|
|
344
|
+
mediaId = await uploadMedia(attachment, token, 're', logger);
|
|
345
|
+
}
|
|
346
|
+
const payload = {
|
|
347
|
+
text,
|
|
348
|
+
...(attachment && {
|
|
349
|
+
media: {
|
|
350
|
+
media_ids: [mediaId]
|
|
351
|
+
}
|
|
352
|
+
})
|
|
353
|
+
};
|
|
354
|
+
let query = 'https://api.twitter.com/2/tweets';
|
|
355
|
+
return publishTweet(token, payload, query, false, logger);
|
|
356
|
+
}
|
|
357
|
+
async function publishTweet(token, payload, query, isDirectMessage, logger) {
|
|
358
|
+
try {
|
|
359
|
+
let nativeResponse = await postRequest({
|
|
360
|
+
token,
|
|
361
|
+
uri: query,
|
|
362
|
+
payload,
|
|
363
|
+
convertPayloadToUri: false,
|
|
364
|
+
attachUrlPrefix: isDirectMessage
|
|
365
|
+
});
|
|
366
|
+
if (!isDirectMessage && nativeResponse.resp.statusCode === 201) {
|
|
367
|
+
const uri = `https://api.twitter.com/2/tweets?ids=${nativeResponse.data.data.id}&tweet.fields=public_metrics&expansions=author_id`;
|
|
368
|
+
nativeResponse = await getRequest({
|
|
369
|
+
token,
|
|
370
|
+
uri,
|
|
371
|
+
payload,
|
|
372
|
+
attachUrlPrefix: false,
|
|
373
|
+
convertPayloadToUri: false
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
(0, _loggerHelpers.loggerInfo)(logger, `finished fetching twitterAPI nativeResponse `, {
|
|
377
|
+
data: JSON.stringify(nativeResponse.data)
|
|
378
|
+
});
|
|
379
|
+
const response = nativeResponse.resp ? {
|
|
380
|
+
statusCode: nativeResponse.resp.statusCode,
|
|
381
|
+
statusMessage: nativeResponse.resp.statusCode === 200 ? 'Success' : 'Unknown Failure',
|
|
382
|
+
data: isDirectMessage ? nativeResponse.data.event : nativeResponse.data.data[0]
|
|
383
|
+
} : {
|
|
384
|
+
statusCode: nativeResponse.statusCode,
|
|
385
|
+
statusMessage: nativeResponse.message
|
|
386
|
+
};
|
|
387
|
+
(0, _loggerHelpers.loggerDebug)(logger, `Twitter the data response is`, {
|
|
388
|
+
response: JSON.stringify(response)
|
|
389
|
+
});
|
|
390
|
+
return response;
|
|
391
|
+
} catch (err) {
|
|
392
|
+
(0, _loggerHelpers.loggerError)(`Twitter publish exception details`, err);
|
|
393
|
+
throw err;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async function postRequest(_ref) {
|
|
397
|
+
let {
|
|
398
|
+
token,
|
|
399
|
+
uri,
|
|
400
|
+
payload,
|
|
401
|
+
attachUrlPrefix = true,
|
|
402
|
+
convertPayloadToUri = true,
|
|
403
|
+
logger
|
|
404
|
+
} = _ref;
|
|
405
|
+
return doRequest({
|
|
406
|
+
requestMethod: 'post',
|
|
407
|
+
token,
|
|
408
|
+
convertPayloadToUri,
|
|
409
|
+
payload,
|
|
410
|
+
uri,
|
|
411
|
+
attachUrlPrefix,
|
|
412
|
+
logger
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
async function getRequest(_ref2) {
|
|
416
|
+
let {
|
|
417
|
+
token,
|
|
418
|
+
uri,
|
|
419
|
+
payload,
|
|
420
|
+
attachUrlPrefix = true,
|
|
421
|
+
convertPayloadToUri = true,
|
|
422
|
+
logger
|
|
423
|
+
} = _ref2;
|
|
424
|
+
return doRequest({
|
|
425
|
+
requestMethod: 'get',
|
|
426
|
+
payload,
|
|
427
|
+
token,
|
|
428
|
+
uri,
|
|
429
|
+
attachUrlPrefix,
|
|
430
|
+
convertPayloadToUri,
|
|
431
|
+
logger
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
async function deleteRequest(_ref3) {
|
|
435
|
+
let {
|
|
436
|
+
token,
|
|
437
|
+
uri,
|
|
438
|
+
payload,
|
|
439
|
+
attachUrlPrefix = false,
|
|
440
|
+
convertPayloadToUri = false,
|
|
441
|
+
logger
|
|
442
|
+
} = _ref3;
|
|
443
|
+
return doRequest({
|
|
444
|
+
requestMethod: 'delete',
|
|
445
|
+
token,
|
|
446
|
+
convertPayloadToUri,
|
|
447
|
+
payload,
|
|
448
|
+
uri,
|
|
449
|
+
attachUrlPrefix,
|
|
450
|
+
logger
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
function fixedEncodeURIComponent(str) {
|
|
454
|
+
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
|
|
455
|
+
return '%' + c.charCodeAt(0).toString(16);
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
async function doRequest(_ref4) {
|
|
459
|
+
let {
|
|
460
|
+
requestMethod,
|
|
461
|
+
token,
|
|
462
|
+
uri,
|
|
463
|
+
payload,
|
|
464
|
+
attachUrlPrefix = true,
|
|
465
|
+
convertPayloadToUri = true,
|
|
466
|
+
logger
|
|
467
|
+
} = _ref4;
|
|
468
|
+
if (payload && convertPayloadToUri) {
|
|
469
|
+
uri = uri + (uri.endsWith('?') ? '' : '?') + Object.keys(payload).map(key => {
|
|
470
|
+
return fixedEncodeURIComponent(key) + '=' + fixedEncodeURIComponent(payload[key]);
|
|
471
|
+
}).join('&');
|
|
472
|
+
}
|
|
473
|
+
let url = attachUrlPrefix ? `https://api.twitter.com/1.1/${uri}` : uri;
|
|
474
|
+
return new Promise(async (resolve, reject) => {
|
|
475
|
+
try {
|
|
476
|
+
const {
|
|
477
|
+
Authorization
|
|
478
|
+
} = token.oauth.toHeader(token.oauth.authorize({
|
|
479
|
+
url,
|
|
480
|
+
method: requestMethod,
|
|
481
|
+
data: {}
|
|
482
|
+
}, {
|
|
483
|
+
key: token.token,
|
|
484
|
+
secret: token.tokenSecret
|
|
485
|
+
}));
|
|
486
|
+
const result = await (requestMethod === 'get' ? _superagent.default.get(url).set('Authorization', Authorization) : requestMethod === 'post' ? _superagent.default.post(url).set('Authorization', Authorization).send(payload && !convertPayloadToUri ? payload : undefined) : _superagent.default.del(url).set('Authorization', Authorization));
|
|
487
|
+
(0, _loggerHelpers.loggerDebug)(logger, 'Twitter Native Response ', {
|
|
488
|
+
native: {
|
|
489
|
+
//data: result.body,
|
|
490
|
+
contentType: result.headers['content-type']
|
|
491
|
+
},
|
|
492
|
+
methodParams: {
|
|
493
|
+
uri,
|
|
494
|
+
payload: JSON.stringify(payload)
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
resolve({
|
|
498
|
+
data: result.body,
|
|
499
|
+
contentType: result.headers['content-type'],
|
|
500
|
+
resp: {
|
|
501
|
+
...result
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
} catch (e) {
|
|
505
|
+
(0, _loggerHelpers.loggerError)(logger, `Error in twitter doRequest`, e, {
|
|
506
|
+
url,
|
|
507
|
+
convertPayloadToUri,
|
|
508
|
+
payload: JSON.stringify(payload)
|
|
509
|
+
});
|
|
510
|
+
reject(e);
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// local
|
|
516
|
+
async function downloadImage(url, fileName) {
|
|
517
|
+
const writer = _fs.default.createWriteStream(fileName);
|
|
518
|
+
const response = await (0, _axios.default)({
|
|
519
|
+
url,
|
|
520
|
+
method: 'GET',
|
|
521
|
+
responseType: 'stream'
|
|
522
|
+
});
|
|
523
|
+
response.data = response.data;
|
|
524
|
+
response.data.pipe(writer);
|
|
525
|
+
return new Promise((resolve, reject) => {
|
|
526
|
+
writer.on('finish', resolve);
|
|
527
|
+
writer.on('error', reject);
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// local
|
|
532
|
+
function generateFilePath(mimeType) {
|
|
533
|
+
let dir = `${__dirname}/temporaryTwitterMedia`;
|
|
534
|
+
if (!_fs.default.existsSync(dir)) {
|
|
535
|
+
_fs.default.mkdirSync(dir);
|
|
536
|
+
}
|
|
537
|
+
let randomFileName = Math.floor(Math.random() * 100);
|
|
538
|
+
let fileExtension = mimeType.split('/')[1];
|
|
539
|
+
if (mimeType === 'video/quicktime') {
|
|
540
|
+
fileExtension = 'mov';
|
|
541
|
+
}
|
|
542
|
+
return `${dir}/${randomFileName}.${fileExtension}`;
|
|
543
|
+
}
|
|
544
|
+
// local
|
|
545
|
+
async function uploadMedia(attachment, token, discussionType, logger) {
|
|
546
|
+
return new Promise(async (resolve, reject) => {
|
|
547
|
+
let filePath = generateFilePath(attachment.mimeType);
|
|
548
|
+
await downloadImage(attachment.url, filePath);
|
|
549
|
+
const T = new _socialTwit.default({
|
|
550
|
+
consumer_key: token.consumer_key,
|
|
551
|
+
consumer_secret: token.consumer_secret,
|
|
552
|
+
access_token: token.token,
|
|
553
|
+
access_token_secret: token.tokenSecret
|
|
554
|
+
});
|
|
555
|
+
let mediaCategory = discussionType === 'dm' ? 'dm' : 'tweet';
|
|
556
|
+
try {
|
|
557
|
+
T.postMediaChunked({
|
|
558
|
+
file_path: filePath
|
|
559
|
+
}, mediaCategory, function (err, data, response) {
|
|
560
|
+
if (err) {
|
|
561
|
+
reject(err);
|
|
562
|
+
}
|
|
563
|
+
resolve(data.media_id_string);
|
|
564
|
+
removeMedia(filePath, logger);
|
|
565
|
+
});
|
|
566
|
+
} catch (e) {
|
|
567
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed posting media`, e);
|
|
568
|
+
// this is just a safety precaution
|
|
569
|
+
removeMedia(filePath, logger);
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
function removeMedia(file, logger) {
|
|
574
|
+
try {
|
|
575
|
+
_fs.default.unlink(file, function (err) {
|
|
576
|
+
if (err) {
|
|
577
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed removing ${file}`, err);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
} catch (e) {
|
|
581
|
+
(0, _loggerHelpers.loggerError)(logger, `failed trying to remove media ${file} it may have already been removed`);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.comment = comment;
|
|
7
|
+
exports.likeVideo = likeVideo;
|
|
8
|
+
exports.reply = reply;
|
|
9
|
+
exports.sendRequest = sendRequest;
|
|
10
|
+
exports.unlikeVideo = unlikeVideo;
|
|
11
|
+
var _superagent = _interopRequireDefault(require("superagent"));
|
|
12
|
+
var _externalIdHelpers = require("../../lib/externalId.helpers.js");
|
|
13
|
+
var _loggerHelpers = require("../../lib/logger.helpers.js");
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
const YOUTUBE_API_URL = "https://www.googleapis.com/youtube/v3/";
|
|
16
|
+
async function sendPost(token) {
|
|
17
|
+
let paramString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
18
|
+
let postData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
19
|
+
let logger = arguments.length > 3 ? arguments[3] : undefined;
|
|
20
|
+
let response = {};
|
|
21
|
+
try {
|
|
22
|
+
response = await _superagent.default.post(YOUTUBE_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Authorization', `Bearer ${token}`).send(postData);
|
|
23
|
+
} catch (err) {
|
|
24
|
+
if (err && err.response && err.response.body && err.response.body.error) {
|
|
25
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}: ${err.response.body.error.message}`);
|
|
26
|
+
} else {
|
|
27
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}`, err);
|
|
28
|
+
}
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
return response;
|
|
32
|
+
}
|
|
33
|
+
async function sendRequest(token) {
|
|
34
|
+
let paramString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
35
|
+
let logger = arguments.length > 2 ? arguments[2] : undefined;
|
|
36
|
+
let response = {};
|
|
37
|
+
try {
|
|
38
|
+
response = await _superagent.default.get(YOUTUBE_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Authorization', `Bearer ${token}`).send();
|
|
39
|
+
} catch (err) {
|
|
40
|
+
if (err && err.response && err.response.body && err.response.body.error) {
|
|
41
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}: ${err.response.body.error.message}`);
|
|
42
|
+
} else {
|
|
43
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}`, err);
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
if (response.status !== 200) {
|
|
48
|
+
(0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api`, {
|
|
49
|
+
responseBody: JSON.stringify(response.body)
|
|
50
|
+
});
|
|
51
|
+
let error = new Error(`Failed to call facebook api`);
|
|
52
|
+
error.code = response.status;
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
return response.body;
|
|
56
|
+
}
|
|
57
|
+
async function likeVideo(token, externalId, logger) {
|
|
58
|
+
return setVideoRating(token, externalId, true, logger);
|
|
59
|
+
}
|
|
60
|
+
async function unlikeVideo(token, externalId, logger) {
|
|
61
|
+
return setVideoRating(token, externalId, false, logger);
|
|
62
|
+
}
|
|
63
|
+
async function setVideoRating(token, externalId) {
|
|
64
|
+
let like = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
65
|
+
let logger = arguments.length > 3 ? arguments[3] : undefined;
|
|
66
|
+
const requestResult = await sendPost(token, `videos/rate?id=${(0, _externalIdHelpers.removePrefix)(externalId)}&rating=${like ? 'like' : 'dislike'}`, logger);
|
|
67
|
+
return requestResult;
|
|
68
|
+
}
|
|
69
|
+
async function comment(token, inReplyToId, textOriginal, logger) {
|
|
70
|
+
const {
|
|
71
|
+
body: publishedMessage
|
|
72
|
+
} = (await sendPost(token, 'commentThreads?part=snippet', {
|
|
73
|
+
snippet: {
|
|
74
|
+
videoId: inReplyToId,
|
|
75
|
+
topLevelComment: {
|
|
76
|
+
snippet: {
|
|
77
|
+
textOriginal
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, logger)) || {};
|
|
82
|
+
return publishedMessage;
|
|
83
|
+
}
|
|
84
|
+
async function reply(token, inReplyToId, textOriginal, logger) {
|
|
85
|
+
const {
|
|
86
|
+
body: publishedMessage
|
|
87
|
+
} = await sendPost(token, 'comments?part=snippet', {
|
|
88
|
+
snippet: {
|
|
89
|
+
textOriginal,
|
|
90
|
+
parentId: inReplyToId
|
|
91
|
+
}
|
|
92
|
+
}, logger);
|
|
93
|
+
return publishedMessage;
|
|
94
|
+
}
|
|
@@ -78,13 +78,14 @@ Object.defineProperty(exports, "TikTokApiClient", {
|
|
|
78
78
|
return _tiktokApiClient.TikTokApiClient;
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
|
-
exports.TiktokNative = void 0;
|
|
81
|
+
exports.TwitterNative = exports.TiktokNative = void 0;
|
|
82
82
|
Object.defineProperty(exports, "WarpZoneApiClient", {
|
|
83
83
|
enumerable: true,
|
|
84
84
|
get: function () {
|
|
85
85
|
return _WarpZoneApiClient.WarpZoneApiClient;
|
|
86
86
|
}
|
|
87
87
|
});
|
|
88
|
+
exports.YoutubeNative = void 0;
|
|
88
89
|
Object.defineProperty(exports, "assetManagerTvmRepository", {
|
|
89
90
|
enumerable: true,
|
|
90
91
|
get: function () {
|
|
@@ -119,8 +120,12 @@ var FacebookNative = _interopRequireWildcard(require("./http/facebook.native.js"
|
|
|
119
120
|
exports.FacebookNative = FacebookNative;
|
|
120
121
|
var TiktokNative = _interopRequireWildcard(require("./http/tiktok.native.js"));
|
|
121
122
|
exports.TiktokNative = TiktokNative;
|
|
123
|
+
var YoutubeNative = _interopRequireWildcard(require("./http/youtube.native.js"));
|
|
124
|
+
exports.YoutubeNative = YoutubeNative;
|
|
122
125
|
var LinkedinNative = _interopRequireWildcard(require("./http/linkedin.native.js"));
|
|
123
126
|
exports.LinkedinNative = LinkedinNative;
|
|
127
|
+
var TwitterNative = _interopRequireWildcard(require("./http/twitter.native.js"));
|
|
128
|
+
exports.TwitterNative = TwitterNative;
|
|
124
129
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
125
130
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
126
131
|
const DocumentHelperFunctions = exports.DocumentHelperFunctions = {
|