@the-convocation/twitter-scraper 0.0.8

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.
Files changed (45) hide show
  1. package/.commitlintrc +5 -0
  2. package/.eslintcache +1 -0
  3. package/.eslintrc.js +24 -0
  4. package/.gitattributes +78 -0
  5. package/.prettierignore +2 -0
  6. package/.prettierrc +5 -0
  7. package/LICENSE +21 -0
  8. package/README.md +26 -0
  9. package/dist/api.js +77 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/auth.js +119 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/profile.js +103 -0
  14. package/dist/profile.js.map +1 -0
  15. package/dist/scraper.js +153 -0
  16. package/dist/scraper.js.map +1 -0
  17. package/dist/search.js +84 -0
  18. package/dist/search.js.map +1 -0
  19. package/dist/timeline-async.js +59 -0
  20. package/dist/timeline-async.js.map +1 -0
  21. package/dist/timeline.js +228 -0
  22. package/dist/timeline.js.map +1 -0
  23. package/dist/trends.js +46 -0
  24. package/dist/trends.js.map +1 -0
  25. package/dist/tweets.js +59 -0
  26. package/dist/tweets.js.map +1 -0
  27. package/dist/types/api.d.ts +16 -0
  28. package/dist/types/api.d.ts.map +1 -0
  29. package/dist/types/auth.d.ts +55 -0
  30. package/dist/types/auth.d.ts.map +1 -0
  31. package/dist/types/profile.d.ts +67 -0
  32. package/dist/types/profile.d.ts.map +1 -0
  33. package/dist/types/scraper.d.ts +102 -0
  34. package/dist/types/scraper.d.ts.map +1 -0
  35. package/dist/types/search.d.ts +19 -0
  36. package/dist/types/search.d.ts.map +1 -0
  37. package/dist/types/timeline-async.d.ts +15 -0
  38. package/dist/types/timeline-async.d.ts.map +1 -0
  39. package/dist/types/timeline.d.ts +154 -0
  40. package/dist/types/timeline.d.ts.map +1 -0
  41. package/dist/types/trends.d.ts +3 -0
  42. package/dist/types/trends.d.ts.map +1 -0
  43. package/dist/types/tweets.d.ts +52 -0
  44. package/dist/types/tweets.d.ts.map +1 -0
  45. package/package.json +52 -0
package/dist/search.js ADDED
@@ -0,0 +1,84 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { addApiParams, requestApi } from './api';
11
+ import { parseTweets, parseUsers, } from './timeline';
12
+ import { getTweetTimeline, getUserTimeline } from './timeline-async';
13
+ /**
14
+ * The categories that can be used in Twitter searches.
15
+ */
16
+ export var SearchMode;
17
+ (function (SearchMode) {
18
+ SearchMode[SearchMode["Top"] = 0] = "Top";
19
+ SearchMode[SearchMode["Latest"] = 1] = "Latest";
20
+ SearchMode[SearchMode["Photos"] = 2] = "Photos";
21
+ SearchMode[SearchMode["Videos"] = 3] = "Videos";
22
+ SearchMode[SearchMode["Users"] = 4] = "Users";
23
+ })(SearchMode || (SearchMode = {}));
24
+ export function searchTweets(query, maxTweets, includeReplies, searchMode, auth) {
25
+ return getTweetTimeline(query, maxTweets, (q, mt, c) => {
26
+ return fetchSearchTweets(q, mt, includeReplies, searchMode, auth, c);
27
+ });
28
+ }
29
+ export function searchProfiles(query, maxProfiles, auth) {
30
+ return getUserTimeline(query, maxProfiles, (q, mt, c) => {
31
+ return fetchSearchProfiles(q, mt, auth, c);
32
+ });
33
+ }
34
+ export function fetchSearchTweets(query, maxTweets, includeReplies, searchMode, auth, cursor) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const timeline = yield getSearchTimeline(query, maxTweets, includeReplies, searchMode, auth, cursor);
37
+ return parseTweets(timeline);
38
+ });
39
+ }
40
+ export function fetchSearchProfiles(query, maxProfiles, auth, cursor) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ const timeline = yield getSearchTimeline(query, maxProfiles, false, SearchMode.Users, auth, cursor);
43
+ return parseUsers(timeline);
44
+ });
45
+ }
46
+ function getSearchTimeline(query, maxItems, includeReplies, searchMode, auth, cursor) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ if (maxItems > 50) {
49
+ maxItems = 50;
50
+ }
51
+ const params = new URLSearchParams();
52
+ addApiParams(params, includeReplies);
53
+ params.set('q', query);
54
+ params.set('count', `${maxItems}`);
55
+ params.set('query_source', 'typed_query');
56
+ params.set('pc', '1');
57
+ params.set('spelling_corrections', '1');
58
+ if (cursor != null && cursor != '') {
59
+ params.set('cursor', cursor);
60
+ }
61
+ switch (searchMode) {
62
+ case SearchMode.Latest:
63
+ params.set('tweet_search_mode', 'live');
64
+ break;
65
+ case SearchMode.Photos:
66
+ params.set('result_filter', 'image');
67
+ break;
68
+ case SearchMode.Videos:
69
+ params.set('result_filter', 'video');
70
+ break;
71
+ case SearchMode.Users:
72
+ params.set('result_filter', 'user');
73
+ break;
74
+ default:
75
+ break;
76
+ }
77
+ const res = yield requestApi(`https://twitter.com/i/api/2/search/adaptive.json?${params.toString()}`, auth);
78
+ if (!res.success) {
79
+ throw res.err;
80
+ }
81
+ return res.value;
82
+ });
83
+ }
84
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
2
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
3
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
5
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
6
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
7
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
8
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
9
+ function fulfill(value) { resume("next", value); }
10
+ function reject(value) { resume("throw", value); }
11
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
12
+ };
13
+ export function getUserTimeline(query, maxProfiles, fetchFunc) {
14
+ return __asyncGenerator(this, arguments, function* getUserTimeline_1() {
15
+ let nProfiles = 0;
16
+ let cursor = undefined;
17
+ while (nProfiles < maxProfiles) {
18
+ const batch = yield __await(fetchFunc(query, maxProfiles, cursor));
19
+ const { profiles, next } = batch;
20
+ if (profiles.length === 0) {
21
+ break;
22
+ }
23
+ for (const profile of profiles) {
24
+ if (nProfiles < maxProfiles) {
25
+ cursor = next;
26
+ yield yield __await(profile);
27
+ }
28
+ else {
29
+ break;
30
+ }
31
+ nProfiles++;
32
+ }
33
+ }
34
+ });
35
+ }
36
+ export function getTweetTimeline(query, maxTweets, fetchFunc) {
37
+ return __asyncGenerator(this, arguments, function* getTweetTimeline_1() {
38
+ let nTweets = 0;
39
+ let cursor = undefined;
40
+ while (nTweets < maxTweets) {
41
+ const batch = yield __await(fetchFunc(query, maxTweets, cursor));
42
+ const { tweets, next } = batch;
43
+ if (tweets.length === 0) {
44
+ break;
45
+ }
46
+ for (const tweet of tweets) {
47
+ if (nTweets < maxTweets) {
48
+ cursor = next;
49
+ yield yield __await(tweet);
50
+ }
51
+ else {
52
+ break;
53
+ }
54
+ nTweets++;
55
+ }
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=timeline-async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-async.js","sourceRoot":"","sources":["../src/timeline-async.ts"],"names":[],"mappings":";;;;;;;;;;;;AAyBA,MAAM,UAAiB,eAAe,CACpC,KAAa,EACb,WAAmB,EACnB,SAAwB;;QAExB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,GAAuB,SAAS,CAAC;QAC3C,OAAO,SAAS,GAAG,WAAW,EAAE;YAC9B,MAAM,KAAK,GAA0B,cAAM,SAAS,CAClD,KAAK,EACL,WAAW,EACX,MAAM,CACP,CAAA,CAAC;YAEF,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YAEjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB,MAAM;aACP;YAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,IAAI,SAAS,GAAG,WAAW,EAAE;oBAC3B,MAAM,GAAG,IAAI,CAAC;oBACd,oBAAM,OAAO,CAAA,CAAC;iBACf;qBAAM;oBACL,MAAM;iBACP;gBAED,SAAS,EAAE,CAAC;aACb;SACF;IACH,CAAC;CAAA;AAED,MAAM,UAAiB,gBAAgB,CACrC,KAAa,EACb,SAAiB,EACjB,SAAsB;;QAEtB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,GAAuB,SAAS,CAAC;QAC3C,OAAO,OAAO,GAAG,SAAS,EAAE;YAC1B,MAAM,KAAK,GAAwB,cAAM,SAAS,CAChD,KAAK,EACL,SAAS,EACT,MAAM,CACP,CAAA,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,MAAM;aACP;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,IAAI,OAAO,GAAG,SAAS,EAAE;oBACvB,MAAM,GAAG,IAAI,CAAC;oBACd,oBAAM,KAAK,CAAA,CAAC;iBACb;qBAAM;oBACL,MAAM;iBACP;gBAED,OAAO,EAAE,CAAC;aACX;SACF;IACH,CAAC;CAAA"}
@@ -0,0 +1,228 @@
1
+ import { parseProfile } from './profile';
2
+ const reHashtag = /\B(\#\S+\b)/g;
3
+ const reTwitterUrl = /https:(\/\/t\.co\/([A-Za-z0-9]|[A-Za-z]){10})/g;
4
+ const reUsername = /\B(\@\S{1,15}\b)/g;
5
+ export function parseTweet(timeline, id) {
6
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
7
+ const tweets = (_b = (_a = timeline.globalObjects) === null || _a === void 0 ? void 0 : _a.tweets) !== null && _b !== void 0 ? _b : {};
8
+ const tweet = tweets[id];
9
+ if (tweet == null || tweet.user_id_str == null) {
10
+ return null;
11
+ }
12
+ const users = (_d = (_c = timeline.globalObjects) === null || _c === void 0 ? void 0 : _c.users) !== null && _d !== void 0 ? _d : {};
13
+ const user = users[tweet.user_id_str];
14
+ const username = user === null || user === void 0 ? void 0 : user.screen_name;
15
+ if (user == null || username == null) {
16
+ // TODO: change the return type to a result, and return an error; this shouldn't happen, but we don't know what data we're dealing with.
17
+ return null;
18
+ }
19
+ const tw = {
20
+ id,
21
+ hashtags: [],
22
+ likes: tweet.favorite_count,
23
+ permanentUrl: `https://twitter.com/${username}/status/${id}`,
24
+ photos: [],
25
+ replies: tweet.reply_count,
26
+ retweets: tweet.retweet_count,
27
+ text: tweet.full_text,
28
+ urls: [],
29
+ userId: tweet.user_id_str,
30
+ username,
31
+ videos: [],
32
+ };
33
+ if (tweet.created_at != null) {
34
+ tw.timeParsed = new Date(Date.parse(tweet.created_at));
35
+ tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);
36
+ }
37
+ if (((_e = tweet.place) === null || _e === void 0 ? void 0 : _e.id) != null) {
38
+ tw.place = tweet.place;
39
+ }
40
+ if (tweet.quoted_status_id_str != null) {
41
+ const quotedStatus = parseTweet(timeline, tweet.quoted_status_id_str);
42
+ if (quotedStatus != null) {
43
+ tw.isQuoted = true;
44
+ tw.quotedStatus = quotedStatus;
45
+ }
46
+ }
47
+ if (tweet.in_reply_to_status_id_str != null) {
48
+ const replyStatus = parseTweet(timeline, tweet.in_reply_to_status_id_str);
49
+ if (replyStatus != null) {
50
+ tw.isReply = true;
51
+ tw.inReplyToStatus = replyStatus;
52
+ }
53
+ }
54
+ if (tweet.retweeted_status_id_str != null) {
55
+ const retweetedStatus = parseTweet(timeline, tweet.retweeted_status_id_str);
56
+ if (retweetedStatus != null) {
57
+ tw.isRetweet = true;
58
+ tw.retweetedStatus = retweetedStatus;
59
+ }
60
+ }
61
+ const pinnedTweets = (_f = user.pinned_tweet_ids_str) !== null && _f !== void 0 ? _f : [];
62
+ for (const pinned of pinnedTweets) {
63
+ if (tweet.conversation_id_str == pinned) {
64
+ tw.isPin = true;
65
+ break;
66
+ }
67
+ }
68
+ const hashtags = (_h = (_g = tweet.entities) === null || _g === void 0 ? void 0 : _g.hashtags) !== null && _h !== void 0 ? _h : [];
69
+ for (const hashtag of hashtags) {
70
+ if (hashtag.text != null) {
71
+ tw.hashtags.push(hashtag.text);
72
+ }
73
+ }
74
+ const media = (_k = (_j = tweet.extended_entities) === null || _j === void 0 ? void 0 : _j.media) !== null && _k !== void 0 ? _k : [];
75
+ for (const m of media) {
76
+ if (m.media_url_https == null) {
77
+ continue;
78
+ }
79
+ if (m.type === 'photo') {
80
+ tw.photos.push(m.media_url_https);
81
+ }
82
+ else if (m.type === 'video' && m.id_str != null) {
83
+ const video = {
84
+ id: m.id_str,
85
+ preview: m.media_url_https,
86
+ };
87
+ let maxBitrate = 0;
88
+ const variants = (_m = (_l = m.video_info) === null || _l === void 0 ? void 0 : _l.variants) !== null && _m !== void 0 ? _m : [];
89
+ for (const variant of variants) {
90
+ const bitrate = variant.bitrate;
91
+ if (bitrate != null && bitrate > maxBitrate && variant.url != null) {
92
+ let variantUrl = variant.url;
93
+ const stringStart = 0;
94
+ const tagSuffixIdx = variantUrl.indexOf('?tag=10');
95
+ if (tagSuffixIdx !== -1) {
96
+ variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);
97
+ }
98
+ video.url = variantUrl;
99
+ maxBitrate = bitrate;
100
+ }
101
+ }
102
+ tw.photos.push(video.preview);
103
+ tw.videos.push(video);
104
+ }
105
+ const sensitive = m.ext_sensitive_media_warning;
106
+ if (sensitive != null) {
107
+ tw.sensitiveContent =
108
+ sensitive.adult_content ||
109
+ sensitive.graphic_violence ||
110
+ sensitive.other;
111
+ }
112
+ }
113
+ const urls = (_p = (_o = tweet.entities) === null || _o === void 0 ? void 0 : _o.urls) !== null && _p !== void 0 ? _p : [];
114
+ for (const url of urls) {
115
+ if ((url === null || url === void 0 ? void 0 : url.expanded_url) != null) {
116
+ tw.urls.push(url.expanded_url);
117
+ }
118
+ }
119
+ // HTML parsing with regex :)
120
+ let html = (_q = tweet.full_text) !== null && _q !== void 0 ? _q : '';
121
+ html = html.replace(reHashtag, (hashtag) => {
122
+ return `<a href="https://twitter.com/hashtag/${hashtag.replace('#', '')}">${hashtag}</a>`;
123
+ });
124
+ html = html.replace(reUsername, (username) => {
125
+ return `<a href="https://twitter.com/${username[0].replace('@', '')}">${username[0]}</a>`;
126
+ });
127
+ const foundedMedia = [];
128
+ html = html.replace(reTwitterUrl, (tco) => {
129
+ var _a, _b, _c, _d;
130
+ for (const entity of (_b = (_a = tweet.entities) === null || _a === void 0 ? void 0 : _a.urls) !== null && _b !== void 0 ? _b : []) {
131
+ if (tco === entity.url && entity.expanded_url != null) {
132
+ return `<a href="${entity.expanded_url}">${tco}</a>`;
133
+ }
134
+ }
135
+ for (const entity of (_d = (_c = tweet.extended_entities) === null || _c === void 0 ? void 0 : _c.media) !== null && _d !== void 0 ? _d : []) {
136
+ if (tco === entity.url && entity.media_url_https != null) {
137
+ foundedMedia.push(entity.media_url_https);
138
+ return `<br><a href="${tco}"><img src="${entity.media_url_https}"/></a>`;
139
+ }
140
+ }
141
+ return tco;
142
+ });
143
+ for (const url of tw.photos) {
144
+ if (foundedMedia.indexOf(url) !== -1) {
145
+ continue;
146
+ }
147
+ html += `<br><img src="${url}"/>`;
148
+ }
149
+ html = html.replace(/\n/g, '<br>');
150
+ tw.html = html;
151
+ return tw;
152
+ }
153
+ export function parseTweets(timeline) {
154
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
155
+ let cursor;
156
+ let pinnedTweet;
157
+ let orderedTweets = [];
158
+ for (const instruction of (_b = (_a = timeline.timeline) === null || _a === void 0 ? void 0 : _a.instructions) !== null && _b !== void 0 ? _b : []) {
159
+ const pinnedTweetId = (_h = (_g = (_f = (_e = (_d = (_c = instruction.pinEntry) === null || _c === void 0 ? void 0 : _c.entry) === null || _d === void 0 ? void 0 : _d.content) === null || _e === void 0 ? void 0 : _e.item) === null || _f === void 0 ? void 0 : _f.content) === null || _g === void 0 ? void 0 : _g.tweet) === null || _h === void 0 ? void 0 : _h.id;
160
+ if (pinnedTweetId != null) {
161
+ const tweet = parseTweet(timeline, pinnedTweetId);
162
+ if (tweet != null) {
163
+ pinnedTweet = tweet;
164
+ }
165
+ }
166
+ for (const entry of (_k = (_j = instruction.addEntries) === null || _j === void 0 ? void 0 : _j.entries) !== null && _k !== void 0 ? _k : []) {
167
+ const tweetId = (_p = (_o = (_m = (_l = entry.content) === null || _l === void 0 ? void 0 : _l.item) === null || _m === void 0 ? void 0 : _m.content) === null || _o === void 0 ? void 0 : _o.tweet) === null || _p === void 0 ? void 0 : _p.id;
168
+ if (tweetId != null) {
169
+ const tweet = parseTweet(timeline, tweetId);
170
+ if (tweet != null) {
171
+ orderedTweets.push(tweet);
172
+ }
173
+ }
174
+ const operation = (_q = entry.content) === null || _q === void 0 ? void 0 : _q.operation;
175
+ if (((_r = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _r === void 0 ? void 0 : _r.cursorType) === 'Bottom') {
176
+ cursor = (_s = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _s === void 0 ? void 0 : _s.value;
177
+ }
178
+ }
179
+ const operation = (_v = (_u = (_t = instruction.replaceEntry) === null || _t === void 0 ? void 0 : _t.entry) === null || _u === void 0 ? void 0 : _u.content) === null || _v === void 0 ? void 0 : _v.operation;
180
+ if (((_w = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _w === void 0 ? void 0 : _w.cursorType) === 'Bottom') {
181
+ cursor = operation.cursor.value;
182
+ }
183
+ }
184
+ if (pinnedTweet != null && orderedTweets.length > 0) {
185
+ orderedTweets = [pinnedTweet, ...orderedTweets];
186
+ }
187
+ return {
188
+ tweets: orderedTweets,
189
+ next: cursor,
190
+ };
191
+ }
192
+ export function parseUsers(timeline) {
193
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
194
+ const users = new Map();
195
+ const userObjects = (_b = (_a = timeline.globalObjects) === null || _a === void 0 ? void 0 : _a.users) !== null && _b !== void 0 ? _b : {};
196
+ for (const id in userObjects) {
197
+ const legacy = userObjects[id];
198
+ if (legacy == null) {
199
+ continue;
200
+ }
201
+ const user = parseProfile(legacy);
202
+ users.set(id, user);
203
+ }
204
+ let cursor;
205
+ const orderedProfiles = [];
206
+ for (const instruction of (_d = (_c = timeline.timeline) === null || _c === void 0 ? void 0 : _c.instructions) !== null && _d !== void 0 ? _d : []) {
207
+ for (const entry of (_f = (_e = instruction.addEntries) === null || _e === void 0 ? void 0 : _e.entries) !== null && _f !== void 0 ? _f : []) {
208
+ const userId = (_k = (_j = (_h = (_g = entry.content) === null || _g === void 0 ? void 0 : _g.item) === null || _h === void 0 ? void 0 : _h.content) === null || _j === void 0 ? void 0 : _j.user) === null || _k === void 0 ? void 0 : _k.id;
209
+ const profile = users.get(userId);
210
+ if (profile != null) {
211
+ orderedProfiles.push(profile);
212
+ }
213
+ const operation = (_l = entry.content) === null || _l === void 0 ? void 0 : _l.operation;
214
+ if (((_m = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _m === void 0 ? void 0 : _m.cursorType) === 'Bottom') {
215
+ cursor = (_o = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _o === void 0 ? void 0 : _o.value;
216
+ }
217
+ }
218
+ const operation = (_r = (_q = (_p = instruction.replaceEntry) === null || _p === void 0 ? void 0 : _p.entry) === null || _q === void 0 ? void 0 : _q.content) === null || _r === void 0 ? void 0 : _r.operation;
219
+ if (((_s = operation === null || operation === void 0 ? void 0 : operation.cursor) === null || _s === void 0 ? void 0 : _s.cursorType) === 'Bottom') {
220
+ cursor = operation.cursor.value;
221
+ }
222
+ }
223
+ return {
224
+ profiles: orderedProfiles,
225
+ next: cursor,
226
+ };
227
+ }
228
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
package/dist/trends.js ADDED
@@ -0,0 +1,46 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { addApiParams, requestApi } from './api';
11
+ export function getTrends(auth) {
12
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
13
+ return __awaiter(this, void 0, void 0, function* () {
14
+ const params = new URLSearchParams();
15
+ addApiParams(params, false);
16
+ params.set('count', '20');
17
+ params.set('candidate_source', 'trends');
18
+ params.set('include_page_configuration', 'false');
19
+ params.set('entity_tokens', 'false');
20
+ const res = yield requestApi(`https://twitter.com/i/api/2/guide.json?${params.toString()}`, auth);
21
+ if (!res.success) {
22
+ throw res.err;
23
+ }
24
+ const instructions = (_b = (_a = res.value.timeline) === null || _a === void 0 ? void 0 : _a.instructions) !== null && _b !== void 0 ? _b : [];
25
+ if (instructions.length < 2) {
26
+ throw new Error('No trend entries found.');
27
+ }
28
+ // Some of this is silly, but for now we're assuming we know nothing about the
29
+ // data, and that anything can be missing. Go has non-nilable strings and empty
30
+ // slices are nil, so it largely doesn't need to worry about this.
31
+ const entries = (_d = (_c = instructions[1].addEntries) === null || _c === void 0 ? void 0 : _c.entries) !== null && _d !== void 0 ? _d : [];
32
+ if (entries.length < 2) {
33
+ throw new Error('No trend entries found.');
34
+ }
35
+ const items = (_g = (_f = (_e = entries[1].content) === null || _e === void 0 ? void 0 : _e.timelineModule) === null || _f === void 0 ? void 0 : _f.items) !== null && _g !== void 0 ? _g : [];
36
+ const trends = [];
37
+ for (const item of items) {
38
+ const trend = (_o = (_m = (_l = (_k = (_j = (_h = item.item) === null || _h === void 0 ? void 0 : _h.clientEventInfo) === null || _j === void 0 ? void 0 : _j.details) === null || _k === void 0 ? void 0 : _k.guideDetails) === null || _l === void 0 ? void 0 : _l.transparentGuideDetails) === null || _m === void 0 ? void 0 : _m.trendMetadata) === null || _o === void 0 ? void 0 : _o.trendName;
39
+ if (trend != null) {
40
+ trends.push(trend);
41
+ }
42
+ }
43
+ return trends;
44
+ });
45
+ }
46
+ //# sourceMappingURL=trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trends.js","sourceRoot":"","sources":["../src/trends.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAIjD,MAAM,UAAgB,SAAS,CAAC,IAAsB;;;QACpD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,0CAA0C,MAAM,CAAC,QAAQ,EAAE,EAAE,EAC7D,IAAI,CACL,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,MAAM,GAAG,CAAC,GAAG,CAAC;SACf;QAED,MAAM,YAAY,GAAG,MAAA,MAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,0CAAE,YAAY,mCAAI,EAAE,CAAC;QAC5D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QAED,8EAA8E;QAC9E,+EAA+E;QAC/E,kEAAkE;QAClE,MAAM,OAAO,GAAG,MAAA,MAAA,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,0CAAE,OAAO,mCAAI,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QAED,MAAM,KAAK,GAAG,MAAA,MAAA,MAAA,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,0CAAE,cAAc,0CAAE,KAAK,mCAAI,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,KAAK,GACT,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,eAAe,0CAAE,OAAO,0CAAE,YAAY,0CAAE,uBAAuB,0CACtE,aAAa,0CAAE,SAAS,CAAC;YAC/B,IAAI,KAAK,IAAI,IAAI,EAAE;gBACjB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACpB;SACF;QAED,OAAO,MAAM,CAAC;;CACf"}
package/dist/tweets.js ADDED
@@ -0,0 +1,59 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { addApiParams, requestApi } from './api';
11
+ import { getUserIdByScreenName } from './profile';
12
+ import { parseTweets } from './timeline';
13
+ import { getTweetTimeline } from './timeline-async';
14
+ export function fetchTweets(user, maxTweets, includeReplies, cursor, auth) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ if (maxTweets > 200) {
17
+ maxTweets = 200;
18
+ }
19
+ const userIdRes = yield getUserIdByScreenName(user, auth);
20
+ if (!userIdRes.success) {
21
+ throw userIdRes.err;
22
+ }
23
+ const params = new URLSearchParams();
24
+ addApiParams(params, includeReplies);
25
+ params.set('count', `${maxTweets}`);
26
+ params.set('userId', userIdRes.value);
27
+ if (cursor != null && cursor != '') {
28
+ params.set('cursor', cursor);
29
+ }
30
+ const res = yield requestApi(`https://api.twitter.com/2/timeline/profile/${userIdRes.value}.json?${params.toString()}`, auth);
31
+ if (!res.success) {
32
+ throw res.err;
33
+ }
34
+ return parseTweets(res.value);
35
+ });
36
+ }
37
+ export function getTweets(user, maxTweets, includeReplies, auth) {
38
+ return getTweetTimeline(user, maxTweets, (q, mt, c) => {
39
+ return fetchTweets(q, mt, includeReplies, c, auth);
40
+ });
41
+ }
42
+ export function getTweet(id, includeReplies, auth) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ const params = new URLSearchParams();
45
+ addApiParams(params, includeReplies);
46
+ const res = yield requestApi(`https://twitter.com/i/api/2/timeline/conversation/${id}.json?${params.toString()}`, auth);
47
+ if (!res.success) {
48
+ throw res.err;
49
+ }
50
+ const { tweets } = parseTweets(res.value);
51
+ for (const tweet of tweets) {
52
+ if (tweet.id === id) {
53
+ return tweet;
54
+ }
55
+ }
56
+ return null;
57
+ });
58
+ }
59
+ //# sourceMappingURL=tweets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tweets.js","sourceRoot":"","sources":["../src/tweets.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAe,WAAW,EAAuB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAmDpD,MAAM,UAAgB,WAAW,CAC/B,IAAY,EACZ,SAAiB,EACjB,cAAuB,EACvB,MAA0B,EAC1B,IAAsB;;QAEtB,IAAI,SAAS,GAAG,GAAG,EAAE;YACnB,SAAS,GAAG,GAAG,CAAC;SACjB;QAED,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YACtB,MAAM,SAAS,CAAC,GAAG,CAAC;SACrB;QAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAErC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE;YAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;SAC9B;QAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,8CACE,SAAS,CAAC,KACZ,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,EAC5B,IAAI,CACL,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,MAAM,GAAG,CAAC,GAAG,CAAC;SACf;QAED,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CAAA;AAED,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,SAAiB,EACjB,cAAuB,EACvB,IAAsB;IAEtB,OAAO,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QACpD,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAgB,QAAQ,CAC5B,EAAU,EACV,cAAuB,EACvB,IAAsB;;QAEtB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,qDAAqD,EAAE,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,EACnF,IAAI,CACL,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,MAAM,GAAG,CAAC,GAAG,CAAC;SACf;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE;gBACnB,OAAO,KAAK,CAAC;aACd;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CAAA"}
@@ -0,0 +1,16 @@
1
+ import { TwitterGuestAuth } from './auth';
2
+ export declare const bearerToken = "AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw";
3
+ export declare const bearerToken2 = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
4
+ /**
5
+ * An API result container.
6
+ */
7
+ export declare type RequestApiResult<T> = {
8
+ success: true;
9
+ value: T;
10
+ } | {
11
+ success: false;
12
+ err: Error;
13
+ };
14
+ export declare function requestApi<T>(url: string, auth: TwitterGuestAuth): Promise<RequestApiResult<T>>;
15
+ export declare function addApiParams(params: URLSearchParams, includeTweetReplies: boolean): URLSearchParams;
16
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,WAAW,uHAC8F,CAAC;AACvH,eAAO,MAAM,YAAY,6GACmF,CAAC;AAE7G;;GAEG;AACH,oBAAY,gBAAgB,CAAC,CAAC,IAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC3B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC;AAEnC,wBAAsB,UAAU,CAAC,CAAC,EAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAmC9B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,OAAO,GAC3B,eAAe,CA8BjB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * A guest authentication token manager. Automatically handles token refreshes.
3
+ */
4
+ export declare class TwitterGuestAuth {
5
+ private bearerToken;
6
+ private cookie?;
7
+ private guestToken?;
8
+ private guestCreatedAt?;
9
+ private xCsrfToken?;
10
+ constructor(bearerToken: string, cookie?: string, xCsrfToken?: string);
11
+ /**
12
+ * Deletes the authentication token.
13
+ */
14
+ deleteToken(): void;
15
+ /**
16
+ * Returns if the authentication state has a token.
17
+ * @returns `true` if the authentication state has a token; `false` otherwise.
18
+ */
19
+ hasToken(): boolean;
20
+ /**
21
+ * Returns the time that authentication was performed.
22
+ * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet.
23
+ */
24
+ authenticatedAt(): Date | null;
25
+ /**
26
+ * Sets a cookie string for use in requests.
27
+ * @param value The new cookie to use in requests.
28
+ */
29
+ useCookie(value: string): void;
30
+ /**
31
+ * Sets a new CSRF token for use in requests.
32
+ * @param value The new CSRF token to use in requests.
33
+ */
34
+ useCsrfToken(value: string): void;
35
+ /**
36
+ * Installs the authentication information into a headers-like object. If needed, the
37
+ * authentication token will be updated from the API automatically.
38
+ * @param headers A key-value object representing a request's headers.
39
+ * @returns A builder that can be used to add or override other relevant data, or to
40
+ * complete the task.
41
+ */
42
+ installTo(headers: {
43
+ [key: string]: unknown;
44
+ }): Promise<void>;
45
+ /**
46
+ * Updates the authentication state with a new guest token from the Twitter API.
47
+ */
48
+ updateToken(): Promise<void>;
49
+ /**
50
+ * Returns if the authentication token needs to be updated or not.
51
+ * @returns `true` if the token needs to be updated; `false` otherwise.
52
+ */
53
+ private shouldUpdate;
54
+ }
55
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAO;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAMrE;;OAEG;IACH,WAAW;IAKX;;;OAGG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACH,eAAe,IAAI,IAAI,GAAG,IAAI;IAQ9B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B;;;;;;OAMG;IACG,SAAS,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE;;OAEG;IACG,WAAW;IA0BjB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAQrB"}