x-reader 0.1.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.
@@ -0,0 +1,527 @@
1
+ /**
2
+ * XReader API Client — Read-only Twitter/X GraphQL client.
3
+ *
4
+ * Provides: search, user-tweets, tweet-detail, replies, bookmarks, user-lookup.
5
+ * Does NOT provide any write operations (tweet, like, retweet, follow, etc.)
6
+ */
7
+ import { randomBytes, randomUUID } from 'crypto';
8
+ import { BEARER_TOKEN, GRAPHQL_URL, USER_AGENT, DEFAULT_QUERY_IDS } from './constants.js';
9
+ import { getQueryId, refreshQueryIds } from './query-ids.js';
10
+ import { tweetDetailFeatures, searchFeatures, userTweetsFeatures, bookmarksFeatures, tweetDetailFieldToggles, } from './features.js';
11
+ import { parseTweet, parseTweetsFromInstructions, extractCursor, findTweetInInstructions, } from './parser.js';
12
+ export class XReaderClient {
13
+ authToken;
14
+ ct0;
15
+ cookieHeader;
16
+ userAgent;
17
+ timeoutMs;
18
+ quoteDepth;
19
+ clientUuid;
20
+ constructor(options) {
21
+ if (!options.cookies.authToken || !options.cookies.ct0) {
22
+ throw new Error('Both authToken and ct0 cookies are required');
23
+ }
24
+ this.authToken = options.cookies.authToken;
25
+ this.ct0 = options.cookies.ct0;
26
+ this.cookieHeader =
27
+ options.cookies.cookieHeader || `auth_token=${this.authToken}; ct0=${this.ct0}`;
28
+ this.userAgent = USER_AGENT;
29
+ this.timeoutMs = options.timeoutMs;
30
+ this.quoteDepth = Math.max(0, Math.floor(options.quoteDepth ?? 1));
31
+ this.clientUuid = randomUUID();
32
+ }
33
+ // ─── HTTP helpers ───────────────────────────────────────────
34
+ getHeaders() {
35
+ return {
36
+ accept: '*/*',
37
+ 'accept-language': 'en-US,en;q=0.9',
38
+ authorization: `Bearer ${BEARER_TOKEN}`,
39
+ 'x-csrf-token': this.ct0,
40
+ 'x-twitter-auth-type': 'OAuth2Session',
41
+ 'x-twitter-active-user': 'yes',
42
+ 'x-twitter-client-language': 'en',
43
+ 'x-client-uuid': this.clientUuid,
44
+ 'x-client-transaction-id': randomBytes(16).toString('hex'),
45
+ cookie: this.cookieHeader,
46
+ 'user-agent': this.userAgent,
47
+ 'content-type': 'application/json',
48
+ origin: 'https://x.com',
49
+ referer: 'https://x.com/',
50
+ };
51
+ }
52
+ async fetchWithTimeout(url, init) {
53
+ if (!this.timeoutMs || this.timeoutMs <= 0) {
54
+ return fetch(url, init);
55
+ }
56
+ const controller = new AbortController();
57
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
58
+ try {
59
+ return await fetch(url, { ...init, signal: controller.signal });
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ }
64
+ }
65
+ async sleep(ms) {
66
+ return new Promise((resolve) => setTimeout(resolve, ms));
67
+ }
68
+ // ─── Query ID helpers ─────────────────────────────────────────
69
+ async getQueryIds(operation) {
70
+ const discovered = await getQueryId(operation);
71
+ const fallback = DEFAULT_QUERY_IDS[operation];
72
+ const ids = new Set();
73
+ if (discovered)
74
+ ids.add(discovered);
75
+ if (fallback)
76
+ ids.add(fallback);
77
+ return [...ids];
78
+ }
79
+ /**
80
+ * Try a request with multiple query IDs, auto-refresh on 404.
81
+ */
82
+ async tryWithQueryIds(operation, extraIds, doRequest) {
83
+ const ids = await this.getQueryIds(operation);
84
+ for (const extra of extraIds)
85
+ ids.push(extra);
86
+ const uniqueIds = [...new Set(ids)];
87
+ let lastError = '';
88
+ let had404 = false;
89
+ for (const qid of uniqueIds) {
90
+ const { result, status, error } = await doRequest(qid);
91
+ if (result !== null)
92
+ return result;
93
+ if (status === 404)
94
+ had404 = true;
95
+ if (error)
96
+ lastError = error;
97
+ }
98
+ // If we got 404s, refresh and retry
99
+ if (had404) {
100
+ await refreshQueryIds({ force: true });
101
+ const freshIds = await this.getQueryIds(operation);
102
+ for (const qid of freshIds) {
103
+ const { result, error } = await doRequest(qid);
104
+ if (result !== null)
105
+ return result;
106
+ if (error)
107
+ lastError = error;
108
+ }
109
+ }
110
+ throw new Error(lastError || `Failed to execute ${operation}`);
111
+ }
112
+ // ─── Search ───────────────────────────────────────────────────
113
+ async search(query, count = 20, options = {}) {
114
+ const features = searchFeatures();
115
+ const includeRaw = options.includeRaw ?? false;
116
+ try {
117
+ return await this.tryWithQueryIds('SearchTimeline', [], async (qid) => {
118
+ const variables = {
119
+ rawQuery: query,
120
+ count: Math.min(count, 20),
121
+ querySource: 'typed_query',
122
+ product: 'Latest',
123
+ };
124
+ if (options.cursor)
125
+ variables.cursor = options.cursor;
126
+ const params = new URLSearchParams({ variables: JSON.stringify(variables) });
127
+ const url = `${GRAPHQL_URL}/${qid}/SearchTimeline?${params}`;
128
+ const resp = await this.fetchWithTimeout(url, {
129
+ method: 'POST',
130
+ headers: this.getHeaders(),
131
+ body: JSON.stringify({ features, queryId: qid }),
132
+ });
133
+ if (resp.status === 404)
134
+ return { result: null, status: 404 };
135
+ if (!resp.ok) {
136
+ const body = await resp.text();
137
+ return { result: null, status: resp.status, error: `HTTP ${resp.status}: ${body.slice(0, 200)}` };
138
+ }
139
+ const data = await resp.json();
140
+ if (data.errors?.length) {
141
+ return { result: null, status: 200, error: data.errors.map((e) => e.message).join(', ') };
142
+ }
143
+ const instructions = data.data?.search_by_raw_query?.search_timeline?.timeline?.instructions;
144
+ const tweets = parseTweetsFromInstructions(instructions, this.quoteDepth, includeRaw);
145
+ const nextCursor = extractCursor(instructions);
146
+ return { result: { success: true, tweets, nextCursor }, status: 200 };
147
+ });
148
+ }
149
+ catch (err) {
150
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
151
+ }
152
+ }
153
+ // ─── Tweet Detail ─────────────────────────────────────────────
154
+ async getTweet(tweetId, options = {}) {
155
+ const includeRaw = options.includeRaw ?? false;
156
+ try {
157
+ return await this.tryWithQueryIds('TweetDetail', ['aFvUsJm2c-oDkJV75blV6g'], async (qid) => {
158
+ const variables = {
159
+ focalTweetId: tweetId,
160
+ with_rux_injections: false,
161
+ rankingMode: 'Relevance',
162
+ includePromotedContent: true,
163
+ withCommunity: true,
164
+ withQuickPromoteEligibilityTweetFields: true,
165
+ withBirdwatchNotes: true,
166
+ withVoice: true,
167
+ };
168
+ const features = {
169
+ ...tweetDetailFeatures(),
170
+ articles_preview_enabled: true,
171
+ articles_rest_api_enabled: true,
172
+ rweb_video_timestamps_enabled: true,
173
+ };
174
+ const fieldToggles = tweetDetailFieldToggles();
175
+ const params = new URLSearchParams({
176
+ variables: JSON.stringify(variables),
177
+ features: JSON.stringify(features),
178
+ fieldToggles: JSON.stringify(fieldToggles),
179
+ });
180
+ const url = `${GRAPHQL_URL}/${qid}/TweetDetail?${params}`;
181
+ const resp = await this.fetchWithTimeout(url, {
182
+ method: 'GET',
183
+ headers: this.getHeaders(),
184
+ });
185
+ if (resp.status === 404)
186
+ return { result: null, status: 404 };
187
+ if (!resp.ok) {
188
+ const body = await resp.text();
189
+ return { result: null, status: resp.status, error: `HTTP ${resp.status}: ${body.slice(0, 200)}` };
190
+ }
191
+ const data = await resp.json();
192
+ const instructions = data.data?.threaded_conversation_with_injections_v2?.instructions;
193
+ const tweetResult = data.data?.tweetResult?.result ?? findTweetInInstructions(instructions, tweetId);
194
+ const tweet = parseTweet(tweetResult, this.quoteDepth, includeRaw);
195
+ if (tweet) {
196
+ return { result: { success: true, tweet }, status: 200 };
197
+ }
198
+ return { result: null, status: 200, error: 'Tweet not found in response' };
199
+ });
200
+ }
201
+ catch (err) {
202
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
203
+ }
204
+ }
205
+ // ─── Replies ──────────────────────────────────────────────────
206
+ async getReplies(tweetId, options = {}) {
207
+ const includeRaw = options.includeRaw ?? false;
208
+ try {
209
+ return await this.tryWithQueryIds('TweetDetail', [], async (qid) => {
210
+ const variables = {
211
+ focalTweetId: tweetId,
212
+ with_rux_injections: false,
213
+ rankingMode: 'Relevance',
214
+ includePromotedContent: true,
215
+ withCommunity: true,
216
+ withQuickPromoteEligibilityTweetFields: true,
217
+ withBirdwatchNotes: true,
218
+ withVoice: true,
219
+ };
220
+ const features = {
221
+ ...tweetDetailFeatures(),
222
+ articles_preview_enabled: true,
223
+ rweb_video_timestamps_enabled: true,
224
+ };
225
+ const fieldToggles = tweetDetailFieldToggles();
226
+ const params = new URLSearchParams({
227
+ variables: JSON.stringify(variables),
228
+ features: JSON.stringify(features),
229
+ fieldToggles: JSON.stringify(fieldToggles),
230
+ });
231
+ const url = `${GRAPHQL_URL}/${qid}/TweetDetail?${params}`;
232
+ const resp = await this.fetchWithTimeout(url, {
233
+ method: 'GET',
234
+ headers: this.getHeaders(),
235
+ });
236
+ if (resp.status === 404)
237
+ return { result: null, status: 404 };
238
+ if (!resp.ok) {
239
+ const body = await resp.text();
240
+ return { result: null, status: resp.status, error: `HTTP ${resp.status}: ${body.slice(0, 200)}` };
241
+ }
242
+ const data = await resp.json();
243
+ const instructions = data.data?.threaded_conversation_with_injections_v2?.instructions;
244
+ const allTweets = parseTweetsFromInstructions(instructions, this.quoteDepth, includeRaw);
245
+ const replies = allTweets.filter((t) => t.inReplyToStatusId === tweetId);
246
+ return { result: { success: true, tweets: replies }, status: 200 };
247
+ });
248
+ }
249
+ catch (err) {
250
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
251
+ }
252
+ }
253
+ // ─── User Tweets ──────────────────────────────────────────────
254
+ async getUserTweets(userId, count = 20, options = {}) {
255
+ const features = userTweetsFeatures();
256
+ const includeRaw = options.includeRaw ?? false;
257
+ try {
258
+ return await this.tryWithQueryIds('UserTweets', [], async (qid) => {
259
+ const variables = {
260
+ userId,
261
+ count: Math.min(count, 20),
262
+ includePromotedContent: false,
263
+ withQuickPromoteEligibilityTweetFields: true,
264
+ withVoice: true,
265
+ };
266
+ if (options.cursor)
267
+ variables.cursor = options.cursor;
268
+ const params = new URLSearchParams({
269
+ variables: JSON.stringify(variables),
270
+ features: JSON.stringify(features),
271
+ fieldToggles: JSON.stringify({ withArticlePlainText: false }),
272
+ });
273
+ const url = `${GRAPHQL_URL}/${qid}/UserTweets?${params}`;
274
+ const resp = await this.fetchWithTimeout(url, {
275
+ method: 'GET',
276
+ headers: this.getHeaders(),
277
+ });
278
+ if (resp.status === 404)
279
+ return { result: null, status: 404 };
280
+ if (!resp.ok) {
281
+ const body = await resp.text();
282
+ return { result: null, status: resp.status, error: `HTTP ${resp.status}: ${body.slice(0, 200)}` };
283
+ }
284
+ const data = await resp.json();
285
+ if (data.errors?.length) {
286
+ const msg = data.errors.map((e) => e.message).join(', ');
287
+ if (msg.includes('suspended') || msg.includes('not found')) {
288
+ return { result: { success: false, error: msg }, status: 200 };
289
+ }
290
+ }
291
+ const instructions = data.data?.user?.result?.timeline?.timeline?.instructions;
292
+ const tweets = parseTweetsFromInstructions(instructions, this.quoteDepth, includeRaw);
293
+ const nextCursor = extractCursor(instructions);
294
+ return { result: { success: true, tweets, nextCursor }, status: 200 };
295
+ });
296
+ }
297
+ catch (err) {
298
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
299
+ }
300
+ }
301
+ // ─── Bookmarks ────────────────────────────────────────────────
302
+ async getBookmarks(count = 20, options = {}) {
303
+ const features = bookmarksFeatures();
304
+ const includeRaw = options.includeRaw ?? false;
305
+ try {
306
+ return await this.tryWithQueryIds('Bookmarks', ['tmd4ifV8RHltzn8ymGg1aw'], async (qid) => {
307
+ const variables = {
308
+ count: Math.min(count, 20),
309
+ includePromotedContent: false,
310
+ withDownvotePerspective: false,
311
+ withReactionsMetadata: false,
312
+ withReactionsPerspective: false,
313
+ };
314
+ if (options.cursor)
315
+ variables.cursor = options.cursor;
316
+ const params = new URLSearchParams({
317
+ variables: JSON.stringify(variables),
318
+ features: JSON.stringify(features),
319
+ });
320
+ const url = `${GRAPHQL_URL}/${qid}/Bookmarks?${params}`;
321
+ const resp = await this.fetchWithTimeout(url, {
322
+ method: 'GET',
323
+ headers: this.getHeaders(),
324
+ });
325
+ if (resp.status === 404)
326
+ return { result: null, status: 404 };
327
+ if (!resp.ok) {
328
+ const body = await resp.text();
329
+ return { result: null, status: resp.status, error: `HTTP ${resp.status}: ${body.slice(0, 200)}` };
330
+ }
331
+ const data = await resp.json();
332
+ const instructions = data.data?.bookmark_timeline_v2?.timeline?.instructions;
333
+ const tweets = parseTweetsFromInstructions(instructions, this.quoteDepth, includeRaw);
334
+ const nextCursor = extractCursor(instructions);
335
+ return { result: { success: true, tweets, nextCursor }, status: 200 };
336
+ });
337
+ }
338
+ catch (err) {
339
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
340
+ }
341
+ }
342
+ // ─── User Lookup ──────────────────────────────────────────────
343
+ async getUserByUsername(username) {
344
+ const handle = username.startsWith('@') ? username.slice(1) : username;
345
+ const graphqlIds = ['xc8f1g7BYqr6VTzTbvNlGw', 'qW5u-DAuXpMEG0zA1F7UGQ', 'sLVLhk0bGj3MVFEKTdax1w'];
346
+ const variables = { screen_name: handle, withSafetyModeUserFields: true };
347
+ const features = {
348
+ hidden_profile_subscriptions_enabled: true,
349
+ hidden_profile_likes_enabled: true,
350
+ rweb_tipjar_consumption_enabled: true,
351
+ responsive_web_graphql_exclude_directive_enabled: true,
352
+ verified_phone_label_enabled: false,
353
+ subscriptions_verification_info_is_identity_verified_enabled: true,
354
+ subscriptions_verification_info_verified_since_enabled: true,
355
+ highlights_tweets_tab_ui_enabled: true,
356
+ responsive_web_twitter_article_notes_tab_enabled: true,
357
+ subscriptions_feature_can_gift_premium: true,
358
+ creator_subscriptions_tweet_preview_api_enabled: true,
359
+ responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,
360
+ responsive_web_graphql_timeline_navigation_enabled: true,
361
+ blue_business_profile_image_shape_enabled: true,
362
+ };
363
+ const fieldToggles = { withAuxiliaryUserLabels: false };
364
+ const params = new URLSearchParams({
365
+ variables: JSON.stringify(variables),
366
+ features: JSON.stringify(features),
367
+ fieldToggles: JSON.stringify(fieldToggles),
368
+ });
369
+ let lastError = '';
370
+ for (const qid of graphqlIds) {
371
+ try {
372
+ const url = `${GRAPHQL_URL}/${qid}/UserByScreenName?${params}`;
373
+ const resp = await this.fetchWithTimeout(url, {
374
+ method: 'GET',
375
+ headers: this.getHeaders(),
376
+ });
377
+ if (!resp.ok) {
378
+ lastError = `HTTP ${resp.status}`;
379
+ continue;
380
+ }
381
+ const data = await resp.json();
382
+ if (data.data?.user?.result?.__typename === 'UserUnavailable') {
383
+ return { success: false, error: `User @${handle} not found or unavailable` };
384
+ }
385
+ const user = data.data?.user?.result;
386
+ const id = user?.rest_id;
387
+ const screenName = user?.legacy?.screen_name ?? user?.core?.screen_name;
388
+ const name = user?.legacy?.name ?? user?.core?.name;
389
+ if (id && screenName) {
390
+ return { success: true, userId: id, username: screenName, name };
391
+ }
392
+ if (data.errors?.length) {
393
+ lastError = data.errors.map((e) => e.message).join(', ');
394
+ }
395
+ }
396
+ catch (err) {
397
+ lastError = err instanceof Error ? err.message : String(err);
398
+ }
399
+ }
400
+ // REST API fallback
401
+ const restUrls = [
402
+ `https://x.com/i/api/1.1/users/show.json?screen_name=${encodeURIComponent(handle)}`,
403
+ `https://api.twitter.com/1.1/users/show.json?screen_name=${encodeURIComponent(handle)}`,
404
+ ];
405
+ for (const restUrl of restUrls) {
406
+ try {
407
+ const resp = await this.fetchWithTimeout(restUrl, {
408
+ method: 'GET',
409
+ headers: this.getHeaders(),
410
+ });
411
+ if (!resp.ok)
412
+ continue;
413
+ const data = await resp.json();
414
+ const id = data.id_str ?? (data.id ? String(data.id) : null);
415
+ if (id) {
416
+ return { success: true, userId: id, username: data.screen_name ?? handle, name: data.name };
417
+ }
418
+ }
419
+ catch {
420
+ // Try next
421
+ }
422
+ }
423
+ return { success: false, error: lastError || 'Unknown error looking up user' };
424
+ }
425
+ // ─── Paginated helpers ────────────────────────────────────────
426
+ /**
427
+ * Search with automatic pagination to collect up to `count` tweets.
428
+ */
429
+ async searchAll(query, count, options = {}) {
430
+ const all = [];
431
+ const seen = new Set();
432
+ let cursor;
433
+ let pages = 0;
434
+ while (all.length < count) {
435
+ const pageSize = Math.min(20, count - all.length);
436
+ const result = await this.search(query, pageSize, { cursor, includeRaw: options.includeRaw });
437
+ if (!result.success)
438
+ return { success: false, error: result.error };
439
+ pages++;
440
+ let added = 0;
441
+ for (const t of result.tweets ?? []) {
442
+ if (seen.has(t.id))
443
+ continue;
444
+ seen.add(t.id);
445
+ all.push(t);
446
+ added++;
447
+ if (all.length >= count)
448
+ break;
449
+ }
450
+ if (!result.nextCursor || result.nextCursor === cursor || added === 0)
451
+ break;
452
+ if (options.maxPages && pages >= options.maxPages) {
453
+ return { success: true, tweets: all, nextCursor: result.nextCursor };
454
+ }
455
+ cursor = result.nextCursor;
456
+ }
457
+ return { success: true, tweets: all };
458
+ }
459
+ /**
460
+ * Get user tweets with pagination.
461
+ */
462
+ async getUserTweetsAll(userId, count, options = {}) {
463
+ const all = [];
464
+ const seen = new Set();
465
+ let cursor;
466
+ let pages = 0;
467
+ while (all.length < count) {
468
+ const pageSize = Math.min(20, count - all.length);
469
+ const result = await this.getUserTweets(userId, pageSize, { cursor, includeRaw: options.includeRaw });
470
+ if (!result.success)
471
+ return { success: false, error: result.error };
472
+ pages++;
473
+ let added = 0;
474
+ for (const t of result.tweets ?? []) {
475
+ if (seen.has(t.id))
476
+ continue;
477
+ seen.add(t.id);
478
+ all.push(t);
479
+ added++;
480
+ if (all.length >= count)
481
+ break;
482
+ }
483
+ if (!result.nextCursor || result.nextCursor === cursor || added === 0)
484
+ break;
485
+ if (options.maxPages && pages >= options.maxPages) {
486
+ return { success: true, tweets: all, nextCursor: result.nextCursor };
487
+ }
488
+ cursor = result.nextCursor;
489
+ await this.sleep(1000);
490
+ }
491
+ return { success: true, tweets: all };
492
+ }
493
+ /**
494
+ * Get all bookmarks with pagination.
495
+ */
496
+ async getBookmarksAll(count = Infinity, options = {}) {
497
+ const all = [];
498
+ const seen = new Set();
499
+ let cursor;
500
+ let pages = 0;
501
+ while (all.length < count) {
502
+ const result = await this.getBookmarks(20, { cursor, includeRaw: options.includeRaw });
503
+ if (!result.success)
504
+ return { success: false, error: result.error };
505
+ pages++;
506
+ let added = 0;
507
+ for (const t of result.tweets ?? []) {
508
+ if (seen.has(t.id))
509
+ continue;
510
+ seen.add(t.id);
511
+ all.push(t);
512
+ added++;
513
+ if (all.length >= count)
514
+ break;
515
+ }
516
+ if (!result.nextCursor || result.nextCursor === cursor || added === 0)
517
+ break;
518
+ if (options.maxPages && pages >= options.maxPages) {
519
+ return { success: true, tweets: all, nextCursor: result.nextCursor };
520
+ }
521
+ cursor = result.nextCursor;
522
+ await this.sleep(500);
523
+ }
524
+ return { success: true, tweets: all };
525
+ }
526
+ }
527
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** Constants extracted from Bird CLI v0.8.0 */
2
+ /** Public bearer token — same one the X web client uses */
3
+ export declare const BEARER_TOKEN = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
4
+ /** GraphQL API base */
5
+ export declare const GRAPHQL_URL = "https://x.com/i/api/graphql";
6
+ /** Default User-Agent */
7
+ export declare const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
8
+ /** Fallback query IDs — these get rotated by X periodically */
9
+ export declare const DEFAULT_QUERY_IDS: Record<string, string>;
10
+ /** Operation names we care about for query ID discovery */
11
+ export declare const DISCOVERY_OPERATIONS: string[];
12
+ /** Pages to scrape for JS bundle URLs */
13
+ export declare const DISCOVERY_PAGES: string[];
14
+ /** Regex to find client JS bundles */
15
+ export declare const BUNDLE_URL_REGEX: RegExp;
16
+ /** Regex patterns to extract queryId + operationName from bundles */
17
+ export declare const QUERY_ID_PATTERNS: {
18
+ regex: RegExp;
19
+ operationGroup: number;
20
+ queryIdGroup: number;
21
+ }[];
22
+ /** Cache TTL for query IDs — 24 hours */
23
+ export declare const QUERY_ID_TTL_MS = 86400000;
@@ -0,0 +1,60 @@
1
+ /** Constants extracted from Bird CLI v0.8.0 */
2
+ /** Public bearer token — same one the X web client uses */
3
+ export const BEARER_TOKEN = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
4
+ /** GraphQL API base */
5
+ export const GRAPHQL_URL = 'https://x.com/i/api/graphql';
6
+ /** Default User-Agent */
7
+ export const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
8
+ /** Fallback query IDs — these get rotated by X periodically */
9
+ export const DEFAULT_QUERY_IDS = {
10
+ TweetDetail: '97JF30KziU00483E_8elBA',
11
+ SearchTimeline: 'M1jEez78PEfVfbQLvlWMvQ',
12
+ UserTweets: 'Wms1GvIiHXAPBaCr9KblaA',
13
+ UserArticlesTweets: '8zBy9h4L90aDL02RsBcCFg',
14
+ Bookmarks: 'RV1g3b8n_SGOHwkqKYSCFw',
15
+ BookmarkFolderTimeline: 'KJIQpsvxrTfRIlbaRIySHQ',
16
+ Following: 'BEkNpEt5pNETESoqMsTEGA',
17
+ Followers: 'kuFUYP9eV1FPoEy4N-pi7w',
18
+ Likes: 'JR2gceKucIKcVNB_9JkhsA',
19
+ HomeTimeline: 'edseUwk9sP5Phz__9TIRnA',
20
+ HomeLatestTimeline: 'iOEZpOdfekFsxSlPQCQtPg',
21
+ GenericTimelineById: 'uGSr7alSjR9v6QJAIaqSKQ',
22
+ AboutAccountQuery: 'zs_jFPFT78rBpXv9Z3U2YQ',
23
+ };
24
+ /** Operation names we care about for query ID discovery */
25
+ export const DISCOVERY_OPERATIONS = Object.keys(DEFAULT_QUERY_IDS);
26
+ /** Pages to scrape for JS bundle URLs */
27
+ export const DISCOVERY_PAGES = [
28
+ 'https://x.com/?lang=en',
29
+ 'https://x.com/explore',
30
+ 'https://x.com/notifications',
31
+ 'https://x.com/settings/profile',
32
+ ];
33
+ /** Regex to find client JS bundles */
34
+ export const BUNDLE_URL_REGEX = /https:\/\/abs\.twimg\.com\/responsive-web\/client-web(?:-legacy)?\/[A-Za-z0-9.-]+\.js/g;
35
+ /** Regex patterns to extract queryId + operationName from bundles */
36
+ export const QUERY_ID_PATTERNS = [
37
+ {
38
+ regex: /e\.exports=\{queryId\s*:\s*["']([^"']+)["']\s*,\s*operationName\s*:\s*["']([^"']+)["']/g,
39
+ operationGroup: 2,
40
+ queryIdGroup: 1,
41
+ },
42
+ {
43
+ regex: /e\.exports=\{operationName\s*:\s*["']([^"']+)["']\s*,\s*queryId\s*:\s*["']([^"']+)["']/g,
44
+ operationGroup: 1,
45
+ queryIdGroup: 2,
46
+ },
47
+ {
48
+ regex: /operationName\s*[:=]\s*["']([^"']+)["'](.{0,4000}?)queryId\s*[:=]\s*["']([^"']+)["']/g,
49
+ operationGroup: 1,
50
+ queryIdGroup: 3,
51
+ },
52
+ {
53
+ regex: /queryId\s*[:=]\s*["']([^"']+)["'](.{0,4000}?)operationName\s*[:=]\s*["']([^"']+)["']/g,
54
+ operationGroup: 3,
55
+ queryIdGroup: 1,
56
+ },
57
+ ];
58
+ /** Cache TTL for query IDs — 24 hours */
59
+ export const QUERY_ID_TTL_MS = 86400000;
60
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/api/constants.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAE/C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GACvB,0GAA0G,CAAC;AAE7G,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAEzD,yBAAyB;AACzB,MAAM,CAAC,MAAM,UAAU,GACrB,uHAAuH,CAAC;AAE1H,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,WAAW,EAAE,wBAAwB;IACrC,cAAc,EAAE,wBAAwB;IACxC,UAAU,EAAE,wBAAwB;IACpC,kBAAkB,EAAE,wBAAwB;IAC5C,SAAS,EAAE,wBAAwB;IACnC,sBAAsB,EAAE,wBAAwB;IAChD,SAAS,EAAE,wBAAwB;IACnC,SAAS,EAAE,wBAAwB;IACnC,KAAK,EAAE,wBAAwB;IAC/B,YAAY,EAAE,wBAAwB;IACtC,kBAAkB,EAAE,wBAAwB;IAC5C,mBAAmB,EAAE,wBAAwB;IAC7C,iBAAiB,EAAE,wBAAwB;CAC5C,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAEnE,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,wBAAwB;IACxB,uBAAuB;IACvB,6BAA6B;IAC7B,gCAAgC;CACjC,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAC3B,wFAAwF,CAAC;AAE3F,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;QACE,KAAK,EAAE,yFAAyF;QAChG,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;KAChB;IACD;QACE,KAAK,EAAE,yFAAyF;QAChG,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;KAChB;IACD;QACE,KAAK,EAAE,uFAAuF;QAC9F,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;KAChB;IACD;QACE,KAAK,EAAE,uFAAuF;QAC9F,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;KAChB;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC"}