@the-convocation/twitter-scraper 0.2.0 → 0.3.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.
Files changed (46) hide show
  1. package/dist/_module.d.ts +1 -1
  2. package/dist/_module.d.ts.map +1 -1
  3. package/dist/api.d.ts +18 -0
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +23 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/auth-user.d.ts.map +1 -1
  8. package/dist/auth-user.js +12 -0
  9. package/dist/auth-user.js.map +1 -1
  10. package/dist/scraper.d.ts +13 -13
  11. package/dist/scraper.d.ts.map +1 -1
  12. package/dist/scraper.js +20 -17
  13. package/dist/scraper.js.map +1 -1
  14. package/dist/search.d.ts +4 -4
  15. package/dist/search.d.ts.map +1 -1
  16. package/dist/search.js +39 -24
  17. package/dist/search.js.map +1 -1
  18. package/dist/timeline-async.d.ts +2 -2
  19. package/dist/timeline-async.d.ts.map +1 -1
  20. package/dist/timeline-search.d.ts +20 -0
  21. package/dist/timeline-search.d.ts.map +1 -0
  22. package/dist/timeline-search.js +75 -0
  23. package/dist/timeline-search.js.map +1 -0
  24. package/dist/timeline-tweet-util.d.ts +9 -0
  25. package/dist/timeline-tweet-util.d.ts.map +1 -0
  26. package/dist/timeline-tweet-util.js +102 -0
  27. package/dist/timeline-tweet-util.js.map +1 -0
  28. package/dist/{timeline.d.ts → timeline-v1.d.ts} +36 -9
  29. package/dist/timeline-v1.d.ts.map +1 -0
  30. package/dist/{timeline.js → timeline-v1.js} +30 -124
  31. package/dist/timeline-v1.js.map +1 -0
  32. package/dist/timeline-v2.d.ts +61 -0
  33. package/dist/timeline-v2.d.ts.map +1 -0
  34. package/dist/timeline-v2.js +194 -0
  35. package/dist/timeline-v2.js.map +1 -0
  36. package/dist/tweets.d.ts +12 -6
  37. package/dist/tweets.d.ts.map +1 -1
  38. package/dist/tweets.js +52 -19
  39. package/dist/tweets.js.map +1 -1
  40. package/dist/type-util.d.ts +6 -0
  41. package/dist/type-util.d.ts.map +1 -0
  42. package/dist/type-util.js +14 -0
  43. package/dist/type-util.js.map +1 -0
  44. package/package.json +3 -1
  45. package/dist/timeline.d.ts.map +0 -1
  46. package/dist/timeline.js.map +0 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSearchTimelineUsers = exports.parseSearchTimelineTweets = void 0;
4
+ const profile_1 = require("./profile");
5
+ const timeline_v2_1 = require("./timeline-v2");
6
+ function parseSearchTimelineTweets(timeline) {
7
+ let cursor;
8
+ const tweets = [];
9
+ const instructions = timeline.data?.search_by_raw_query?.search_timeline?.timeline
10
+ ?.instructions ?? [];
11
+ for (const instruction of instructions) {
12
+ if (instruction.type === 'TimelineAddEntries' ||
13
+ instruction.type === 'TimelineReplaceEntry') {
14
+ if (instruction.entry?.content?.cursorType === 'Bottom') {
15
+ cursor = instruction.entry.content.value;
16
+ continue;
17
+ }
18
+ for (const entry of instruction.entries ?? []) {
19
+ const itemContent = entry.content?.itemContent;
20
+ if (itemContent?.tweetDisplayType === 'Tweet') {
21
+ const tweetResultRaw = itemContent.tweet_results?.result;
22
+ const tweetResult = (0, timeline_v2_1.parseLegacyTweet)(tweetResultRaw?.core?.user_results?.result?.legacy, tweetResultRaw?.legacy);
23
+ if (tweetResult.success) {
24
+ if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) {
25
+ const views = parseInt(tweetResultRaw.views.count);
26
+ if (!isNaN(views)) {
27
+ tweetResult.tweet.views = views;
28
+ }
29
+ }
30
+ tweets.push(tweetResult.tweet);
31
+ }
32
+ }
33
+ else if (entry.content?.cursorType === 'Bottom') {
34
+ cursor = entry.content.value;
35
+ }
36
+ }
37
+ }
38
+ }
39
+ return { tweets, next: cursor };
40
+ }
41
+ exports.parseSearchTimelineTweets = parseSearchTimelineTweets;
42
+ function parseSearchTimelineUsers(timeline) {
43
+ let cursor;
44
+ const profiles = [];
45
+ const instructions = timeline.data?.search_by_raw_query?.search_timeline?.timeline
46
+ ?.instructions ?? [];
47
+ for (const instruction of instructions) {
48
+ if (instruction.type === 'TimelineAddEntries' ||
49
+ instruction.type === 'TimelineReplaceEntry') {
50
+ if (instruction.entry?.content?.cursorType === 'Bottom') {
51
+ cursor = instruction.entry.content.value;
52
+ continue;
53
+ }
54
+ for (const entry of instruction.entries ?? []) {
55
+ const itemContent = entry.content?.itemContent;
56
+ if (itemContent?.userDisplayType === 'User') {
57
+ const userResultRaw = itemContent.user_results?.result;
58
+ if (userResultRaw?.legacy) {
59
+ const profile = (0, profile_1.parseProfile)(userResultRaw.legacy);
60
+ if (!profile.userId) {
61
+ profile.userId = itemContent.user_results?.result?.rest_id;
62
+ }
63
+ profiles.push(profile);
64
+ }
65
+ }
66
+ else if (entry.content?.cursorType === 'Bottom') {
67
+ cursor = entry.content.value;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ return { profiles, next: cursor };
73
+ }
74
+ exports.parseSearchTimelineUsers = parseSearchTimelineUsers;
75
+ //# sourceMappingURL=timeline-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-search.js","sourceRoot":"","sources":["../src/timeline-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1';
2
+ import { Photo, Video } from './tweets';
3
+ export declare function parseMediaGroups(media: TimelineMediaExtendedRaw[]): {
4
+ sensitiveContent?: boolean;
5
+ photos: Photo[];
6
+ videos: Video[];
7
+ };
8
+ export declare function reconstructTweetHtml(tweet: LegacyTweetRaw, photos: Photo[], videos: Video[]): string;
9
+ //# sourceMappingURL=timeline-tweet-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-tweet-util.d.ts","sourceRoot":"","sources":["../src/timeline-tweet-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAOxC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,EAAE,GAAG;IACnE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CA2BA;AA8BD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,KAAK,EAAE,GACd,MAAM,CA6BR"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reconstructTweetHtml = exports.parseMediaGroups = void 0;
4
+ const type_util_1 = require("./type-util");
5
+ const reHashtag = /\B(\#\S+\b)/g;
6
+ const reTwitterUrl = /https:(\/\/t\.co\/([A-Za-z0-9]|[A-Za-z]){10})/g;
7
+ const reUsername = /\B(\@\S{1,15}\b)/g;
8
+ function parseMediaGroups(media) {
9
+ const photos = [];
10
+ const videos = [];
11
+ let sensitiveContent = undefined;
12
+ for (const m of media
13
+ .filter((0, type_util_1.isFieldDefined)('id_str'))
14
+ .filter((0, type_util_1.isFieldDefined)('media_url_https'))) {
15
+ if (m.type === 'photo') {
16
+ photos.push({
17
+ id: m.id_str,
18
+ url: m.media_url_https,
19
+ });
20
+ }
21
+ else if (m.type === 'video') {
22
+ videos.push(parseVideo(m));
23
+ }
24
+ const sensitive = m.ext_sensitive_media_warning;
25
+ if (sensitive != null) {
26
+ sensitiveContent =
27
+ sensitive.adult_content ||
28
+ sensitive.graphic_violence ||
29
+ sensitive.other;
30
+ }
31
+ }
32
+ return { sensitiveContent, photos, videos };
33
+ }
34
+ exports.parseMediaGroups = parseMediaGroups;
35
+ function parseVideo(m) {
36
+ const video = {
37
+ id: m.id_str,
38
+ preview: m.media_url_https,
39
+ };
40
+ let maxBitrate = 0;
41
+ const variants = m.video_info?.variants ?? [];
42
+ for (const variant of variants) {
43
+ const bitrate = variant.bitrate;
44
+ if (bitrate != null && bitrate > maxBitrate && variant.url != null) {
45
+ let variantUrl = variant.url;
46
+ const stringStart = 0;
47
+ const tagSuffixIdx = variantUrl.indexOf('?tag=10');
48
+ if (tagSuffixIdx !== -1) {
49
+ variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);
50
+ }
51
+ video.url = variantUrl;
52
+ maxBitrate = bitrate;
53
+ }
54
+ }
55
+ return video;
56
+ }
57
+ function reconstructTweetHtml(tweet, photos, videos) {
58
+ const media = [];
59
+ // HTML parsing with regex :)
60
+ let html = tweet.full_text ?? '';
61
+ html = html.replace(reHashtag, linkHashtagHtml);
62
+ html = html.replace(reUsername, linkUsernameHtml);
63
+ html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media));
64
+ for (const { url } of photos) {
65
+ if (media.indexOf(url) !== -1) {
66
+ continue;
67
+ }
68
+ html += `<br><img src="${url}"/>`;
69
+ }
70
+ for (const { preview: url } of videos) {
71
+ if (media.indexOf(url) !== -1) {
72
+ continue;
73
+ }
74
+ html += `<br><img src="${url}"/>`;
75
+ }
76
+ html = html.replace(/\n/g, '<br>');
77
+ return html;
78
+ }
79
+ exports.reconstructTweetHtml = reconstructTweetHtml;
80
+ function linkHashtagHtml(hashtag) {
81
+ return `<a href="https://twitter.com/hashtag/${hashtag.replace('#', '')}">${hashtag}</a>`;
82
+ }
83
+ function linkUsernameHtml(username) {
84
+ return `<a href="https://twitter.com/${username[0].replace('@', '')}">${username[0]}</a>`;
85
+ }
86
+ function unwrapTcoUrlHtml(tweet, foundedMedia) {
87
+ return function (tco) {
88
+ for (const entity of tweet.entities?.urls ?? []) {
89
+ if (tco === entity.url && entity.expanded_url != null) {
90
+ return `<a href="${entity.expanded_url}">${tco}</a>`;
91
+ }
92
+ }
93
+ for (const entity of tweet.extended_entities?.media ?? []) {
94
+ if (tco === entity.url && entity.media_url_https != null) {
95
+ foundedMedia.push(entity.media_url_https);
96
+ return `<br><a href="${tco}"><img src="${entity.media_url_https}"/></a>`;
97
+ }
98
+ }
99
+ return tco;
100
+ };
101
+ }
102
+ //# sourceMappingURL=timeline-tweet-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-tweet-util.js","sourceRoot":"","sources":["../src/timeline-tweet-util.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,32 @@ export interface TimelineMediaExtendedRaw {
37
37
  url?: string;
38
38
  video_info?: VideoInfo;
39
39
  }
40
- export interface TimelineTweetRaw {
40
+ export interface TimelineResultRaw {
41
+ __typename?: string;
42
+ core?: {
43
+ user_results?: {
44
+ result?: {
45
+ is_blue_verified?: boolean;
46
+ legacy?: LegacyUserRaw;
47
+ };
48
+ };
49
+ };
50
+ views?: {
51
+ count?: string;
52
+ };
53
+ note_tweet?: {
54
+ note_tweet_results?: {
55
+ result?: {
56
+ text?: string;
57
+ };
58
+ };
59
+ };
60
+ quoted_status_result?: {
61
+ result?: TimelineResultRaw;
62
+ };
63
+ legacy?: LegacyTweetRaw;
64
+ }
65
+ export interface LegacyTweetRaw {
41
66
  conversation_id_str?: string;
42
67
  created_at?: string;
43
68
  favorite_count?: number;
@@ -51,11 +76,15 @@ export interface TimelineTweetRaw {
51
76
  extended_entities?: {
52
77
  media?: TimelineMediaExtendedRaw[];
53
78
  };
79
+ id_str?: string;
54
80
  in_reply_to_status_id_str?: string;
55
81
  place?: PlaceRaw;
56
82
  reply_count?: number;
57
83
  retweet_count?: number;
58
84
  retweeted_status_id_str?: string;
85
+ retweeted_status_result?: {
86
+ result?: TimelineResultRaw;
87
+ };
59
88
  quoted_status_id_str?: string;
60
89
  time?: string;
61
90
  user_id_str?: string;
@@ -66,7 +95,7 @@ export interface TimelineTweetRaw {
66
95
  }
67
96
  export interface TimelineGlobalObjectsRaw {
68
97
  tweets?: {
69
- [key: string]: TimelineTweetRaw | undefined;
98
+ [key: string]: LegacyTweetRaw | undefined;
70
99
  };
71
100
  users?: {
72
101
  [key: string]: LegacyUserRaw | undefined;
@@ -140,18 +169,17 @@ export interface TimelineDataRawInstruction {
140
169
  export interface TimelineDataRaw {
141
170
  instructions?: TimelineDataRawInstruction[];
142
171
  }
143
- export interface TimelineRaw {
172
+ export interface TimelineV1 {
144
173
  globalObjects?: TimelineGlobalObjectsRaw;
145
174
  timeline?: TimelineDataRaw;
146
175
  }
147
- type ParseTweetResult = {
176
+ export type ParseTweetResult = {
148
177
  success: true;
149
178
  tweet: Tweet;
150
179
  } | {
151
180
  success: false;
152
181
  err: Error;
153
182
  };
154
- export declare function parseTweet(timeline: TimelineRaw, id: string): ParseTweetResult;
155
183
  /**
156
184
  * A paginated tweets API response. The `next` field can be used to fetch the next page of results.
157
185
  */
@@ -159,7 +187,7 @@ export interface QueryTweetsResponse {
159
187
  tweets: Tweet[];
160
188
  next?: string;
161
189
  }
162
- export declare function parseTweets(timeline: TimelineRaw): QueryTweetsResponse;
190
+ export declare function parseTimelineTweetsV1(timeline: TimelineV1): QueryTweetsResponse;
163
191
  /**
164
192
  * A paginated profiles API response. The `next` field can be used to fetch the next page of results.
165
193
  */
@@ -167,6 +195,5 @@ export interface QueryProfilesResponse {
167
195
  profiles: Profile[];
168
196
  next?: string;
169
197
  }
170
- export declare function parseUsers(timeline: TimelineRaw): QueryProfilesResponse;
171
- export {};
172
- //# sourceMappingURL=timeline.d.ts.map
198
+ export declare function parseUsers(timeline: TimelineV1): QueryProfilesResponse;
199
+ //# sourceMappingURL=timeline-v1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-v1.d.ts","sourceRoot":"","sources":["../src/timeline-v1.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseUsers = exports.parseTweets = exports.parseTweet = void 0;
3
+ exports.parseUsers = exports.parseTimelineTweetsV1 = void 0;
4
4
  const profile_1 = require("./profile");
5
- const reHashtag = /\B(\#\S+\b)/g;
6
- const reTwitterUrl = /https:(\/\/t\.co\/([A-Za-z0-9]|[A-Za-z]){10})/g;
7
- const reUsername = /\B(\@\S{1,15}\b)/g;
8
- function isFieldDefined(key) {
9
- return function (value) {
10
- return isDefined(value[key]);
11
- };
12
- }
13
- function isDefined(value) {
14
- return value != null;
15
- }
16
- function parseTweet(timeline, id) {
5
+ const timeline_tweet_util_1 = require("./timeline-tweet-util");
6
+ const type_util_1 = require("./type-util");
7
+ function parseTimelineTweet(timeline, id) {
17
8
  const tweets = timeline.globalObjects?.tweets ?? {};
18
9
  const tweet = tweets[id];
19
10
  if (tweet?.user_id_str == null) {
@@ -35,14 +26,15 @@ function parseTweet(timeline, id) {
35
26
  const media = tweet.extended_entities?.media ?? [];
36
27
  const pinnedTweets = new Set(user.pinned_tweet_ids_str ?? []);
37
28
  const urls = tweet.entities?.urls ?? [];
38
- const { photos, videos, sensitiveContent } = parseMediaGroups(media);
29
+ const { photos, videos, sensitiveContent } = (0, timeline_tweet_util_1.parseMediaGroups)(media);
39
30
  const tw = {
31
+ conversationId: tweet.conversation_id_str,
40
32
  id,
41
33
  hashtags: hashtags
42
- .filter(isFieldDefined('text'))
34
+ .filter((0, type_util_1.isFieldDefined)('text'))
43
35
  .map((hashtag) => hashtag.text),
44
36
  likes: tweet.favorite_count,
45
- mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({
37
+ mentions: mentions.filter((0, type_util_1.isFieldDefined)('id_str')).map((mention) => ({
46
38
  id: mention.id_str,
47
39
  username: mention.screen_name,
48
40
  name: mention.name,
@@ -53,38 +45,42 @@ function parseTweet(timeline, id) {
53
45
  replies: tweet.reply_count,
54
46
  retweets: tweet.retweet_count,
55
47
  text: tweet.full_text,
48
+ thread: [],
56
49
  urls: urls
57
- .filter(isFieldDefined('expanded_url'))
50
+ .filter((0, type_util_1.isFieldDefined)('expanded_url'))
58
51
  .map((url) => url.expanded_url),
59
52
  userId: tweet.user_id_str,
60
53
  username: user.screen_name,
61
54
  videos,
62
55
  };
63
- if (tweet.created_at != null) {
56
+ if (tweet.created_at) {
64
57
  tw.timeParsed = new Date(Date.parse(tweet.created_at));
65
58
  tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);
66
59
  }
67
- if (tweet.place?.id != null) {
60
+ if (tweet.place?.id) {
68
61
  tw.place = tweet.place;
69
62
  }
70
- if (tweet.quoted_status_id_str != null) {
71
- const quotedStatusResult = parseTweet(timeline, tweet.quoted_status_id_str);
63
+ if (tweet.quoted_status_id_str) {
64
+ tw.isQuoted = true;
65
+ tw.quotedStatusId = tweet.quoted_status_id_str;
66
+ const quotedStatusResult = parseTimelineTweet(timeline, tweet.quoted_status_id_str);
72
67
  if (quotedStatusResult.success) {
73
- tw.isQuoted = true;
74
68
  tw.quotedStatus = quotedStatusResult.tweet;
75
69
  }
76
70
  }
77
- if (tweet.in_reply_to_status_id_str != null) {
78
- const replyStatusResult = parseTweet(timeline, tweet.in_reply_to_status_id_str);
71
+ if (tweet.in_reply_to_status_id_str) {
72
+ tw.isReply = true;
73
+ tw.inReplyToStatusId = tweet.in_reply_to_status_id_str;
74
+ const replyStatusResult = parseTimelineTweet(timeline, tweet.in_reply_to_status_id_str);
79
75
  if (replyStatusResult.success) {
80
- tw.isReply = true;
81
76
  tw.inReplyToStatus = replyStatusResult.tweet;
82
77
  }
83
78
  }
84
79
  if (tweet.retweeted_status_id_str != null) {
85
- const retweetedStatusResult = parseTweet(timeline, tweet.retweeted_status_id_str);
80
+ tw.isRetweet = true;
81
+ tw.retweetedStatusId = tweet.retweeted_status_id_str;
82
+ const retweetedStatusResult = parseTimelineTweet(timeline, tweet.retweeted_status_id_str);
86
83
  if (retweetedStatusResult.success) {
87
- tw.isRetweet = true;
88
84
  tw.retweetedStatus = retweetedStatusResult.tweet;
89
85
  }
90
86
  }
@@ -92,7 +88,7 @@ function parseTweet(timeline, id) {
92
88
  if (!isNaN(views)) {
93
89
  tw.views = views;
94
90
  }
95
- if (pinnedTweets.has(tweet.conversation_id_str)) {
91
+ if (pinnedTweets.has(tweet.id_str)) {
96
92
  // TODO: Update tests so this can be assigned at the tweet declaration
97
93
  tw.isPin = true;
98
94
  }
@@ -100,100 +96,10 @@ function parseTweet(timeline, id) {
100
96
  // TODO: Update tests so this can be assigned at the tweet declaration
101
97
  tw.sensitiveContent = true;
102
98
  }
103
- // HTML parsing with regex :)
104
- let html = tweet.full_text ?? '';
105
- const foundedMedia = [];
106
- html = html.replace(reHashtag, linkHashtagHtml);
107
- html = html.replace(reUsername, linkUsernameHtml);
108
- html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, foundedMedia));
109
- for (const { url } of tw.photos) {
110
- if (foundedMedia.indexOf(url) !== -1) {
111
- continue;
112
- }
113
- html += `<br><img src="${url}"/>`;
114
- }
115
- for (const { preview: url } of tw.videos) {
116
- if (foundedMedia.indexOf(url) !== -1) {
117
- continue;
118
- }
119
- html += `<br><img src="${url}"/>`;
120
- }
121
- html = html.replace(/\n/g, '<br>');
122
- tw.html = html;
99
+ tw.html = (0, timeline_tweet_util_1.reconstructTweetHtml)(tweet, tw.photos, tw.videos);
123
100
  return { success: true, tweet: tw };
124
101
  }
125
- exports.parseTweet = parseTweet;
126
- function parseMediaGroups(media) {
127
- const photos = [];
128
- const videos = [];
129
- let sensitiveContent = undefined;
130
- for (const m of media
131
- .filter(isFieldDefined('id_str'))
132
- .filter(isFieldDefined('media_url_https'))) {
133
- if (m.type === 'photo') {
134
- photos.push({
135
- id: m.id_str,
136
- url: m.media_url_https,
137
- });
138
- }
139
- else if (m.type === 'video') {
140
- videos.push(parseVideo(m));
141
- }
142
- const sensitive = m.ext_sensitive_media_warning;
143
- if (sensitive != null) {
144
- sensitiveContent =
145
- sensitive.adult_content ||
146
- sensitive.graphic_violence ||
147
- sensitive.other;
148
- }
149
- }
150
- return { sensitiveContent, photos, videos };
151
- }
152
- function parseVideo(m) {
153
- const video = {
154
- id: m.id_str,
155
- preview: m.media_url_https,
156
- };
157
- let maxBitrate = 0;
158
- const variants = m.video_info?.variants ?? [];
159
- for (const variant of variants) {
160
- const bitrate = variant.bitrate;
161
- if (bitrate != null && bitrate > maxBitrate && variant.url != null) {
162
- let variantUrl = variant.url;
163
- const stringStart = 0;
164
- const tagSuffixIdx = variantUrl.indexOf('?tag=10');
165
- if (tagSuffixIdx !== -1) {
166
- variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);
167
- }
168
- video.url = variantUrl;
169
- maxBitrate = bitrate;
170
- }
171
- }
172
- return video;
173
- }
174
- function linkHashtagHtml(hashtag) {
175
- return `<a href="https://twitter.com/hashtag/${hashtag.replace('#', '')}">${hashtag}</a>`;
176
- }
177
- function linkUsernameHtml(username) {
178
- return `<a href="https://twitter.com/${username[0].replace('@', '')}">${username[0]}</a>`;
179
- }
180
- function unwrapTcoUrlHtml(tweet, foundedMedia) {
181
- return function (tco) {
182
- for (const entity of tweet.entities?.urls ?? []) {
183
- if (tco === entity.url && entity.expanded_url != null) {
184
- return `<a href="${entity.expanded_url}">${tco}</a>`;
185
- }
186
- }
187
- for (const entity of tweet.extended_entities?.media ?? []) {
188
- if (tco === entity.url && entity.media_url_https != null) {
189
- foundedMedia.push(entity.media_url_https);
190
- return `<br><a href="${tco}"><img src="${entity.media_url_https}"/></a>`;
191
- }
192
- }
193
- return tco;
194
- };
195
- }
196
- function parseTweets(timeline) {
102
+ function parseTimelineTweetsV1(timeline) {
197
103
  let cursor;
198
104
  let pinnedTweet;
199
105
  let orderedTweets = [];
@@ -202,7 +108,7 @@ function parseTweets(timeline) {
202
108
  // Handle pin instruction
203
109
  const pinnedTweetId = pinEntry?.entry?.content?.item?.content?.tweet?.id;
204
110
  if (pinnedTweetId != null) {
205
- const tweetResult = parseTweet(timeline, pinnedTweetId);
111
+ const tweetResult = parseTimelineTweet(timeline, pinnedTweetId);
206
112
  if (tweetResult.success) {
207
113
  pinnedTweet = tweetResult.tweet;
208
114
  }
@@ -211,7 +117,7 @@ function parseTweets(timeline) {
211
117
  for (const { content } of addEntries?.entries ?? []) {
212
118
  const tweetId = content?.item?.content?.tweet?.id;
213
119
  if (tweetId != null) {
214
- const tweetResult = parseTweet(timeline, tweetId);
120
+ const tweetResult = parseTimelineTweet(timeline, tweetId);
215
121
  if (tweetResult.success) {
216
122
  orderedTweets.push(tweetResult.tweet);
217
123
  }
@@ -235,7 +141,7 @@ function parseTweets(timeline) {
235
141
  next: cursor,
236
142
  };
237
143
  }
238
- exports.parseTweets = parseTweets;
144
+ exports.parseTimelineTweetsV1 = parseTimelineTweetsV1;
239
145
  function parseUsers(timeline) {
240
146
  const users = new Map();
241
147
  const userObjects = timeline.globalObjects?.users ?? {};
@@ -272,4 +178,4 @@ function parseUsers(timeline) {
272
178
  };
273
179
  }
274
180
  exports.parseUsers = parseUsers;
275
- //# sourceMappingURL=timeline.js.map
181
+ //# sourceMappingURL=timeline-v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-v1.js","sourceRoot":"","sources":["../src/timeline-v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { LegacyUserRaw } from './profile';
2
+ import { LegacyTweetRaw, ParseTweetResult, QueryTweetsResponse, TimelineResultRaw } from './timeline-v1';
3
+ import { Tweet } from './tweets';
4
+ export interface TimelineUserResultRaw {
5
+ rest_id?: string;
6
+ legacy?: LegacyUserRaw;
7
+ }
8
+ export interface TimelineEntryItemContentRaw {
9
+ tweetDisplayType?: string;
10
+ tweet_results?: {
11
+ result?: TimelineResultRaw;
12
+ };
13
+ userDisplayType?: string;
14
+ user_results?: {
15
+ result?: TimelineUserResultRaw;
16
+ };
17
+ }
18
+ export interface TimelineEntryRaw {
19
+ content?: {
20
+ cursorType?: string;
21
+ value?: string;
22
+ items?: {
23
+ item?: {
24
+ itemContent?: TimelineEntryItemContentRaw;
25
+ };
26
+ }[];
27
+ itemContent?: TimelineEntryItemContentRaw;
28
+ };
29
+ }
30
+ export interface TimelineV2 {
31
+ data?: {
32
+ user?: {
33
+ result?: {
34
+ timeline_v2?: {
35
+ timeline?: {
36
+ instructions?: {
37
+ entries?: TimelineEntryRaw[];
38
+ entry?: TimelineEntryRaw;
39
+ type?: string;
40
+ }[];
41
+ };
42
+ };
43
+ };
44
+ };
45
+ };
46
+ }
47
+ export interface ThreadedConversation {
48
+ data?: {
49
+ threaded_conversation_with_injections_v2?: {
50
+ instructions?: {
51
+ entries?: TimelineEntryRaw[];
52
+ entry?: TimelineEntryRaw;
53
+ type?: string;
54
+ }[];
55
+ };
56
+ };
57
+ }
58
+ export declare function parseLegacyTweet(user?: LegacyUserRaw, tweet?: LegacyTweetRaw): ParseTweetResult;
59
+ export declare function parseTimelineTweetsV2(timeline: TimelineV2): QueryTweetsResponse;
60
+ export declare function parseThreadedConversation(conversation: ThreadedConversation): Tweet[];
61
+ //# sourceMappingURL=timeline-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-v2.d.ts","sourceRoot":"","sources":["../src/timeline-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE;gBACL,WAAW,CAAC,EAAE,2BAA2B,CAAC;aAC3C,CAAC;SACH,EAAE,CAAC;QACJ,WAAW,CAAC,EAAE,2BAA2B,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE;YACL,MAAM,CAAC,EAAE;gBACP,WAAW,CAAC,EAAE;oBACZ,QAAQ,CAAC,EAAE;wBACT,YAAY,CAAC,EAAE;4BACb,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;4BAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;4BACzB,IAAI,CAAC,EAAE,MAAM,CAAC;yBACf,EAAE,CAAC;qBACL,CAAC;iBACH,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QACL,wCAAwC,CAAC,EAAE;YACzC,YAAY,CAAC,EAAE;gBACb,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;gBAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;gBACzB,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,EAAE,CAAC;SACL,CAAC;KACH,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,CAAC,EAAE,aAAa,EACpB,KAAK,CAAC,EAAE,cAAc,GACrB,gBAAgB,CA8GlB;AAgCD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,UAAU,GACnB,mBAAmB,CA2BrB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,oBAAoB,GACjC,KAAK,EAAE,CAkET"}