@the-convocation/twitter-scraper 0.21.1 → 0.22.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/errors.ts","../../../src/rate-limit.ts","../../../src/requests.ts","../../../src/xpff.ts","../../../src/auth.ts","../../../src/platform/platform-interface.ts","../../../src/platform/index.ts","../../../src/xctxid.ts","../../../src/api.ts","../../../src/auth-user.ts","../../../src/api-data.ts","../../../src/profile.ts","../../../src/timeline-async.ts","../../../src/type-util.ts","../../../src/timeline-tweet-util.ts","../../../src/timeline-v2.ts","../../../src/timeline-search.ts","../../../src/search.ts","../../../src/timeline-relationship.ts","../../../src/relationships.ts","../../../src/trends.ts","../../../src/timeline-list.ts","../../../src/tweets.ts","../../../src/direct-messages-async.ts","../../../src/direct-messages.ts","../../../src/scraper.ts"],"sourcesContent":["export class ApiError extends Error {\n constructor(readonly response: Response, readonly data: any) {\n super(\n `Response status: ${response.status} | headers: ${JSON.stringify(\n headersToString(response.headers),\n )} | data: ${typeof data === 'string' ? data : JSON.stringify(data)}`,\n );\n }\n\n static async fromResponse(response: Response) {\n // Try our best to parse the result, but don't bother if we can't\n let data: string | object | undefined = undefined;\n try {\n if (response.headers.get('content-type')?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n } catch {\n try {\n data = await response.text();\n } catch {}\n }\n\n return new ApiError(response, data);\n }\n}\n\nfunction headersToString(headers: Headers): string {\n const result: string[] = [];\n headers.forEach((value, key) => {\n result.push(`${key}: ${value}`);\n });\n return result.join('\\n');\n}\n\nexport class AuthenticationError extends Error {\n constructor(message?: string) {\n super(message || 'Authentication failed');\n this.name = 'AuthenticationError';\n }\n}\n\nexport interface TwitterApiErrorPosition {\n line: number;\n column: number;\n}\n\nexport interface TwitterApiErrorTraceInfo {\n trace_id: string;\n}\n\nexport interface TwitterApiErrorExtensions {\n code?: number;\n kind?: string;\n name?: string;\n source?: string;\n tracing?: TwitterApiErrorTraceInfo;\n}\n\nexport interface TwitterApiErrorRaw extends TwitterApiErrorExtensions {\n message?: string;\n locations?: TwitterApiErrorPosition[];\n path?: string[];\n extensions?: TwitterApiErrorExtensions;\n}\n","import { FetchParameters } from './api-types';\nimport { ApiError } from './errors';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:rate-limit');\n\n/**\n * Information about a rate-limiting event. Both the request and response\n * information are provided.\n */\nexport interface RateLimitEvent {\n /** The complete arguments that were passed to the fetch function. */\n fetchParameters: FetchParameters;\n /** The failing HTTP response. */\n response: Response;\n}\n\n/**\n * The public interface for all rate-limiting strategies. Library consumers are\n * welcome to provide their own implementations of this interface in the Scraper\n * constructor options.\n *\n * The {@link RateLimitEvent} object contains both the request and response\n * information associated with the event.\n *\n * @example\n * import { Scraper, RateLimitStrategy } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom rate-limiting implementation that just logs request/response information.\n * class ConsoleLogRateLimitStrategy implements RateLimitStrategy {\n * async onRateLimit(event: RateLimitEvent): Promise<void> {\n * console.log(event.fetchParameters, event.response);\n * }\n * }\n *\n * const scraper = new Scraper({\n * rateLimitStrategy: new ConsoleLogRateLimitStrategy(),\n * });\n */\nexport interface RateLimitStrategy {\n /**\n * Called when the scraper is rate limited.\n * @param event The event information, including the request and response info.\n */\n onRateLimit(event: RateLimitEvent): Promise<void>;\n}\n\n/**\n * A rate-limiting strategy that simply waits for the current rate limit period to expire.\n * This has been known to take up to 13 minutes, in some cases.\n */\nexport class WaitingRateLimitStrategy implements RateLimitStrategy {\n async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n /*\n Known headers at this point:\n - x-rate-limit-limit: Maximum number of requests per time period?\n - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset.\n - x-rate-limit-remaining: Number of requests remaining in current time period?\n */\n const xRateLimitLimit = res.headers.get('x-rate-limit-limit');\n const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining');\n const xRateLimitReset = res.headers.get('x-rate-limit-reset');\n\n log(\n `Rate limit event: limit=${xRateLimitLimit}, remaining=${xRateLimitRemaining}, reset=${xRateLimitReset}`,\n );\n\n if (xRateLimitRemaining == '0' && xRateLimitReset) {\n const currentTime = new Date().valueOf() / 1000;\n const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime);\n\n // I have seen this block for 800s (~13 *minutes*)\n await new Promise((resolve) => setTimeout(resolve, timeDeltaMs));\n }\n }\n}\n\n/**\n * A rate-limiting strategy that throws an {@link ApiError} when a rate limiting event occurs.\n */\nexport class ErrorRateLimitStrategy implements RateLimitStrategy {\n async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n throw await ApiError.fromResponse(res);\n }\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:requests');\n\n/**\n * Updates a cookie jar with the Set-Cookie headers from the provided Headers instance.\n * @param cookieJar The cookie jar to update.\n * @param headers The response headers to populate the cookie jar with.\n */\nexport async function updateCookieJar(\n cookieJar: CookieJar,\n headers: Headers | HeadersPolyfill,\n) {\n // Try to use getSetCookie() if available (proper way to get all set-cookie headers)\n let setCookieHeaders: string[] = [];\n\n if (typeof headers.getSetCookie === 'function') {\n setCookieHeaders = headers.getSetCookie();\n } else {\n // Fallback: get the single set-cookie header\n const setCookieHeader = headers.get('set-cookie');\n if (setCookieHeader) {\n // Split combined set-cookie headers\n setCookieHeaders = setCookie.splitCookiesString(setCookieHeader);\n }\n }\n\n if (setCookieHeaders.length > 0) {\n for (const cookieStr of setCookieHeaders) {\n const cookie = Cookie.parse(cookieStr);\n if (!cookie) {\n log(`Failed to parse cookie: ${cookieStr.substring(0, 100)}`);\n continue;\n }\n\n // Skip cookies that are being explicitly deleted (Max-Age=0 or expired)\n // This prevents twitter from clearing important cookies like ct0\n if (\n cookie.maxAge === 0 ||\n (cookie.expires && cookie.expires < new Date())\n ) {\n if (cookie.key === 'ct0') {\n log(`Skipping deletion of ct0 cookie (Max-Age=0)`);\n }\n continue;\n }\n\n try {\n const url = `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${\n cookie.path\n }`;\n await cookieJar.setCookie(cookie, url);\n if (cookie.key === 'ct0') {\n log(\n `Successfully set ct0 cookie with value: ${cookie.value.substring(\n 0,\n 20,\n )}...`,\n );\n }\n } catch (err) {\n // Log cookie setting errors\n log(`Failed to set cookie ${cookie.key}: ${err}`);\n if (cookie.key === 'ct0') {\n log(`FAILED to set ct0 cookie! Error: ${err}`);\n }\n }\n }\n } else if (typeof document !== 'undefined') {\n for (const cookie of document.cookie.split(';')) {\n const hardCookie = Cookie.parse(cookie);\n if (hardCookie) {\n await cookieJar.setCookie(hardCookie, document.location.toString());\n }\n }\n }\n}\n","import debug from 'debug';\n\nconst log = debug('twitter-scraper:xpff');\n\nlet isoCrypto: Crypto | null = null;\n\nasync function getCrypto(): Promise<Crypto> {\n if (isoCrypto != null) {\n return isoCrypto;\n }\n\n // In Node.js, the global `crypto` object is only available from v19.0.0 onwards.\n // For earlier versions, we need to import the 'crypto' module.\n if (typeof crypto === 'undefined') {\n log('Global crypto is undefined, importing from crypto module...');\n const { webcrypto } = await import('crypto');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isoCrypto = webcrypto as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return webcrypto as any;\n }\n isoCrypto = crypto;\n return crypto;\n}\n\nasync function sha256(message: string): Promise<Uint8Array> {\n const msgBuffer = new TextEncoder().encode(message);\n const crypto = await getCrypto();\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n return new Uint8Array(hashBuffer);\n}\n\n// https://stackoverflow.com/a/40031979\nfunction buf2hex(buffer: ArrayBuffer): string {\n return [...new Uint8Array(buffer)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// Adapted from https://github.com/dsekz/twitter-x-xp-forwarded-for-header\nexport class XPFFHeaderGenerator {\n constructor(private readonly seed: string) {}\n\n private async deriveKey(guestId: string): Promise<Uint8Array> {\n const combined = `${this.seed}${guestId}`;\n const result = await sha256(combined);\n return result;\n }\n\n async generateHeader(plaintext: string, guestId: string): Promise<string> {\n log(`Generating XPFF key for guest ID: ${guestId}`);\n const key = await this.deriveKey(guestId);\n const crypto = await getCrypto();\n const nonce = crypto.getRandomValues(new Uint8Array(12));\n const cipher = await crypto.subtle.importKey(\n 'raw',\n key as BufferSource,\n { name: 'AES-GCM' },\n false,\n ['encrypt'],\n );\n const encrypted = await crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: nonce,\n },\n cipher,\n new TextEncoder().encode(plaintext),\n );\n\n // Combine nonce and encrypted data\n const combined = new Uint8Array(nonce.length + encrypted.byteLength);\n combined.set(nonce);\n combined.set(new Uint8Array(encrypted), nonce.length);\n const result = buf2hex(combined.buffer);\n\n log(`XPFF header generated for guest ID ${guestId}: ${result}`);\n\n return result;\n }\n}\n\nconst xpffBaseKey =\n '0e6be1f1e21ffc33590b888fd4dc81b19713e570e805d4e5df80a493c9571a05';\n\nfunction xpffPlain(): string {\n const timestamp = Date.now();\n return JSON.stringify({\n navigator_properties: {\n hasBeenActive: 'true',\n userAgent:\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',\n webdriver: 'false',\n },\n created_at: timestamp,\n });\n}\n\nexport async function generateXPFFHeader(guestId: string): Promise<string> {\n const generator = new XPFFHeaderGenerator(xpffBaseKey);\n const plaintext = xpffPlain();\n return generator.generateHeader(plaintext, guestId);\n}\n","import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport fetch from 'cross-fetch';\nimport { FetchTransformOptions, flexParseJson } from './api';\nimport {\n RateLimitEvent,\n RateLimitStrategy,\n WaitingRateLimitStrategy,\n} from './rate-limit';\nimport { AuthenticationError } from './errors';\nimport debug from 'debug';\nimport { generateXPFFHeader } from './xpff';\n\nconst log = debug('twitter-scraper:auth');\n\nexport interface TwitterAuthOptions {\n fetch: typeof fetch;\n transform: Partial<FetchTransformOptions>;\n rateLimitStrategy: RateLimitStrategy;\n experimental: {\n xClientTransactionId?: boolean;\n xpff?: boolean;\n };\n}\n\nexport interface TwitterAuth {\n fetch: typeof fetch;\n\n /**\n * How to behave when being rate-limited.\n * @param event The event information.\n */\n onRateLimit(event: RateLimitEvent): Promise<void>;\n\n /**\n * Returns the current cookie jar.\n */\n cookieJar(): CookieJar;\n\n /**\n * Returns the current cookies.\n */\n getCookies(): Promise<Cookie[]>;\n\n /**\n * Returns if a user is logged-in to Twitter through this instance.\n * @returns `true` if a user is logged-in; otherwise `false`.\n */\n isLoggedIn(): Promise<boolean>;\n\n /**\n * Logs into a Twitter account.\n * @param username The username to log in with.\n * @param password The password to log in with.\n * @param email The email to log in with, if you have email confirmation enabled.\n * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n */\n login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void>;\n\n /**\n * Logs out of the current session.\n */\n logout(): Promise<void>;\n\n /**\n * Deletes the current guest token token.\n */\n deleteToken(): void;\n\n /**\n * Returns if the authentication state has a token.\n * @returns `true` if the authentication state has a token; `false` otherwise.\n */\n hasToken(): boolean;\n\n /**\n * Returns the time that authentication was performed.\n * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet.\n */\n authenticatedAt(): Date | null;\n\n /**\n * Installs the authentication information into a headers-like object. If needed, the\n * authentication token will be updated from the API automatically.\n * @param headers A Headers instance representing a request's headers.\n * @param _url The URL being requested (currently unused, reserved for future use).\n * @param bearerTokenOverride Optional bearer token to use instead of the default one.\n */\n installTo(\n headers: Headers,\n _url: string,\n bearerTokenOverride?: string,\n ): Promise<void>;\n}\n\n/**\n * Wraps the provided fetch function with transforms.\n * @param fetchFn The fetch function.\n * @param transform The transform options.\n * @returns The input fetch function, wrapped with the provided transforms.\n */\nfunction withTransform(\n fetchFn: typeof fetch,\n transform?: Partial<FetchTransformOptions>,\n): typeof fetch {\n return async (input, init) => {\n const fetchArgs = (await transform?.request?.(input, init)) ?? [\n input,\n init,\n ];\n const res = await fetchFn(...fetchArgs);\n return (await transform?.response?.(res)) ?? res;\n };\n}\n\n/**\n * A guest authentication token manager. Automatically handles token refreshes.\n */\nexport class TwitterGuestAuth implements TwitterAuth {\n protected bearerToken: string;\n protected jar: CookieJar;\n protected guestToken?: string;\n protected guestCreatedAt?: Date;\n protected rateLimitStrategy: RateLimitStrategy;\n\n fetch: typeof fetch;\n\n constructor(\n bearerToken: string,\n readonly options?: Partial<TwitterAuthOptions>,\n ) {\n this.fetch = withTransform(options?.fetch ?? fetch, options?.transform);\n this.rateLimitStrategy =\n options?.rateLimitStrategy ?? new WaitingRateLimitStrategy();\n this.bearerToken = bearerToken;\n this.jar = new CookieJar();\n }\n\n async onRateLimit(event: RateLimitEvent): Promise<void> {\n await this.rateLimitStrategy.onRateLimit(event);\n }\n\n cookieJar(): CookieJar {\n return this.jar;\n }\n\n isLoggedIn(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n login(_username: string, _password: string, _email?: string): Promise<void> {\n return this.updateGuestToken();\n }\n\n logout(): Promise<void> {\n this.deleteToken();\n this.jar = new CookieJar();\n return Promise.resolve();\n }\n\n deleteToken() {\n delete this.guestToken;\n delete this.guestCreatedAt;\n }\n\n hasToken(): boolean {\n return this.guestToken != null;\n }\n\n authenticatedAt(): Date | null {\n if (this.guestCreatedAt == null) {\n return null;\n }\n\n return new Date(this.guestCreatedAt);\n }\n\n async installTo(\n headers: Headers,\n _url: string,\n bearerTokenOverride?: string,\n ): Promise<void> {\n // Use the override token if provided, otherwise use the instance's bearer token\n const tokenToUse = bearerTokenOverride ?? this.bearerToken;\n\n // Only use guest tokens when not overriding the bearer token\n // Guest tokens are tied to the bearer token they were generated with\n if (!bearerTokenOverride) {\n if (this.shouldUpdate()) {\n await this.updateGuestToken();\n }\n\n if (this.guestToken) {\n headers.set('x-guest-token', this.guestToken);\n }\n }\n\n headers.set('authorization', `Bearer ${tokenToUse}`);\n headers.set(\n 'user-agent',\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',\n );\n\n await this.installCsrfToken(headers);\n\n if (this.options?.experimental?.xpff) {\n const guestId = await this.guestId();\n if (guestId != null) {\n const xpffHeader = await generateXPFFHeader(guestId);\n headers.set('x-xp-forwarded-for', xpffHeader);\n }\n }\n\n headers.set('cookie', await this.getCookieString());\n }\n\n async installCsrfToken(headers: Headers): Promise<void> {\n const cookies = await this.getCookies();\n const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n if (xCsrfToken) {\n headers.set('x-csrf-token', xCsrfToken.value);\n }\n }\n\n protected async setCookie(key: string, value: string): Promise<void> {\n const cookie = Cookie.parse(`${key}=${value}`);\n if (!cookie) {\n throw new Error('Failed to parse cookie.');\n }\n\n await this.jar.setCookie(cookie, this.getCookieJarUrl());\n\n if (typeof document !== 'undefined') {\n document.cookie = cookie.toString();\n }\n }\n\n public async getCookies(): Promise<Cookie[]> {\n return this.jar.getCookies(this.getCookieJarUrl());\n }\n\n protected async getCookieString(): Promise<string> {\n const cookies = await this.getCookies();\n return cookies.map((cookie) => `${cookie.key}=${cookie.value}`).join('; ');\n }\n\n protected async removeCookie(key: string): Promise<void> {\n //@ts-expect-error don't care\n const store: MemoryCookieStore = this.jar.store;\n const cookies = await this.jar.getCookies(this.getCookieJarUrl());\n for (const cookie of cookies) {\n if (!cookie.domain || !cookie.path) continue;\n store.removeCookie(cookie.domain, cookie.path, key);\n\n if (typeof document !== 'undefined') {\n document.cookie = `${cookie.key}=; Max-Age=0; path=${cookie.path}; domain=${cookie.domain}`;\n }\n }\n }\n\n private getCookieJarUrl(): string {\n return typeof document !== 'undefined'\n ? document.location.toString()\n : 'https://x.com';\n }\n\n protected async guestId(): Promise<string | null> {\n const cookies = await this.getCookies();\n const guestIdCookie = cookies.find((cookie) => cookie.key === 'guest_id');\n return guestIdCookie ? guestIdCookie.value : null;\n }\n\n /**\n * Updates the authentication state with a new guest token from the Twitter API.\n */\n protected async updateGuestToken() {\n try {\n await this.updateGuestTokenCore();\n } catch (err) {\n log('Failed to update guest token; this may cause issues:', err);\n }\n }\n\n private async updateGuestTokenCore() {\n const guestActivateUrl = 'https://api.x.com/1.1/guest/activate.json';\n\n const headers = new Headers({\n Authorization: `Bearer ${this.bearerToken}`,\n Cookie: await this.getCookieString(),\n });\n\n log(`Making POST request to ${guestActivateUrl}`);\n\n const res = await this.fetch(guestActivateUrl, {\n method: 'POST',\n headers: headers,\n referrerPolicy: 'no-referrer',\n });\n\n await updateCookieJar(this.jar, res.headers);\n\n if (!res.ok) {\n throw new AuthenticationError(await res.text());\n }\n\n const o = await flexParseJson<any>(res);\n if (o == null || o['guest_token'] == null) {\n throw new AuthenticationError('guest_token not found.');\n }\n\n const newGuestToken = o['guest_token'];\n if (typeof newGuestToken !== 'string') {\n throw new AuthenticationError('guest_token was not a string.');\n }\n\n this.guestToken = newGuestToken;\n this.guestCreatedAt = new Date();\n\n await this.setCookie('gt', newGuestToken);\n\n log(`Updated guest token: ${newGuestToken}`);\n }\n\n /**\n * Returns if the authentication token needs to be updated or not.\n * @returns `true` if the token needs to be updated; `false` otherwise.\n */\n private shouldUpdate(): boolean {\n return (\n !this.hasToken() ||\n (this.guestCreatedAt != null &&\n this.guestCreatedAt <\n new Date(new Date().valueOf() - 3 * 60 * 60 * 1000))\n );\n }\n}\n","export interface PlatformExtensions {\n /**\n * Randomizes the runtime's TLS ciphers to bypass TLS client fingerprinting, which\n * hopefully avoids random 404s on some requests.\n *\n * **References:**\n * - https://github.com/imputnet/cobalt/pull/574\n */\n randomizeCiphers(): Promise<void>;\n}\n\nexport const genericPlatform = new (class implements PlatformExtensions {\n randomizeCiphers(): Promise<void> {\n return Promise.resolve();\n }\n})();\n","import { PlatformExtensions, genericPlatform } from './platform-interface';\n\nexport * from './platform-interface';\n\ndeclare const PLATFORM_NODE: boolean;\n\nexport class Platform implements PlatformExtensions {\n async randomizeCiphers() {\n const platform = await Platform.importPlatform();\n await platform?.randomizeCiphers();\n }\n\n private static async importPlatform(): Promise<null | PlatformExtensions> {\n if (PLATFORM_NODE) {\n const { platform } = await import('./node/index.js');\n return platform as PlatformExtensions;\n }\n\n return genericPlatform;\n }\n}\n","import fetch from 'cross-fetch';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:xctxid');\n\n// @ts-expect-error import type annotation (\"the current file is a CommonJS module\")\ntype LinkeDOM = typeof import('linkedom');\n\nlet linkedom: LinkeDOM | null = null;\nasync function linkedomImport(): Promise<LinkeDOM> {\n if (!linkedom) {\n const mod = await import('linkedom');\n linkedom = mod;\n return mod;\n }\n return linkedom;\n}\n\nasync function parseHTML(html: string): Promise<Window & typeof globalThis> {\n if (typeof window !== 'undefined') {\n const { defaultView } = new DOMParser().parseFromString(html, 'text/html');\n if (!defaultView) {\n throw new Error('Failed to get defaultView from parsed HTML.');\n }\n return defaultView;\n } else {\n const { DOMParser } = await linkedomImport();\n return new DOMParser().parseFromString(html, 'text/html').defaultView;\n }\n}\n\n// Copied from https://github.com/Lqm1/x-client-transaction-id/blob/main/utils.ts with minor tweaks to support us passing a custom fetch function\nasync function handleXMigration(fetchFn: typeof fetch): Promise<Document> {\n // Set headers to mimic a browser request\n const headers = {\n accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'accept-language': 'ja',\n 'cache-control': 'no-cache',\n pragma: 'no-cache',\n priority: 'u=0, i',\n 'sec-ch-ua':\n '\"Google Chrome\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'document',\n 'sec-fetch-mode': 'navigate',\n 'sec-fetch-site': 'none',\n 'sec-fetch-user': '?1',\n 'upgrade-insecure-requests': '1',\n 'user-agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',\n };\n\n // Fetch X.com homepage\n const response = await fetchFn('https://x.com', {\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch X homepage: ${response.statusText}`);\n }\n\n const htmlText = await response.text();\n\n // Parse HTML using linkedom\n let dom = await parseHTML(htmlText);\n let document = dom.window.document;\n\n // Check for migration redirection links\n const migrationRedirectionRegex = new RegExp(\n '(http(?:s)?://(?:www\\\\.)?(twitter|x){1}\\\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\\\-_]+)+',\n 'i',\n );\n\n const metaRefresh = document.querySelector(\"meta[http-equiv='refresh']\");\n const metaContent = metaRefresh\n ? metaRefresh.getAttribute('content') || ''\n : '';\n\n const migrationRedirectionUrl =\n migrationRedirectionRegex.exec(metaContent) ||\n migrationRedirectionRegex.exec(htmlText);\n\n if (migrationRedirectionUrl) {\n // Follow redirection URL\n const redirectResponse = await fetch(migrationRedirectionUrl[0]);\n\n if (!redirectResponse.ok) {\n throw new Error(\n `Failed to follow migration redirection: ${redirectResponse.statusText}`,\n );\n }\n\n const redirectHtml = await redirectResponse.text();\n dom = await parseHTML(redirectHtml);\n document = dom.window.document;\n }\n\n // Handle migration form if present\n const migrationForm =\n document.querySelector(\"form[name='f']\") ||\n document.querySelector(\"form[action='https://x.com/x/migrate']\");\n\n if (migrationForm) {\n const url =\n migrationForm.getAttribute('action') || 'https://x.com/x/migrate';\n const method = migrationForm.getAttribute('method') || 'POST';\n\n // Collect form input fields\n const requestPayload = new FormData();\n\n const inputFields = migrationForm.querySelectorAll('input');\n for (const element of Array.from(inputFields)) {\n const name = element.getAttribute('name');\n const value = element.getAttribute('value');\n if (name && value) {\n requestPayload.append(name, value);\n }\n }\n\n // Submit form using POST request\n const formResponse = await fetch(url, {\n method: method,\n body: requestPayload,\n headers,\n });\n\n if (!formResponse.ok) {\n throw new Error(\n `Failed to submit migration form: ${formResponse.statusText}`,\n );\n }\n\n const formHtml = await formResponse.text();\n dom = await parseHTML(formHtml);\n document = dom.window.document;\n }\n\n // Return final DOM document\n return document;\n}\n\nlet ClientTransaction:\n | typeof import('x-client-transaction-id')['ClientTransaction']\n | null = null;\nasync function clientTransaction(): Promise<\n typeof import('x-client-transaction-id')['ClientTransaction']\n> {\n if (!ClientTransaction) {\n const mod = await import('x-client-transaction-id');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ClientTransaction = mod.ClientTransaction as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return mod.ClientTransaction as any;\n }\n return ClientTransaction;\n}\n\nexport async function generateTransactionId(\n url: string,\n fetchFn: typeof fetch,\n method: 'GET' | 'POST',\n) {\n const parsedUrl = new URL(url);\n const path = parsedUrl.pathname;\n\n log(`Generating transaction ID for ${method} ${path}`);\n const document = await handleXMigration(fetchFn);\n const ClientTransactionClass = await clientTransaction();\n const transaction = await ClientTransactionClass.create(document);\n const transactionId = await transaction.generateTransactionId(method, path);\n log(`Transaction ID: ${transactionId}`);\n\n return transactionId;\n}\n","import { FetchParameters } from './api-types';\nimport { TwitterAuth, TwitterGuestAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport debug from 'debug';\nimport { generateTransactionId } from './xctxid';\n\nconst log = debug('twitter-scraper:api');\n\nexport interface FetchTransformOptions {\n /**\n * Transforms the request options before a request is made. This executes after all of the default\n * parameters have been configured, and is stateless. It is safe to return new request options\n * objects.\n * @param args The request options.\n * @returns The transformed request options.\n */\n request: (\n ...args: FetchParameters\n ) => FetchParameters | Promise<FetchParameters>;\n\n /**\n * Transforms the response after a request completes. This executes immediately after the request\n * completes, and is stateless. It is safe to return a new response object.\n * @param response The response object.\n * @returns The transformed response object.\n */\n response: (response: Response) => Response | Promise<Response>;\n}\n\nexport const bearerToken =\n 'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF';\n\nexport const bearerToken2 =\n 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';\n\nexport async function jitter(maxMs: number): Promise<void> {\n const jitter = Math.random() * maxMs;\n await new Promise((resolve) => setTimeout(resolve, jitter));\n}\n\n/**\n * An API result container.\n */\nexport type RequestApiResult<T> =\n | { success: true; value: T }\n | { success: false; err: Error };\n\n/**\n * Used internally to send HTTP requests to the Twitter API.\n * @internal\n * @param url - The URL to send the request to.\n * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request.\n * @param method - The HTTP method used when sending this request.\n * @param platform - The platform extensions to use.\n * @param headers - The headers to include in the request.\n * @param bearerTokenOverride - Optional bearer token to use instead of the default one.\n */\nexport async function requestApi<T>(\n url: string,\n auth: TwitterAuth,\n method: 'GET' | 'POST' = 'GET',\n platform: PlatformExtensions = new Platform(),\n headers: Headers = new Headers(),\n bearerTokenOverride?: string,\n): Promise<RequestApiResult<T>> {\n log(`Making ${method} request to ${url}`);\n\n await auth.installTo(headers, url, bearerTokenOverride);\n await platform.randomizeCiphers();\n\n if (\n auth instanceof TwitterGuestAuth &&\n auth.options?.experimental?.xClientTransactionId\n ) {\n const transactionId = await generateTransactionId(\n url,\n auth.fetch.bind(auth),\n method,\n );\n headers.set('x-client-transaction-id', transactionId);\n }\n\n let res: Response;\n do {\n const fetchParameters: FetchParameters = [\n url,\n {\n method,\n headers,\n credentials: 'include',\n },\n ];\n\n try {\n res = await auth.fetch(...fetchParameters);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n\n return {\n success: false,\n err: new Error('Failed to perform request.'),\n };\n }\n\n await updateCookieJar(auth.cookieJar(), res.headers);\n\n if (res.status === 429) {\n log('Rate limit hit, waiting for retry...');\n await auth.onRateLimit({\n fetchParameters: fetchParameters,\n response: res,\n });\n }\n } while (res.status === 429);\n\n if (!res.ok) {\n return {\n success: false,\n err: await ApiError.fromResponse(res),\n };\n }\n\n const value: T = await flexParseJson(res);\n if (res.headers.get('x-rate-limit-incoming') == '0') {\n auth.deleteToken();\n return { success: true, value };\n } else {\n return { success: true, value };\n }\n}\n\nexport async function flexParseJson<T>(res: Response): Promise<T> {\n try {\n return await res.json();\n } catch {\n log('Failed to parse response as JSON, trying text parse...');\n const text = await res.text();\n log('Response text:', text);\n return JSON.parse(text);\n }\n}\n\n/** @internal */\nexport function addApiFeatures(o: object) {\n return {\n ...o,\n rweb_lists_timeline_redesign_enabled: true,\n responsive_web_graphql_exclude_directive_enabled: true,\n verified_phone_label_enabled: false,\n creator_subscriptions_tweet_preview_api_enabled: true,\n responsive_web_graphql_timeline_navigation_enabled: true,\n responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n tweetypie_unmention_optimization_enabled: true,\n responsive_web_edit_tweet_api_enabled: true,\n graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n view_counts_everywhere_api_enabled: true,\n longform_notetweets_consumption_enabled: true,\n tweet_awards_web_tipping_enabled: false,\n freedom_of_speech_not_reach_fetch_enabled: true,\n standardized_nudges_misinfo: true,\n longform_notetweets_rich_text_read_enabled: true,\n responsive_web_enhance_cards_enabled: false,\n subscriptions_verification_info_enabled: true,\n subscriptions_verification_info_reason_enabled: true,\n subscriptions_verification_info_verified_since_enabled: true,\n super_follow_badge_privacy_enabled: false,\n super_follow_exclusive_tweet_notifications_enabled: false,\n super_follow_tweet_api_enabled: false,\n super_follow_user_api_enabled: false,\n android_graphql_skip_api_media_color_palette: false,\n creator_subscriptions_subscription_count_enabled: false,\n blue_business_profile_image_shape_enabled: false,\n unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n false,\n };\n}\n\nexport function addApiParams(\n params: URLSearchParams,\n includeTweetReplies: boolean,\n): URLSearchParams {\n params.set('include_profile_interstitial_type', '1');\n params.set('include_blocking', '1');\n params.set('include_blocked_by', '1');\n params.set('include_followed_by', '1');\n params.set('include_want_retweets', '1');\n params.set('include_mute_edge', '1');\n params.set('include_can_dm', '1');\n params.set('include_can_media_tag', '1');\n params.set('include_ext_has_nft_avatar', '1');\n params.set('include_ext_is_blue_verified', '1');\n params.set('include_ext_verified_type', '1');\n params.set('skip_status', '1');\n params.set('cards_platform', 'Web-12');\n params.set('include_cards', '1');\n params.set('include_ext_alt_text', 'true');\n params.set('include_ext_limited_action_results', 'false');\n params.set('include_quote_count', 'true');\n params.set('include_reply_count', '1');\n params.set('tweet_mode', 'extended');\n params.set('include_ext_collab_control', 'true');\n params.set('include_ext_views', 'true');\n params.set('include_entities', 'true');\n params.set('include_user_entities', 'true');\n params.set('include_ext_media_color', 'true');\n params.set('include_ext_media_availability', 'true');\n params.set('include_ext_sensitive_media_warning', 'true');\n params.set('include_ext_trusted_friends_metadata', 'true');\n params.set('send_error_codes', 'true');\n params.set('simple_quoted_tweet', 'true');\n params.set('include_tweet_replies', `${includeTweetReplies}`);\n params.set(\n 'ext',\n 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe',\n );\n return params;\n}\n","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { flexParseJson, requestApi } from './api';\nimport { CookieJar } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport { TwitterApiErrorRaw, AuthenticationError, ApiError } from './errors';\nimport { Type, type Static } from '@sinclair/typebox';\nimport { Check } from '@sinclair/typebox/value';\nimport * as OTPAuth from 'otpauth';\nimport { FetchParameters } from './api-types';\nimport debug from 'debug';\nimport { generateXPFFHeader } from './xpff';\nimport { generateTransactionId } from './xctxid';\n\nconst log = debug('twitter-scraper:auth-user');\n\nexport interface TwitterUserAuthFlowInitRequest {\n flow_name: string;\n input_flow_data: Record<string, unknown>;\n subtask_versions: Record<string, number>;\n}\n\nexport interface TwitterUserAuthFlowSubtaskRequest {\n flow_token: string;\n subtask_inputs: ({\n subtask_id: string;\n } & Record<string, unknown>)[];\n}\n\nexport type TwitterUserAuthFlowRequest =\n | TwitterUserAuthFlowInitRequest\n | TwitterUserAuthFlowSubtaskRequest;\n\nexport interface TwitterUserAuthFlowResponse {\n errors?: TwitterApiErrorRaw[];\n flow_token?: string;\n status?: string;\n subtasks?: TwitterUserAuthSubtask[];\n}\n\ninterface TwitterUserAuthVerifyCredentials {\n errors?: TwitterApiErrorRaw[];\n}\n\nconst TwitterUserAuthSubtask = Type.Object({\n subtask_id: Type.String(),\n enter_text: Type.Optional(Type.Object({})),\n});\ntype TwitterUserAuthSubtask = Static<typeof TwitterUserAuthSubtask>;\n\nexport type FlowTokenResultSuccess = {\n status: 'success';\n response: TwitterUserAuthFlowResponse;\n};\n\nexport type FlowTokenResultError = {\n status: 'error';\n err: Error;\n};\n\nexport type FlowTokenResult = FlowTokenResultSuccess | FlowTokenResultError;\n\nexport interface TwitterUserAuthCredentials {\n username: string;\n password: string;\n email?: string;\n twoFactorSecret?: string;\n}\n\n/**\n * The API interface provided to custom subtask handlers for interacting with the Twitter authentication flow.\n * This interface allows handlers to send flow requests and access the current flow token.\n *\n * The API is passed to each subtask handler and provides methods necessary for implementing\n * custom authentication subtasks. It abstracts away the low-level details of communicating\n * with Twitter's authentication API.\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom subtask handler that implements a hypothetical example subtask\n * const exampleHandler: FlowSubtaskHandler = async (subtaskId, response, credentials, api) => {\n * // Process the example subtask somehow\n * const data = await processExampleTask();\n *\n * // Submit the processed data using the provided API\n * return await api.sendFlowRequest({\n * flow_token: api.getFlowToken(),\n * subtask_inputs: [{\n * subtask_id: subtaskId,\n * example_data: {\n * value: data,\n * link: \"next_link\"\n * }\n * }]\n * });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleSubtask\", exampleHandler);\n * ```\n */\nexport interface FlowSubtaskHandlerApi {\n /**\n * Send a flow request to the Twitter API.\n * @param request The request object containing flow token and subtask inputs\n * @returns The result of the flow task\n */\n sendFlowRequest: (\n request: TwitterUserAuthFlowRequest,\n ) => Promise<FlowTokenResult>;\n /**\n * Gets the current flow token.\n * @returns The current flow token\n */\n getFlowToken: () => string;\n}\n\n/**\n * A handler function for processing Twitter authentication flow subtasks.\n * Library consumers can implement and register custom handlers for new or\n * existing subtask types using the Scraper.registerAuthSubtaskHandler method.\n *\n * Each subtask handler is called when its corresponding subtask ID is encountered\n * during the authentication flow. The handler receives the subtask ID, the previous\n * response data, the user's credentials, and an API interface for interacting with\n * the authentication flow.\n *\n * Handlers should process their specific subtask and return either a successful response\n * or an error. Success responses typically lead to the next subtask in the flow, while\n * errors will halt the authentication process.\n *\n * @param subtaskId - The identifier of the subtask being handled\n * @param previousResponse - The complete response from the previous authentication flow step\n * @param credentials - The user's authentication credentials including username, password, etc.\n * @param api - An interface providing methods to interact with the authentication flow\n * @returns A promise resolving to either a successful flow response or an error\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // Custom handler for a hypothetical verification subtask\n * const verificationHandler: FlowSubtaskHandler = async (\n * subtaskId,\n * response,\n * credentials,\n * api\n * ) => {\n * // Extract the verification data from the response\n * const verificationData = response.subtasks?.[0].exampleData?.value;\n * if (!verificationData) {\n * return {\n * status: 'error',\n * err: new Error('No verification data found in response')\n * };\n * }\n *\n * // Process the verification data somehow\n * const result = await processVerification(verificationData);\n *\n * // Submit the result using the flow API\n * return await api.sendFlowRequest({\n * flow_token: api.getFlowToken(),\n * subtask_inputs: [{\n * subtask_id: subtaskId,\n * example_verification: {\n * value: result,\n * link: \"next_link\"\n * }\n * }]\n * });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleVerificationSubtask\", verificationHandler);\n *\n * // Later, when logging in...\n * await scraper.login(\"username\", \"password\");\n * ```\n */\nexport type FlowSubtaskHandler = (\n subtaskId: string,\n previousResponse: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n) => Promise<FlowTokenResult>;\n\n/**\n * A user authentication token manager.\n */\nexport class TwitterUserAuth extends TwitterGuestAuth {\n private readonly subtaskHandlers: Map<string, FlowSubtaskHandler> = new Map();\n\n constructor(bearerToken: string, options?: Partial<TwitterAuthOptions>) {\n super(bearerToken, options);\n this.initializeDefaultHandlers();\n }\n\n /**\n * Register a custom subtask handler or override an existing one\n * @param subtaskId The ID of the subtask to handle\n * @param handler The handler function that processes the subtask\n */\n registerSubtaskHandler(subtaskId: string, handler: FlowSubtaskHandler): void {\n this.subtaskHandlers.set(subtaskId, handler);\n }\n\n private initializeDefaultHandlers(): void {\n this.subtaskHandlers.set(\n 'LoginJsInstrumentationSubtask',\n this.handleJsInstrumentationSubtask.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterUserIdentifierSSO',\n this.handleEnterUserIdentifierSSO.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterAlternateIdentifierSubtask',\n this.handleEnterAlternateIdentifierSubtask.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterPassword',\n this.handleEnterPassword.bind(this),\n );\n this.subtaskHandlers.set(\n 'AccountDuplicationCheck',\n this.handleAccountDuplicationCheck.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginTwoFactorAuthChallenge',\n this.handleTwoFactorAuthChallenge.bind(this),\n );\n this.subtaskHandlers.set('LoginAcid', this.handleAcid.bind(this));\n this.subtaskHandlers.set(\n 'LoginSuccessSubtask',\n this.handleSuccessSubtask.bind(this),\n );\n }\n\n async isLoggedIn(): Promise<boolean> {\n const cookie = await this.getCookieString();\n return cookie.includes('ct0=');\n }\n\n async login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void> {\n await this.updateGuestToken();\n\n const credentials: TwitterUserAuthCredentials = {\n username,\n password,\n email,\n twoFactorSecret,\n };\n\n let next: FlowTokenResult = await this.initLogin();\n while (next.status === 'success' && next.response.subtasks?.length) {\n const flowToken = next.response.flow_token;\n if (flowToken == null) {\n // Should never happen\n throw new Error('flow_token not found.');\n }\n\n const subtaskId = next.response.subtasks[0].subtask_id;\n const handler = this.subtaskHandlers.get(subtaskId);\n\n if (handler) {\n next = await handler(subtaskId, next.response, credentials, {\n sendFlowRequest: this.executeFlowTask.bind(this),\n getFlowToken: () => flowToken,\n });\n } else {\n throw new Error(`Unknown subtask ${subtaskId}`);\n }\n }\n if (next.status === 'error') {\n throw next.err;\n }\n }\n\n async logout(): Promise<void> {\n if (!this.hasToken()) {\n return;\n }\n\n try {\n await requestApi<void>(\n 'https://api.x.com/1.1/account/logout.json',\n this,\n 'POST',\n );\n } catch (error) {\n // Ignore errors during logout but still clean up state\n console.warn('Error during logout:', error);\n } finally {\n this.deleteToken();\n this.jar = new CookieJar();\n }\n }\n\n async installTo(\n headers: Headers,\n _url: string,\n bearerTokenOverride?: string,\n ): Promise<void> {\n // Use the override token if provided, otherwise use the instance's bearer token\n const tokenToUse = bearerTokenOverride ?? this.bearerToken;\n headers.set('authorization', `Bearer ${tokenToUse}`);\n headers.set(\n 'user-agent',\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',\n );\n\n if (this.guestToken) {\n // Guest token is optional for authenticated users\n headers.set('x-guest-token', this.guestToken);\n }\n\n await this.installCsrfToken(headers);\n\n if (this.options?.experimental?.xpff) {\n const guestId = await this.guestId();\n if (guestId != null) {\n const xpffHeader = await generateXPFFHeader(guestId);\n headers.set('x-xp-forwarded-for', xpffHeader);\n }\n }\n\n const cookie = await this.getCookieString();\n headers.set('cookie', cookie);\n }\n\n private async initLogin(): Promise<FlowTokenResult> {\n // Reset certain session-related cookies because Twitter complains sometimes if we don't\n this.removeCookie('twitter_ads_id=');\n this.removeCookie('ads_prefs=');\n this.removeCookie('_twitter_sess=');\n this.removeCookie('zipbox_forms_auth_token=');\n this.removeCookie('lang=');\n this.removeCookie('bouncer_reset_cookie=');\n this.removeCookie('twid=');\n this.removeCookie('twitter_ads_idb=');\n this.removeCookie('email_uid=');\n this.removeCookie('external_referer=');\n this.removeCookie('ct0=');\n this.removeCookie('aa_u=');\n this.removeCookie('__cf_bm=');\n\n return await this.executeFlowTask({\n flow_name: 'login',\n input_flow_data: {\n flow_context: {\n debug_overrides: {},\n start_location: {\n location: 'unknown',\n },\n },\n },\n subtask_versions: {\n action_list: 2,\n alert_dialog: 1,\n app_download_cta: 1,\n check_logged_in_account: 1,\n choice_selection: 3,\n contacts_live_sync_permission_prompt: 0,\n cta: 7,\n email_verification: 2,\n end_flow: 1,\n enter_date: 1,\n enter_email: 2,\n enter_password: 5,\n enter_phone: 2,\n enter_recaptcha: 1,\n enter_text: 5,\n enter_username: 2,\n generic_urt: 3,\n in_app_notification: 1,\n interest_picker: 3,\n js_instrumentation: 1,\n menu_dialog: 1,\n notifications_permission_prompt: 2,\n open_account: 2,\n open_home_timeline: 1,\n open_link: 1,\n phone_verification: 4,\n privacy_options: 1,\n security_key: 3,\n select_avatar: 4,\n select_banner: 2,\n settings_list: 7,\n show_code: 1,\n sign_up: 2,\n sign_up_review: 4,\n tweet_selection_urt: 1,\n update_users: 1,\n upload_media: 1,\n user_recommendations_list: 4,\n user_recommendations_urt: 1,\n wait_spinner: 3,\n web_modal: 1,\n },\n });\n }\n\n private async handleJsInstrumentationSubtask(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n _credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await api.sendFlowRequest({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n js_instrumentation: {\n response: '{}',\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleEnterAlternateIdentifierSubtask(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n text: credentials.email,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleEnterUserIdentifierSSO(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n settings_list: {\n setting_responses: [\n {\n key: 'user_identifier',\n response_data: {\n text_data: { result: credentials.username },\n },\n },\n ],\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleEnterPassword(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_password: {\n password: credentials.password,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleAccountDuplicationCheck(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n _credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n check_logged_in_account: {\n link: 'AccountDuplicationCheck_false',\n },\n },\n ],\n });\n }\n\n private async handleTwoFactorAuthChallenge(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n if (!credentials.twoFactorSecret) {\n return {\n status: 'error',\n err: new AuthenticationError(\n 'Two-factor authentication is required but no secret was provided',\n ),\n };\n }\n\n const totp = new OTPAuth.TOTP({ secret: credentials.twoFactorSecret });\n let error;\n for (let attempts = 1; attempts < 4; attempts += 1) {\n try {\n return await api.sendFlowRequest({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n link: 'next_link',\n text: totp.generate(),\n },\n },\n ],\n });\n } catch (err) {\n error = err;\n await new Promise((resolve) => setTimeout(resolve, 2000 * attempts));\n }\n }\n throw error;\n }\n\n private async handleAcid(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n text: credentials.email,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleSuccessSubtask(): Promise<FlowTokenResult> {\n // Login completed successfully, nothing more to do\n log('Successfully logged in with user credentials.');\n return {\n status: 'success',\n response: {},\n };\n }\n\n private async executeFlowTask(\n data: TwitterUserAuthFlowRequest,\n ): Promise<FlowTokenResult> {\n let onboardingTaskUrl = 'https://api.x.com/1.1/onboarding/task.json';\n if ('flow_name' in data) {\n onboardingTaskUrl = `https://api.x.com/1.1/onboarding/task.json?flow_name=${data.flow_name}`;\n }\n\n log(`Making POST request to ${onboardingTaskUrl}`);\n const headers = new Headers({\n accept: '*/*',\n 'accept-language': 'en-US,en;q=0.9',\n 'content-type': 'application/json',\n 'cache-control': 'no-cache',\n origin: 'https://x.com',\n pragma: 'no-cache',\n priority: 'u=1, i',\n referer: 'https://x.com/',\n 'sec-ch-ua':\n '\"Google Chrome\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-origin',\n 'user-agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',\n 'x-twitter-auth-type': 'OAuth2Client',\n 'x-twitter-active-user': 'yes',\n 'x-twitter-client-language': 'en',\n });\n await this.installTo(headers, onboardingTaskUrl);\n\n if (this.options?.experimental?.xClientTransactionId) {\n const transactionId = await generateTransactionId(\n onboardingTaskUrl,\n this.fetch.bind(this),\n 'POST',\n );\n headers.set('x-client-transaction-id', transactionId);\n }\n\n let res: Response;\n do {\n const fetchParameters: FetchParameters = [\n onboardingTaskUrl,\n {\n credentials: 'include',\n method: 'POST',\n headers: headers,\n body: JSON.stringify(data),\n },\n ];\n\n try {\n res = await this.fetch(...fetchParameters);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n\n return {\n status: 'error',\n err: err,\n };\n }\n\n await updateCookieJar(this.jar, res.headers);\n\n if (res.status === 429) {\n log('Rate limit hit, waiting before retrying...');\n await this.onRateLimit({\n fetchParameters: fetchParameters,\n response: res,\n });\n }\n } while (res.status === 429);\n\n if (!res.ok) {\n return { status: 'error', err: await ApiError.fromResponse(res) };\n }\n\n const flow: TwitterUserAuthFlowResponse = await flexParseJson(res);\n if (flow?.flow_token == null) {\n return {\n status: 'error',\n err: new AuthenticationError('flow_token not found.'),\n };\n }\n\n if (flow.errors?.length) {\n return {\n status: 'error',\n err: new AuthenticationError(\n `Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`,\n ),\n };\n }\n\n if (typeof flow.flow_token !== 'string') {\n return {\n status: 'error',\n err: new AuthenticationError('flow_token was not a string.'),\n };\n }\n\n const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined;\n Check(TwitterUserAuthSubtask, subtask);\n\n if (subtask && subtask.subtask_id === 'DenyLoginSubtask') {\n return {\n status: 'error',\n err: new AuthenticationError('Authentication error: DenyLoginSubtask'),\n };\n }\n\n return {\n status: 'success',\n response: flow,\n };\n }\n}\n","import stringify from 'json-stable-stringify';\n\n/**\n * Examples of requests to API endpoints. These are parsed at runtime and used\n * as templates for requests to a particular endpoint. Please ensure these do\n * not contain any information that you do not want published to NPM.\n */\nconst endpoints = {\n UserTweets:\n 'https://x.com/i/api/graphql/oRJs8SLCRNRbQzuZG93_oA/UserTweets?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserTweetsAndReplies:\n 'https://x.com/i/api/graphql/Hk4KlJ-ONjlJsucqR55P7g/UserTweetsAndReplies?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserLikedTweets:\n 'https://x.com/i/api/graphql/XHTMjDbiTGLQ9cP1em-aqQ/Likes?variables=%7B%22userId%22%3A%222244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserByScreenName:\n 'https://api.x.com/graphql/-oaLodhGbbnzJBACb1kk2Q/UserByScreenName?variables=%7B%22screen_name%22%3A%22geminiapp%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withPayments%22%3Afalse%2C%22withAuxiliaryUserLabels%22%3Atrue%7D',\n TweetDetail:\n 'https://x.com/i/api/graphql/YVyS4SfwYW7Uw5qwy0mQCA/TweetDetail?variables=%7B%22focalTweetId%22%3A%221985465713096794294%22%2C%22referrer%22%3A%22profile%22%2C%22with_rux_injections%22%3Afalse%2C%22rankingMode%22%3A%22Relevance%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n TweetResultByRestId:\n 'https://api.x.com/graphql/tCVRZ3WCvoj0BVO7BKnL-Q/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221985465713096794294%22%2C%22withCommunity%22%3Afalse%2C%22includePromotedContent%22%3Afalse%2C%22withVoice%22%3Afalse%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Afalse%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n ListTweets:\n 'https://x.com/i/api/graphql/S1Sm3_mNJwa-fnY9htcaAQ/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n SearchTimeline:\n 'https://x.com/i/api/graphql/nK1dw4oV3k4w5TdtcAdSww/SearchTimeline?variables=%7B%22rawQuery%22%3A%22twitter%22%2C%22count%22%3A20%2C%22querySource%22%3A%22typed_query%22%2C%22product%22%3A%22Top%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22rweb_lists_timeline_redesign_enabled%22%3Atrue%7D',\n Followers:\n 'https://x.com/i/api/graphql/SCu9fVIlCUm-BM8-tL5pkQ/Followers?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n Following:\n 'https://x.com/i/api/graphql/S5xUN9s2v4xk50KWGGvyvQ/Following?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n} as const;\n\nexport interface EndpointFieldInfo {\n /**\n * Request variables, used for providing arguments such as user IDs or result counts.\n */\n variables: Record<string, unknown>;\n\n /**\n * Request features, used for encoding feature flags into the request. These may either be\n * boolean values or numerically-encoded booleans (1 or 0). It is possible this may change\n * to include other representations of booleans as Twitter's backend evolves.\n */\n features: Record<string, unknown>;\n\n /**\n * Request field toggles, used for limiting how returned fields are represented. This is\n * rarely used.\n */\n fieldToggles: Record<string, unknown>;\n}\n\ntype SomePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\ntype EndpointVersion = string;\ntype EndpointName = string;\ntype EncodedVariables = string;\ntype EncodedFeatures = string;\ntype EncodedFieldToggles = string;\n\n// TODO: Set up field-level Intellisense for the QraphQL parameters in these?\ntype BaseUrl =\n | 'https://twitter.com/i/api/graphql'\n | 'https://x.com/i/api/graphql'\n | 'https://api.x.com/graphql';\ntype EndpointFields<EndpointUrl> =\n EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}&fieldToggles=${EncodedFieldToggles}`\n ? EndpointFieldInfo\n : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}`\n ? SomePartial<EndpointFieldInfo, 'fieldToggles'>\n : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}`\n ? SomePartial<EndpointFieldInfo, 'features' | 'fieldToggles'>\n : Partial<EndpointFieldInfo>;\n\nexport type ApiRequestInfo<EndpointUrl> = EndpointFields<EndpointUrl> & {\n /**\n * The URL, without any GraphQL query parameters.\n */\n url: string;\n\n /**\n * Converts the request back into a URL to be sent to the Twitter API.\n */\n toRequestUrl(): string;\n};\n\n/** Wrapper class for API request information. */\nclass ApiRequest<EndpointUrl> {\n url: string;\n variables?: Record<string, unknown> | undefined;\n features?: Record<string, unknown> | undefined;\n fieldToggles?: Record<string, unknown> | undefined;\n\n constructor(info: Omit<ApiRequestInfo<EndpointUrl>, 'toRequestUrl'>) {\n this.url = info.url;\n this.variables = info.variables;\n this.features = info.features;\n this.fieldToggles = info.fieldToggles;\n }\n\n toRequestUrl(): string {\n const params = new URLSearchParams();\n\n // Only include query parameters with values\n if (this.variables) {\n // Stringify with the query keys in sorted order like the Go package\n const variablesStr = stringify(this.variables);\n if (variablesStr) params.set('variables', variablesStr);\n }\n\n if (this.features) {\n const featuresStr = stringify(this.features);\n if (featuresStr) params.set('features', featuresStr);\n }\n\n if (this.fieldToggles) {\n const fieldTogglesStr = stringify(this.fieldToggles);\n if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr);\n }\n\n return `${this.url}?${params.toString()}`;\n }\n}\n\n/**\n * Parses information from a Twitter API endpoint using an example request\n * URL against that endpoint. This can be used to extract GraphQL parameters\n * in order to easily reuse and/or override them later.\n * @param example An example of the endpoint to analyze.\n * @returns The parsed endpoint information.\n */\nfunction parseEndpointExample<\n Endpoints,\n Endpoint extends string & keyof Endpoints,\n>(example: Endpoint): ApiRequestInfo<Endpoints[Endpoint]> {\n const { protocol, host, pathname, searchParams: query } = new URL(example);\n\n const base = `${protocol}//${host}${pathname}`;\n const variables = query.get('variables');\n const features = query.get('features');\n const fieldToggles = query.get('fieldToggles');\n\n return new ApiRequest<Endpoints[Endpoint]>({\n url: base,\n variables: variables ? JSON.parse(variables) : undefined,\n features: features ? JSON.parse(features) : undefined,\n fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined,\n } as Omit<\n ApiRequestInfo<Endpoints[Endpoint]>,\n 'toRequestUrl'\n >) as ApiRequestInfo<Endpoints[Endpoint]>;\n}\n\ntype ApiRequestFactory<Endpoints> = {\n [Endpoint in keyof Endpoints as `create${string &\n Endpoint}Request`]: () => ApiRequestInfo<Endpoints[Endpoint]>;\n};\n\nfunction createApiRequestFactory<Endpoints extends Record<string, string>>(\n endpoints: Endpoints,\n): ApiRequestFactory<Endpoints> {\n type UntypedApiRequestFactory = ApiRequestFactory<Record<string, string>>;\n\n return Object.entries(endpoints)\n .map<UntypedApiRequestFactory>(([endpointName, endpointExample]) => {\n // Create a partial factory for only one endpoint\n return {\n [`create${endpointName}Request`]: () => {\n // Create a new instance on each invocation so that we can safely\n // mutate requests before sending them off\n return parseEndpointExample<Endpoints, any>(endpointExample);\n },\n };\n })\n .reduce((agg, next) => {\n // Merge all of our factories into one that includes every endpoint\n return Object.assign(agg, next);\n }) as ApiRequestFactory<Endpoints>;\n}\n\nexport const apiRequestFactory = createApiRequestFactory(endpoints);\n","import { requestApi, RequestApiResult, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TwitterApiErrorRaw } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport interface CoreUserRaw {\n created_at?: string;\n name?: string;\n screen_name?: string;\n}\n\nexport interface LegacyUserRaw {\n created_at?: string;\n description?: string;\n entities?: {\n url?: {\n urls?: {\n url?: string;\n expanded_url?: string;\n display_url?: string;\n indices?: [number, number];\n }[];\n };\n description?: {\n // TODO: Get the proper type of this.\n urls?: any[];\n };\n };\n favourites_count?: number;\n followers_count?: number;\n friends_count?: number;\n media_count?: number;\n statuses_count?: number;\n id_str?: string;\n listed_count?: number;\n name?: string;\n location?: string;\n geo_enabled?: boolean;\n pinned_tweet_ids_str?: string[];\n profile_background_color?: string;\n profile_banner_url?: string;\n profile_image_url_https?: string;\n protected?: boolean;\n screen_name?: string;\n verified?: boolean;\n has_custom_timelines?: boolean;\n has_extended_profile?: boolean;\n url?: string;\n can_dm?: boolean;\n id?: number;\n // TODO: Get the proper type of this.\n utc_offset?: any;\n // TODO: Get the proper type of this.\n time_zone?: any;\n // TODO: Get the proper type of this.\n lang?: any;\n contributors_enabled?: boolean;\n is_translator?: boolean;\n is_translation_enabled?: boolean;\n profile_background_image_url?: string;\n profile_background_image_url_https?: string;\n profile_background_tile?: boolean;\n profile_image_url?: string;\n profile_link_color?: string;\n profile_sidebar_border_color?: string;\n profile_sidebar_fill_color?: string;\n profile_text_color?: string;\n profile_use_background_image?: boolean;\n default_profile?: boolean;\n default_profile_image?: boolean;\n can_secret_dm?: boolean;\n can_media_tag?: boolean;\n following?: boolean;\n follow_request_sent?: boolean;\n notifications?: boolean;\n blocking?: boolean;\n subscribed_by?: boolean;\n blocked_by?: boolean;\n want_retweets?: boolean;\n dm_blocked_by?: boolean;\n dm_blocking?: boolean;\n business_profile_state?: string;\n translator_type?: string;\n // TODO: Get the proper type of this.\n withheld_in_countries?: any[];\n followed_by?: boolean;\n}\n\n/**\n * A parsed profile object.\n */\nexport interface Profile {\n avatar?: string;\n banner?: string;\n biography?: string;\n birthday?: string;\n followersCount?: number;\n followingCount?: number;\n friendsCount?: number;\n mediaCount?: number;\n statusesCount?: number;\n isPrivate?: boolean;\n isVerified?: boolean;\n isBlueVerified?: boolean;\n joined?: Date;\n likesCount?: number;\n listedCount?: number;\n location?: string;\n name?: string;\n pinnedTweetIds?: string[];\n tweetsCount?: number;\n url?: string;\n userId?: string;\n username?: string;\n website?: string;\n canDm?: boolean;\n}\n\nexport interface UserRaw {\n data: {\n user: {\n result: {\n __typename?: string;\n message?: string;\n reason?: string;\n rest_id?: string;\n is_blue_verified?: boolean;\n legacy: LegacyUserRaw;\n core?: CoreUserRaw;\n avatar?: {\n image_url?: string;\n };\n location?: {\n location?: string;\n };\n };\n };\n };\n errors?: TwitterApiErrorRaw[];\n}\n\nfunction getAvatarOriginalSizeUrl(avatarUrl: string | undefined) {\n return avatarUrl ? avatarUrl.replace('_normal', '') : undefined;\n}\n\nexport function parseProfile(\n legacy: LegacyUserRaw,\n isBlueVerified?: boolean,\n): Profile {\n const profile: Profile = {\n avatar: getAvatarOriginalSizeUrl(legacy.profile_image_url_https),\n banner: legacy.profile_banner_url,\n biography: legacy.description,\n followersCount: legacy.followers_count,\n followingCount: legacy.friends_count,\n friendsCount: legacy.friends_count,\n mediaCount: legacy.media_count,\n isPrivate: legacy.protected ?? false,\n isVerified: legacy.verified,\n likesCount: legacy.favourites_count,\n listedCount: legacy.listed_count,\n location: legacy.location,\n name: legacy.name,\n pinnedTweetIds: legacy.pinned_tweet_ids_str,\n tweetsCount: legacy.statuses_count,\n url: `https://x.com/${legacy.screen_name}`,\n userId: legacy.id_str,\n username: legacy.screen_name,\n isBlueVerified: isBlueVerified ?? false,\n canDm: legacy.can_dm,\n };\n\n if (legacy.created_at != null) {\n profile.joined = new Date(Date.parse(legacy.created_at));\n }\n\n const urls = legacy.entities?.url?.urls;\n if (urls?.length != null && urls?.length > 0) {\n profile.website = urls[0].expanded_url;\n }\n\n return profile;\n}\n\nexport async function getProfile(\n username: string,\n auth: TwitterAuth,\n): Promise<RequestApiResult<Profile>> {\n const request = apiRequestFactory.createUserByScreenNameRequest();\n request.variables.screen_name = username;\n\n // Use bearerToken2 for UserByScreenName endpoint\n const res = await requestApi<UserRaw>(\n request.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n if (!res.success) {\n return res;\n }\n\n const { value } = res;\n const { errors } = value;\n if (\n (!value.data || !value.data.user || !value.data.user.result) &&\n errors != null &&\n errors.length > 0\n ) {\n return {\n success: false,\n err: new Error(errors.map((e) => e.message).join('\\n')),\n };\n }\n\n if (!value.data || !value.data.user || !value.data.user.result) {\n return {\n success: false,\n err: new Error('User not found.'),\n };\n }\n const { result: user } = value.data.user;\n const { legacy } = user;\n\n if (user.__typename === 'UserUnavailable' && user?.reason === 'Suspended') {\n return {\n success: false,\n err: new Error('User is suspended.'),\n };\n }\n\n if (user.rest_id == null || user.rest_id.length === 0) {\n return {\n success: false,\n err: new Error('rest_id not found.'),\n };\n }\n\n legacy.id_str = user.rest_id;\n legacy.screen_name ??= user.core?.screen_name;\n legacy.profile_image_url_https ??= user.avatar?.image_url;\n legacy.created_at ??= user.core?.created_at;\n legacy.location ??= user.location?.location;\n legacy.name ??= user.core?.name;\n\n if (legacy.screen_name == null || legacy.screen_name.length === 0) {\n return {\n success: false,\n err: new Error(`User ${username} does not exist or is private.`),\n };\n }\n\n return {\n success: true,\n value: parseProfile(legacy, user.is_blue_verified),\n };\n}\n\nconst idCache = new Map<string, string>();\n\nexport async function getUserIdByScreenName(\n screenName: string,\n auth: TwitterAuth,\n): Promise<RequestApiResult<string>> {\n const cached = idCache.get(screenName);\n if (cached != null) {\n return { success: true, value: cached };\n }\n\n const profileRes = await getProfile(screenName, auth);\n if (!profileRes.success) {\n return profileRes;\n }\n\n const profile = profileRes.value;\n if (profile.userId != null) {\n idCache.set(screenName, profile.userId);\n\n return {\n success: true,\n value: profile.userId,\n };\n }\n\n return {\n success: false,\n err: new Error('User ID is undefined.'),\n };\n}\n","import { jitter } from './api';\nimport { Profile } from './profile';\nimport { Tweet } from './tweets';\n\nexport interface FetchProfilesResponse {\n profiles: Profile[];\n next?: string;\n}\n\nexport type FetchProfiles = (\n query: string,\n maxProfiles: number,\n cursor: string | undefined,\n) => Promise<FetchProfilesResponse>;\n\nexport interface FetchTweetsResponse {\n tweets: Tweet[];\n next?: string;\n}\n\nexport type FetchTweets = (\n query: string,\n maxTweets: number,\n cursor: string | undefined,\n) => Promise<FetchTweetsResponse>;\n\nexport async function* getUserTimeline(\n query: string,\n maxProfiles: number,\n fetchFunc: FetchProfiles,\n): AsyncGenerator<Profile, void> {\n let nProfiles = 0;\n let cursor: string | undefined = undefined;\n let consecutiveEmptyBatches = 0;\n while (nProfiles < maxProfiles) {\n const batch: FetchProfilesResponse = await fetchFunc(\n query,\n maxProfiles,\n cursor,\n );\n\n const { profiles, next } = batch;\n cursor = next;\n\n if (profiles.length === 0) {\n consecutiveEmptyBatches++;\n if (consecutiveEmptyBatches > 5) break;\n } else consecutiveEmptyBatches = 0;\n\n for (const profile of profiles) {\n if (nProfiles < maxProfiles) yield profile;\n else break;\n nProfiles++;\n }\n\n if (!next) break;\n\n await jitter(1000);\n }\n}\n\nexport async function* getTweetTimeline(\n query: string,\n maxTweets: number,\n fetchFunc: FetchTweets,\n): AsyncGenerator<Tweet, void> {\n let nTweets = 0;\n let cursor: string | undefined = undefined;\n while (nTweets < maxTweets) {\n const batch: FetchTweetsResponse = await fetchFunc(\n query,\n maxTweets,\n cursor,\n );\n\n const { tweets, next } = batch;\n\n if (tweets.length === 0) {\n break;\n }\n\n for (const tweet of tweets) {\n if (nTweets < maxTweets) {\n cursor = next;\n yield tweet;\n } else {\n break;\n }\n\n nTweets++;\n }\n\n await jitter(1000);\n }\n}\n","export type NonNullableField<T, K extends keyof T> = {\n [P in K]-?: T[P];\n} & T;\n\nexport function isFieldDefined<T, K extends keyof T>(key: K) {\n return function (value: T): value is NonNullableField<T, K> {\n return isDefined(value[key]);\n };\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value != null;\n}\n","import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1';\nimport { Photo, Video } from './tweets';\nimport { isFieldDefined, NonNullableField } from './type-util';\n\nconst reHashtag = /\\B(\\#\\S+\\b)/g;\nconst reCashtag = /\\B(\\$\\S+\\b)/g;\nconst reTwitterUrl = /https:(\\/\\/t\\.co\\/([A-Za-z0-9]|[A-Za-z]){10})/g;\nconst reUsername = /\\B(\\@\\S{1,15}\\b)/g;\n\nexport function parseMediaGroups(media: TimelineMediaExtendedRaw[]): {\n sensitiveContent?: boolean;\n photos: Photo[];\n videos: Video[];\n} {\n const photos: Photo[] = [];\n const videos: Video[] = [];\n let sensitiveContent: boolean | undefined = undefined;\n\n for (const m of media\n .filter(isFieldDefined('id_str'))\n .filter(isFieldDefined('media_url_https'))) {\n if (m.type === 'photo') {\n photos.push({\n id: m.id_str,\n url: m.media_url_https,\n alt_text: m.ext_alt_text,\n });\n } else if (m.type === 'video') {\n videos.push(parseVideo(m));\n } else if (m.type === 'animated_gif') {\n videos.push(parseGif(m));\n }\n\n const sensitive = m.ext_sensitive_media_warning;\n if (sensitive != null) {\n sensitiveContent =\n sensitive.adult_content ||\n sensitive.graphic_violence ||\n sensitive.other;\n }\n }\n\n return { sensitiveContent, photos, videos };\n}\n\nfunction parseGif(\n m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n const gif: Video = {\n id: m.id_str,\n preview: m.media_url_https,\n };\n\n const variants = m.video_info?.variants ?? [];\n\n const url = variants.find((v) => v.content_type === 'video/mp4')?.url;\n\n if (url) {\n gif.preview = url;\n gif.url = url;\n }\n\n return gif;\n}\n\nfunction parseVideo(\n m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n const video: Video = {\n id: m.id_str,\n preview: m.media_url_https,\n };\n\n let maxBitrate = 0;\n const variants = m.video_info?.variants ?? [];\n for (const variant of variants) {\n const bitrate = variant.bitrate;\n if (bitrate != null && bitrate > maxBitrate && variant.url != null) {\n let variantUrl = variant.url;\n const stringStart = 0;\n const tagSuffixIdx = variantUrl.indexOf('?tag=10');\n if (tagSuffixIdx !== -1) {\n variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);\n }\n\n video.url = variantUrl;\n maxBitrate = bitrate;\n }\n }\n\n return video;\n}\n\nexport function reconstructTweetHtml(\n tweet: LegacyTweetRaw,\n photos: Photo[],\n videos: Video[],\n): string {\n const media: string[] = [];\n\n // HTML parsing with regex :)\n let html = tweet.full_text ?? '';\n\n html = html.replace(reHashtag, linkHashtagHtml);\n html = html.replace(reCashtag, linkCashtagHtml);\n html = html.replace(reUsername, linkUsernameHtml);\n html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media));\n\n for (const { url } of photos) {\n if (media.indexOf(url) !== -1) {\n continue;\n }\n\n html += `<br><img src=\"${url}\"/>`;\n }\n\n for (const { preview: url } of videos) {\n if (media.indexOf(url) !== -1) {\n continue;\n }\n\n html += `<br><img src=\"${url}\"/>`;\n }\n\n html = html.replace(/\\n/g, '<br>');\n\n return html;\n}\n\nfunction linkHashtagHtml(hashtag: string) {\n return `<a href=\"https://x.com/hashtag/${hashtag.replace(\n '#',\n '',\n )}\">${hashtag}</a>`;\n}\n\nfunction linkCashtagHtml(cashtag: string) {\n return `<a href=\"https://x.com/search?q=%24${cashtag.replace(\n '$',\n '',\n )}\">${cashtag}</a>`;\n}\n\nfunction linkUsernameHtml(username: string) {\n return `<a href=\"https://x.com/${username.replace('@', '')}\">${username}</a>`;\n}\n\nfunction unwrapTcoUrlHtml(tweet: LegacyTweetRaw, foundedMedia: string[]) {\n return function (tco: string) {\n for (const entity of tweet.entities?.urls ?? []) {\n if (tco === entity.url && entity.expanded_url != null) {\n return `<a href=\"${entity.expanded_url}\">${tco}</a>`;\n }\n }\n\n for (const entity of tweet.extended_entities?.media ?? []) {\n if (tco === entity.url && entity.media_url_https != null) {\n foundedMedia.push(entity.media_url_https);\n return `<br><a href=\"${tco}\"><img src=\"${entity.media_url_https}\"/></a>`;\n }\n }\n\n return tco;\n };\n}\n","import { CoreUserRaw, LegacyUserRaw } from './profile';\nimport { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util';\nimport {\n EditControlInitialRaw,\n LegacyTweetRaw,\n ParseTweetResult,\n QueryTweetsResponse,\n SearchResultRaw,\n TimelineResultRaw,\n} from './timeline-v1';\nimport { Tweet } from './tweets';\nimport { isFieldDefined } from './type-util';\n\nexport interface TimelineUserResultRaw {\n rest_id?: string;\n legacy?: LegacyUserRaw;\n is_blue_verified?: boolean;\n}\n\nexport interface TimelineEntryItemContentRaw {\n itemType?: string;\n __typename?: string;\n tweetDisplayType?: string;\n tweetResult?: {\n result?: TimelineResultRaw;\n };\n tweet_results?: {\n result?: TimelineResultRaw;\n };\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface TimelineEntryRaw {\n entryId: string;\n content?: {\n entryType?: string;\n __typename?: string;\n cursorType?: string;\n value?: string;\n items?: {\n entryId?: string;\n item?: {\n content?: TimelineEntryItemContentRaw;\n itemContent?: SearchEntryItemContentRaw;\n };\n }[];\n itemContent?: TimelineEntryItemContentRaw;\n };\n}\n\nexport interface SearchEntryItemContentRaw {\n tweetDisplayType?: string;\n tweet_results?: {\n result?: SearchResultRaw;\n };\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface SearchEntryRaw {\n entryId: string;\n sortIndex: string;\n content?: {\n cursorType?: string;\n entryType?: string;\n __typename?: string;\n value?: string;\n items?: {\n item?: {\n content?: SearchEntryItemContentRaw;\n };\n }[];\n itemContent?: SearchEntryItemContentRaw;\n };\n}\n\nexport interface TimelineInstruction {\n entries?: TimelineEntryRaw[];\n entry?: TimelineEntryRaw;\n type?: string;\n}\n\nexport interface TimelineV2 {\n data?: {\n user?: {\n result?: {\n __typename?: string;\n timeline?: {\n timeline?: {\n instructions?: TimelineInstruction[];\n };\n };\n };\n };\n };\n}\n\nexport interface ThreadedConversation {\n data?: {\n threaded_conversation_with_injections_v2?: {\n instructions?: TimelineInstruction[];\n };\n };\n}\n\nfunction getLegacyTweetId(tweet: Readonly<LegacyTweetRaw>): string | undefined {\n if (tweet.id_str) {\n return tweet.id_str;\n }\n\n return tweet.conversation_id_str;\n}\n\nexport function parseLegacyTweet(\n coreUser?: Readonly<CoreUserRaw>,\n user?: Readonly<LegacyUserRaw>,\n tweet?: Readonly<LegacyTweetRaw>,\n editControl?: Readonly<EditControlInitialRaw>,\n): ParseTweetResult {\n if (tweet == null) {\n return {\n success: false,\n err: new Error('Tweet was not found in the timeline object.'),\n };\n }\n\n if (user == null) {\n return {\n success: false,\n err: new Error('User was not found in the timeline object.'),\n };\n }\n\n const tweetId = getLegacyTweetId(tweet);\n if (!tweetId) {\n return {\n success: false,\n err: new Error('Tweet ID was not found in object.'),\n };\n }\n\n const hashtags = tweet.entities?.hashtags ?? [];\n const mentions = tweet.entities?.user_mentions ?? [];\n const media = tweet.extended_entities?.media ?? [];\n const pinnedTweets = new Set<string | undefined>(\n user.pinned_tweet_ids_str ?? [],\n );\n const urls = tweet.entities?.urls ?? [];\n const { photos, videos, sensitiveContent } = parseMediaGroups(media);\n\n // The edit tweets array always contains the original tweet, even if it has not been edited\n const tweetVersions = editControl?.edit_tweet_ids ?? [tweetId];\n\n const name = user.name ?? coreUser?.name;\n const username = user.screen_name ?? coreUser?.screen_name;\n const tw: Tweet = {\n __raw_UNSTABLE: tweet,\n bookmarkCount: tweet.bookmark_count,\n conversationId: tweet.conversation_id_str,\n id: tweetId,\n hashtags: hashtags\n .filter(isFieldDefined('text'))\n .map((hashtag) => hashtag.text),\n likes: tweet.favorite_count,\n mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({\n id: mention.id_str,\n username: mention.screen_name,\n name: mention.name,\n })),\n name: name,\n permanentUrl: `https://x.com/${username}/status/${tweetId}`,\n photos,\n replies: tweet.reply_count,\n retweets: tweet.retweet_count,\n text: tweet.full_text,\n thread: [],\n urls: urls\n .filter(isFieldDefined('expanded_url'))\n .map((url) => url.expanded_url),\n userId: tweet.user_id_str,\n username: username,\n videos,\n isQuoted: false,\n isReply: false,\n isEdited: tweetVersions.length > 1,\n versions: tweetVersions,\n isRetweet: false,\n isPin: false,\n sensitiveContent: false,\n };\n\n if (tweet.created_at) {\n tw.timeParsed = new Date(Date.parse(tweet.created_at));\n tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);\n }\n\n if (tweet.place?.id) {\n tw.place = tweet.place;\n }\n\n const quotedStatusIdStr = tweet.quoted_status_id_str;\n const inReplyToStatusIdStr = tweet.in_reply_to_status_id_str;\n const retweetedStatusIdStr = tweet.retweeted_status_id_str;\n const retweetedStatusResult = tweet.retweeted_status_result?.result;\n\n if (quotedStatusIdStr) {\n tw.isQuoted = true;\n tw.quotedStatusId = quotedStatusIdStr;\n }\n\n if (inReplyToStatusIdStr) {\n tw.isReply = true;\n tw.inReplyToStatusId = inReplyToStatusIdStr;\n }\n\n if (retweetedStatusIdStr || retweetedStatusResult) {\n tw.isRetweet = true;\n tw.retweetedStatusId = retweetedStatusIdStr;\n\n if (retweetedStatusResult) {\n const parsedResult = parseLegacyTweet(\n retweetedStatusResult?.core?.user_results?.result?.core,\n retweetedStatusResult?.core?.user_results?.result?.legacy,\n retweetedStatusResult?.legacy,\n retweetedStatusResult?.edit_control?.edit_control_initial,\n );\n\n if (parsedResult.success) {\n tw.retweetedStatus = parsedResult.tweet;\n }\n }\n }\n\n const views = parseInt(tweet.ext_views?.count ?? '');\n if (!isNaN(views)) {\n tw.views = views;\n }\n\n if (pinnedTweets.has(tweetId)) {\n // TODO: Update tests so this can be assigned at the tweet declaration\n tw.isPin = true;\n }\n\n if (sensitiveContent) {\n // TODO: Update tests so this can be assigned at the tweet declaration\n tw.sensitiveContent = true;\n }\n\n tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos);\n\n return { success: true, tweet: tw };\n}\n\nfunction parseResult(result?: TimelineResultRaw): ParseTweetResult {\n const noteTweetResultText =\n result?.note_tweet?.note_tweet_results?.result?.text;\n\n if (result?.legacy && noteTweetResultText) {\n result.legacy.full_text = noteTweetResultText;\n }\n\n const tweetResult = parseLegacyTweet(\n result?.core?.user_results?.result?.core,\n result?.core?.user_results?.result?.legacy,\n result?.legacy,\n result?.edit_control?.edit_control_initial,\n );\n if (!tweetResult.success) {\n return tweetResult;\n }\n\n if (!tweetResult.tweet.views && result?.views?.count) {\n const views = parseInt(result.views.count);\n if (!isNaN(views)) {\n tweetResult.tweet.views = views;\n }\n }\n\n const quotedResult = result?.quoted_status_result?.result;\n if (quotedResult) {\n if (quotedResult.legacy && quotedResult.rest_id) {\n quotedResult.legacy.id_str = quotedResult.rest_id;\n }\n\n const quotedTweetResult = parseResult(quotedResult);\n if (quotedTweetResult.success) {\n tweetResult.tweet.quotedStatus = quotedTweetResult.tweet;\n }\n }\n\n return tweetResult;\n}\n\nconst expectedEntryTypes = ['tweet', 'profile-conversation'];\n\nfunction getTimelineInstructionEntries(\n instruction: TimelineInstruction,\n): TimelineEntryRaw[] {\n const entries = instruction.entries ?? [];\n if (instruction.entry) {\n entries.push(instruction.entry);\n }\n return entries;\n}\n\nexport function parseTimelineTweetsV2(\n timeline: TimelineV2,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n for (const instruction of instructions) {\n const entries = getTimelineInstructionEntries(instruction);\n for (const entry of entries) {\n const entryContent = entry.content;\n if (!entryContent) continue;\n\n // Handle pagination\n if (entryContent.cursorType === 'Bottom') {\n bottomCursor = entryContent.value;\n continue;\n } else if (entryContent.cursorType === 'Top') {\n topCursor = entryContent.value;\n continue;\n }\n\n const idStr = entry.entryId;\n if (\n !expectedEntryTypes.some((entryType) => idStr.startsWith(entryType))\n ) {\n continue;\n }\n\n if (entryContent.itemContent) {\n // Typically TimelineTimelineTweet entries\n parseAndPush(tweets, entryContent.itemContent, idStr);\n } else if (entryContent.items) {\n // Typically TimelineTimelineModule entries\n for (const item of entryContent.items) {\n if (item.item?.itemContent) {\n parseAndPush(tweets, item.item.itemContent, idStr);\n }\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseTimelineEntryItemContentRaw(\n content: TimelineEntryItemContentRaw,\n entryId: string,\n isConversation = false,\n) {\n let result = content.tweet_results?.result ?? content.tweetResult?.result;\n if (\n result?.__typename === 'Tweet' ||\n (result?.__typename === 'TweetWithVisibilityResults' && result?.tweet)\n ) {\n if (result?.__typename === 'TweetWithVisibilityResults')\n result = result.tweet;\n\n if (result?.legacy) {\n result.legacy.id_str =\n result.rest_id ??\n entryId.replace('conversation-', '').replace('tweet-', '');\n }\n\n const tweetResult = parseResult(result);\n if (tweetResult.success) {\n if (isConversation) {\n if (content?.tweetDisplayType === 'SelfThread') {\n tweetResult.tweet.isSelfThread = true;\n }\n }\n\n return tweetResult.tweet;\n }\n }\n\n return null;\n}\n\nexport function parseAndPush(\n tweets: Tweet[],\n content: TimelineEntryItemContentRaw,\n entryId: string,\n isConversation = false,\n) {\n const tweet = parseTimelineEntryItemContentRaw(\n content,\n entryId,\n isConversation,\n );\n\n if (tweet) {\n tweets.push(tweet);\n }\n}\n\nexport function parseThreadedConversation(\n conversation: ThreadedConversation,\n): Tweet[] {\n const tweets: Tweet[] = [];\n const instructions =\n conversation.data?.threaded_conversation_with_injections_v2?.instructions ??\n [];\n\n for (const instruction of instructions) {\n const entries = getTimelineInstructionEntries(instruction);\n for (const entry of entries) {\n const entryContent = entry.content?.itemContent;\n if (entryContent) {\n parseAndPush(tweets, entryContent, entry.entryId, true);\n }\n\n for (const item of entry.content?.items ?? []) {\n const itemContent = item.item?.itemContent;\n if (itemContent) {\n parseAndPush(tweets, itemContent, entry.entryId, true);\n }\n }\n }\n }\n\n for (const tweet of tweets) {\n if (tweet.inReplyToStatusId) {\n for (const parentTweet of tweets) {\n if (parentTweet.id === tweet.inReplyToStatusId) {\n tweet.inReplyToStatus = parentTweet;\n break;\n }\n }\n }\n\n if (tweet.isSelfThread && tweet.conversationId === tweet.id) {\n for (const childTweet of tweets) {\n if (childTweet.isSelfThread && childTweet.id !== tweet.id) {\n tweet.thread.push(childTweet);\n }\n }\n\n if (tweet.thread.length === 0) {\n tweet.isSelfThread = false;\n }\n }\n }\n\n return tweets;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { SearchEntryRaw, parseLegacyTweet } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface SearchTimeline {\n data?: {\n search_by_raw_query?: {\n search_timeline?: {\n timeline?: {\n instructions?: {\n entries?: SearchEntryRaw[];\n entry?: SearchEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n}\n\nexport function parseSearchTimelineTweets(\n timeline: SearchTimeline,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.search_by_raw_query?.search_timeline?.timeline\n ?.instructions ?? [];\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n } else if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.tweetDisplayType === 'Tweet') {\n const tweetResultRaw = itemContent.tweet_results?.result;\n const tweetResult = parseLegacyTweet(\n tweetResultRaw?.core?.user_results?.result?.core,\n tweetResultRaw?.core?.user_results?.result?.legacy,\n tweetResultRaw?.legacy,\n tweetResultRaw?.edit_control?.edit_control_initial,\n );\n\n if (tweetResult.success) {\n if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) {\n const views = parseInt(tweetResultRaw.views.count);\n if (!isNaN(views)) {\n tweetResult.tweet.views = views;\n }\n }\n\n tweets.push(tweetResult.tweet);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseSearchTimelineUsers(\n timeline: SearchTimeline,\n): QueryProfilesResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const profiles: Profile[] = [];\n const instructions =\n timeline.data?.search_by_raw_query?.search_timeline?.timeline\n ?.instructions ?? [];\n\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n } else if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.userDisplayType === 'User') {\n const userResultRaw = itemContent.user_results?.result;\n\n if (userResultRaw?.legacy) {\n const profile = parseProfile(\n userResultRaw.legacy,\n userResultRaw.is_blue_verified,\n );\n\n if (!profile.userId) {\n profile.userId = userResultRaw.rest_id;\n }\n\n profiles.push(profile);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTweetTimeline, getUserTimeline } from './timeline-async';\nimport { Tweet } from './tweets';\nimport {\n SearchTimeline,\n parseSearchTimelineTweets,\n parseSearchTimelineUsers,\n} from './timeline-search';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\n/**\n * The categories that can be used in Twitter searches.\n */\nexport enum SearchMode {\n Top,\n Latest,\n Photos,\n Videos,\n Users,\n}\n\nexport function searchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(query, maxTweets, (q, mt, c) => {\n return fetchSearchTweets(q, mt, searchMode, auth, c);\n });\n}\n\nexport function searchProfiles(\n query: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(query, maxProfiles, (q, mt, c) => {\n return fetchSearchProfiles(q, mt, auth, c);\n });\n}\n\nexport async function fetchSearchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryTweetsResponse> {\n const timeline = await getSearchTimeline(\n query,\n maxTweets,\n searchMode,\n auth,\n cursor,\n );\n\n return parseSearchTimelineTweets(timeline);\n}\n\nexport async function fetchSearchProfiles(\n query: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n const timeline = await getSearchTimeline(\n query,\n maxProfiles,\n SearchMode.Users,\n auth,\n cursor,\n );\n\n return parseSearchTimelineUsers(timeline);\n}\n\nasync function getSearchTimeline(\n query: string,\n maxItems: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<SearchTimeline> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError('Scraper is not logged-in for search.');\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const searchTimelineRequest = apiRequestFactory.createSearchTimelineRequest();\n searchTimelineRequest.variables.rawQuery = query;\n searchTimelineRequest.variables.count = maxItems;\n searchTimelineRequest.variables.querySource = 'typed_query';\n searchTimelineRequest.variables.product = 'Top';\n\n if (cursor != null && cursor != '') {\n searchTimelineRequest.variables['cursor'] = cursor;\n }\n\n switch (searchMode) {\n case SearchMode.Latest:\n searchTimelineRequest.variables.product = 'Latest';\n break;\n case SearchMode.Photos:\n searchTimelineRequest.variables.product = 'Photos';\n break;\n case SearchMode.Videos:\n searchTimelineRequest.variables.product = 'Videos';\n break;\n case SearchMode.Users:\n searchTimelineRequest.variables.product = 'People';\n break;\n default:\n break;\n }\n\n const res = await requestApi<SearchTimeline>(\n searchTimelineRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { TimelineUserResultRaw } from './timeline-v2';\n\nexport interface RelationshipEntryItemContentRaw {\n itemType?: string;\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface RelationshipEntryRaw {\n entryId: string;\n sortIndex: string;\n content?: {\n cursorType?: string;\n entryType?: string;\n __typename?: string;\n value?: string;\n itemContent?: RelationshipEntryItemContentRaw;\n };\n}\n\nexport interface RelationshipTimeline {\n data?: {\n user?: {\n result?: {\n timeline?: {\n timeline?: {\n instructions?: {\n entries?: RelationshipEntryRaw[];\n entry?: RelationshipEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n };\n}\n\nexport function parseRelationshipTimeline(\n timeline: RelationshipTimeline,\n): QueryProfilesResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const profiles: Profile[] = [];\n const instructions =\n timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n }\n\n if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.userDisplayType === 'User') {\n const userResultRaw = itemContent.user_results?.result;\n\n if (userResultRaw?.legacy) {\n const profile = parseProfile(\n userResultRaw.legacy,\n userResultRaw.is_blue_verified,\n );\n\n if (!profile.userId) {\n profile.userId = userResultRaw.rest_id;\n }\n\n profiles.push(profile);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { getUserTimeline } from './timeline-async';\nimport {\n RelationshipTimeline,\n parseRelationshipTimeline,\n} from './timeline-relationship';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport function getFollowing(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n return fetchProfileFollowing(q, mt, auth, c);\n });\n}\n\nexport function getFollowers(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n return fetchProfileFollowers(q, mt, auth, c);\n });\n}\n\nexport async function fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile following.',\n );\n }\n\n const timeline = await getFollowingTimeline(\n userId,\n maxProfiles,\n auth,\n cursor,\n );\n\n return parseRelationshipTimeline(timeline);\n}\n\nexport async function fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile followers.',\n );\n }\n\n const timeline = await getFollowersTimeline(\n userId,\n maxProfiles,\n auth,\n cursor,\n );\n\n return parseRelationshipTimeline(timeline);\n}\n\nasync function getFollowingTimeline(\n userId: string,\n maxItems: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<RelationshipTimeline> {\n if (!auth.isLoggedIn()) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile following.',\n );\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const followingRequest = apiRequestFactory.createFollowingRequest();\n followingRequest.variables.userId = userId;\n followingRequest.variables.count = maxItems;\n followingRequest.variables.includePromotedContent = false;\n\n if (cursor != null && cursor != '') {\n followingRequest.variables.cursor = cursor;\n }\n\n const res = await requestApi<RelationshipTimeline>(\n followingRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n\nasync function getFollowersTimeline(\n userId: string,\n maxItems: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<RelationshipTimeline> {\n if (!auth.isLoggedIn()) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile followers.',\n );\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const followersRequest = apiRequestFactory.createFollowersRequest();\n followersRequest.variables.userId = userId;\n followersRequest.variables.count = maxItems;\n followersRequest.variables.includePromotedContent = false;\n\n if (cursor != null && cursor != '') {\n followersRequest.variables.cursor = cursor;\n }\n\n const res = await requestApi<RelationshipTimeline>(\n followersRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { addApiParams, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TimelineV1 } from './timeline-v1';\n\nexport async function getTrends(auth: TwitterAuth): Promise<string[]> {\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('count', '20');\n params.set('candidate_source', 'trends');\n params.set('include_page_configuration', 'false');\n params.set('entity_tokens', 'false');\n\n // Use bearerToken2 for trends endpoint\n const res = await requestApi<TimelineV1>(\n `https://api.x.com/2/guide.json?${params.toString()}`,\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n if (!res.success) {\n throw res.err;\n }\n\n const instructions = res.value.timeline?.instructions ?? [];\n if (instructions.length < 2) {\n throw new Error('No trend entries found.');\n }\n\n // Some of this is silly, but for now we're assuming we know nothing about the\n // data, and that anything can be missing. Go has non-nilable strings and empty\n // slices are nil, so it largely doesn't need to worry about this.\n const entries = instructions[1].addEntries?.entries ?? [];\n if (entries.length < 2) {\n throw new Error('No trend entries found.');\n }\n\n const items = entries[1].content?.timelineModule?.items ?? [];\n const trends: string[] = [];\n for (const item of items) {\n const trend =\n item.item?.clientEventInfo?.details?.guideDetails?.transparentGuideDetails\n ?.trendMetadata?.trendName;\n if (trend != null) {\n trends.push(trend);\n }\n }\n\n return trends;\n}\n","import { QueryTweetsResponse } from './timeline-v1';\nimport { parseAndPush, TimelineEntryRaw } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface ListTimeline {\n data?: {\n list?: {\n tweets_timeline?: {\n timeline?: {\n instructions?: {\n entries?: TimelineEntryRaw[];\n entry?: TimelineEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n}\n\nexport function parseListTimelineTweets(\n timeline: ListTimeline,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.list?.tweets_timeline?.timeline?.instructions ?? [];\n for (const instruction of instructions) {\n const entries = instruction.entries ?? [];\n\n for (const entry of entries) {\n const entryContent = entry.content;\n if (!entryContent) continue;\n\n if (entryContent.cursorType === 'Bottom') {\n bottomCursor = entryContent.value;\n continue;\n } else if (entryContent.cursorType === 'Top') {\n topCursor = entryContent.value;\n continue;\n }\n\n const idStr = entry.entryId;\n if (\n !idStr.startsWith('tweet') &&\n !idStr.startsWith('list-conversation')\n ) {\n continue;\n }\n\n if (entryContent.itemContent) {\n parseAndPush(tweets, entryContent.itemContent, idStr);\n } else if (entryContent.items) {\n for (const contentItem of entryContent.items) {\n if (\n contentItem.item &&\n contentItem.item.itemContent &&\n contentItem.entryId\n ) {\n parseAndPush(\n tweets,\n contentItem.item.itemContent,\n contentItem.entryId.split('tweet-')[1],\n );\n }\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { getUserIdByScreenName } from './profile';\nimport { LegacyTweetRaw, QueryTweetsResponse } from './timeline-v1';\nimport {\n parseTimelineTweetsV2,\n TimelineV2,\n TimelineEntryItemContentRaw,\n parseTimelineEntryItemContentRaw,\n ThreadedConversation,\n parseThreadedConversation,\n} from './timeline-v2';\nimport { getTweetTimeline } from './timeline-async';\nimport { apiRequestFactory } from './api-data';\nimport { ListTimeline, parseListTimelineTweets } from './timeline-list';\nimport { AuthenticationError } from './errors';\n\nexport interface Mention {\n id: string;\n username?: string;\n name?: string;\n}\n\nexport interface Photo {\n id: string;\n url: string;\n alt_text: string | undefined;\n}\n\nexport interface Video {\n id: string;\n preview: string;\n url?: string;\n}\n\nexport interface PlaceRaw {\n id?: string;\n place_type?: string;\n name?: string;\n full_name?: string;\n country_code?: string;\n country?: string;\n bounding_box?: {\n type?: string;\n coordinates?: number[][][];\n };\n}\n\n/**\n * A parsed Tweet object.\n */\nexport interface Tweet {\n __raw_UNSTABLE?: LegacyTweetRaw;\n bookmarkCount?: number;\n conversationId?: string;\n hashtags: string[];\n html?: string;\n id?: string;\n inReplyToStatus?: Tweet;\n inReplyToStatusId?: string;\n isEdited?: boolean;\n versions?: string[];\n isQuoted?: boolean;\n isPin?: boolean;\n isReply?: boolean;\n isRetweet?: boolean;\n isSelfThread?: boolean;\n likes?: number;\n name?: string;\n mentions: Mention[];\n permanentUrl?: string;\n photos: Photo[];\n place?: PlaceRaw;\n quotedStatus?: Tweet;\n quotedStatusId?: string;\n replies?: number;\n retweets?: number;\n retweetedStatus?: Tweet;\n retweetedStatusId?: string;\n text?: string;\n thread: Tweet[];\n timeParsed?: Date;\n timestamp?: number;\n urls: string[];\n userId?: string;\n username?: string;\n videos: Video[];\n views?: number;\n sensitiveContent?: boolean;\n}\n\nexport type TweetQuery =\n | Partial<Tweet>\n | ((tweet: Tweet) => boolean | Promise<boolean>);\n\nexport const features = addApiFeatures({\n interactive_text_enabled: true,\n longform_notetweets_inline_media_enabled: false,\n responsive_web_text_conversations_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n false,\n vibe_api_enabled: false,\n});\n\nexport async function fetchTweets(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const userTweetsRequest = apiRequestFactory.createUserTweetsRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserTweets endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchTweetsAndReplies(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 40) {\n maxTweets = 40;\n }\n\n const userTweetsRequest =\n apiRequestFactory.createUserTweetsAndRepliesRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserTweetsAndReplies endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchListTweets(\n listId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const listTweetsRequest = apiRequestFactory.createListTweetsRequest();\n listTweetsRequest.variables.listId = listId;\n listTweetsRequest.variables.count = maxTweets;\n\n if (cursor != null && cursor != '') {\n listTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for ListTweet endpoint\n const res = await requestApi<ListTimeline>(\n listTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseListTimelineTweets(res.value);\n}\n\nexport function getTweets(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchTweets(userId, mt, c, auth);\n });\n}\n\nexport function getTweetsByUserId(\n userId: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n return fetchTweets(q, mt, c, auth);\n });\n}\n\nexport function getTweetsAndReplies(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchTweetsAndReplies(userId, mt, c, auth);\n });\n}\n\nexport function getTweetsAndRepliesByUserId(\n userId: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n return fetchTweetsAndReplies(q, mt, c, auth);\n });\n}\n\nexport async function fetchLikedTweets(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching liked tweets.',\n );\n }\n\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const userTweetsRequest = apiRequestFactory.createUserLikedTweetsRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserLikedTweets endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport function getLikedTweets(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchLikedTweets(userId, mt, c, auth);\n });\n}\n\nexport async function getTweetWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n): Promise<Tweet | null> {\n const isCallback = typeof query === 'function';\n\n for await (const tweet of tweets) {\n const matches = isCallback\n ? await query(tweet)\n : checkTweetMatches(tweet, query);\n\n if (matches) {\n return tweet;\n }\n }\n\n return null;\n}\n\nexport async function getTweetsWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n): Promise<Tweet[]> {\n const isCallback = typeof query === 'function';\n const filtered = [];\n\n for await (const tweet of tweets) {\n const matches = isCallback ? query(tweet) : checkTweetMatches(tweet, query);\n\n if (!matches) continue;\n filtered.push(tweet);\n }\n\n return filtered;\n}\n\nfunction checkTweetMatches(tweet: Tweet, options: Partial<Tweet>): boolean {\n return Object.keys(options).every((k) => {\n const key = k as keyof Tweet;\n return tweet[key] === options[key];\n });\n}\n\nexport async function getLatestTweet(\n user: string,\n includeRetweets: boolean,\n max: number,\n auth: TwitterAuth,\n): Promise<Tweet | null | void> {\n const timeline = getTweets(user, max, auth);\n\n // No point looping if max is 1, just use first entry.\n return max === 1\n ? (await timeline.next()).value\n : await getTweetWhere(timeline, { isRetweet: includeRetweets });\n}\n\nexport interface TweetResultByRestId {\n data?: TimelineEntryItemContentRaw;\n}\n\nexport async function getTweet(\n id: string,\n auth: TwitterAuth,\n): Promise<Tweet | null> {\n const tweetDetailRequest = apiRequestFactory.createTweetDetailRequest();\n tweetDetailRequest.variables.focalTweetId = id;\n\n // Use bearerToken2 for this specific endpoint (TweetDetail)\n // This is required for animated GIFs to appear in tweets with mixed media\n const res = await requestApi<ThreadedConversation>(\n tweetDetailRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n if (!res.value) {\n return null;\n }\n\n const tweets = parseThreadedConversation(res.value);\n return tweets.find((tweet) => tweet.id === id) ?? null;\n}\n\nexport async function getTweetAnonymous(\n id: string,\n auth: TwitterAuth,\n): Promise<Tweet | null> {\n const tweetResultByRestIdRequest =\n apiRequestFactory.createTweetResultByRestIdRequest();\n tweetResultByRestIdRequest.variables.tweetId = id;\n\n // Use bearerToken2 for this specific endpoint (TweetResultByRestId)\n // This matches the behavior observed in the Twitter web client and Go library\n // We pass it as an override to avoid mutating shared state (concurrency-safe)\n const res = await requestApi<TweetResultByRestId>(\n tweetResultByRestIdRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n if (!res.value.data) {\n return null;\n }\n\n return parseTimelineEntryItemContentRaw(res.value.data, id);\n}\n","import {\n DmConversationTimeline,\n DmMessageEntry,\n DmCursorOptions,\n} from './direct-messages';\nimport { jitter } from './api';\n\nexport interface FetchDmConversationMessagesResponse {\n conversation: DmConversationTimeline;\n next?: DmCursorOptions;\n}\n\nexport type FetchDmConversationFn = (\n conversationId: string,\n maxMessages: number,\n cursor: DmCursorOptions | undefined,\n) => Promise<FetchDmConversationMessagesResponse>;\n\nexport async function* getDmConversationMessagesGenerator(\n conversationId: string,\n maxMessages: number,\n initialCursor: DmCursorOptions | undefined,\n fetchFunc: FetchDmConversationFn,\n): AsyncGenerator<DmMessageEntry, void> {\n let nMessages = 0;\n let cursor = initialCursor;\n\n while (nMessages < maxMessages) {\n const batch: FetchDmConversationMessagesResponse = await fetchFunc(\n conversationId,\n maxMessages,\n cursor,\n );\n\n const { conversation, next } = batch;\n\n if (!conversation?.entries || conversation?.entries?.length === 0) {\n break;\n }\n\n for (const entry of conversation.entries) {\n if (nMessages < maxMessages) {\n yield entry;\n nMessages++;\n } else {\n break;\n }\n }\n\n cursor = next;\n\n if (conversation.status === 'AT_END' || !next) {\n break;\n }\n\n await jitter(1000);\n }\n}\n","import { AuthenticationError } from './errors';\nimport { TwitterAuth } from './auth';\nimport { LegacyUserRaw } from './profile';\nimport { requestApi, addApiParams } from './api';\n\nimport { getDmConversationMessagesGenerator } from './direct-messages-async';\n\nexport interface DmInboxResponse {\n inbox_initial_state: DmInbox;\n}\n\nexport interface DmInbox {\n last_seen_event_id: string;\n trusted_last_seen_event_id: string;\n untrusted_last_seen_event_id: string;\n cursor: string;\n inbox_timelines: DmInboxTimelines;\n entries: DmMessageEntry[];\n users: { [key: string]: LegacyUserRaw };\n conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversationResponse {\n conversation_timeline: DmConversationTimeline;\n}\n\nexport interface DmConversationTimeline {\n status: DmStatus;\n min_entry_id: string;\n max_entry_id: string;\n entries: DmMessageEntry[];\n users: { [key: string]: LegacyUserRaw };\n conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversation {\n conversation_id: string;\n type: string;\n sort_event_id: string;\n sort_timestamp: string;\n participants: DmParticipant[];\n nsfw: boolean;\n notifications_disabled: boolean;\n mention_notifications_disabled: boolean;\n last_read_event_id: string;\n read_only: boolean;\n trusted: boolean;\n muted: boolean;\n status: DmStatus;\n min_entry_id: string;\n max_entry_id: string;\n}\n\nexport type DmStatus = 'AT_END' | 'HAS_MORE';\n\nexport interface DmParticipant {\n user_id: string;\n last_read_event_id?: string;\n}\n\nexport interface DmMessageEntry {\n welcome_message_create?: DmWelcomeMessage;\n message?: DmMessage;\n}\n\nexport interface DmMessage {\n id: string;\n time: string;\n affects_sort: boolean;\n request_id: string;\n conversation_id: string;\n message_data: DmMessageData;\n message_reactions: DmReaction[];\n}\n\nexport interface DmMessageData {\n id: string;\n time: string;\n recipient_id: string;\n sender_id: string;\n text: string;\n edit_count?: number;\n entities?: DmMessageEntities;\n}\n\nexport interface DmReaction {\n id: string;\n time: string;\n conversation_id: string;\n message_id: string;\n reaction_key: string;\n emoji_reaction: string;\n sender_id: string;\n}\n\nexport interface DmMessageEntities {\n // TODO: Not sure what these types are.\n hashtags: any[];\n symbols: any[];\n user_mentions: any[];\n urls: DmMessageUrl[];\n}\n\nexport interface DmMessageUrl {\n url: string;\n expanded_url: string;\n display_url: string;\n indices: number[];\n}\n\nexport interface DmWelcomeMessage extends DmMessage {\n welcome_message_id: string;\n}\n\nexport interface DmInboxTimelines {\n trusted: DmTimelineState;\n untrusted: DmTimelineState;\n untrusted_low_quality: DmTimelineState;\n}\n\nexport interface DmTimelineState {\n status: DmStatus;\n min_entry_id: string;\n}\n\nexport interface DmCursorOptions {\n maxId?: string;\n minId?: string;\n}\n\nexport async function fetchDmInbox(auth: TwitterAuth) {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching direct messages.',\n );\n }\n\n // TODO: Not sure how the \"cursor\" works for this. I don't have enough DMs to test.\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('nsfw_filtering_enabled', 'false');\n params.set('filter_low_quality', 'true');\n params.set('include_quality', 'all');\n params.set('include_ext_profile_image_shape', '1');\n params.set('dm_secret_conversations_enabled', 'false');\n params.set('krs_registration_enabled', 'false');\n params.set('include_ext_limited_action_results', 'true');\n params.set('dm_users', 'true');\n params.set('include_groups', 'true');\n params.set('include_inbox_timelines', 'true');\n params.set('supports_reactions', 'true');\n params.set('supports_edit', 'true');\n params.set('include_ext_edit_control', 'true');\n params.set('include_ext_business_affiliations_label', 'true');\n params.set('include_ext_parody_commentary_fan_label', 'true');\n params.set(\n 'ext',\n 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n );\n\n const res = await requestApi<DmInboxResponse>(\n `https://x.com/i/api/1.1/dm/inbox_initial_state.json?${params.toString()}`,\n auth,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseDmInbox(res.value);\n}\n\nexport async function parseDmInbox(inbox: DmInboxResponse) {\n return inbox.inbox_initial_state;\n}\n\n// This gets the current authenticated user's direct messages.\n// This requires the user to be authenticated.\nexport async function getDmInbox(auth: TwitterAuth) {\n return await fetchDmInbox(auth);\n}\n\n// This gets the current authenticated user's direct conversations.\n// This requires the user to be authenticated.\nexport async function fetchDmConversation(\n conversationId: string,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n) {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching direct messages.',\n );\n }\n\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('context', 'FETCH_DM_CONVERSATION_HISTORY');\n params.set('include_ext_profile_image_shape', '1');\n params.set('dm_secret_conversations_enabled', 'false');\n params.set('krs_registration_enabled', 'false');\n params.set('include_ext_limited_action_results', 'true');\n params.set('dm_users', 'true');\n params.set('include_groups', 'true');\n params.set('include_inbox_timelines', 'true');\n params.set('supports_reactions', 'true');\n params.set('supports_edit', 'true');\n params.set('include_conversation_info', 'true');\n params.set(\n 'ext',\n 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n );\n\n // By default, passing no cursor means you get the latest results.\n // `max_id` does backwards pagination using min_entry_id as the maxId to get older messages.\n // `min_id` does forward pagination using max_entry_id as the minId to get newer messages.\n // To know when there are no more pages, the response's \"status\" will return \"AT_END\".\n if (cursor) {\n if (cursor.maxId) {\n params.set('max_id', cursor.maxId);\n }\n if (cursor.minId) {\n params.set('min_id', cursor.minId);\n }\n }\n\n const url = `https://x.com/i/api/1.1/dm/conversation/${conversationId}.json?${params.toString()}`;\n\n const res = await requestApi<DmConversationResponse>(url, auth);\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseDmConversation(res.value);\n}\n\nexport async function parseDmConversation(\n conversation: DmConversationResponse,\n) {\n return conversation.conversation_timeline;\n}\n\nexport async function getDmConversation(\n conversationId: string,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n) {\n return await fetchDmConversation(conversationId, cursor, auth);\n}\n\nexport function getDmMessages(\n conversationId: string,\n maxMessages: number,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n): AsyncGenerator<DmMessageEntry, void> {\n return getDmConversationMessagesGenerator(\n conversationId,\n maxMessages,\n cursor,\n async (id, _max, cursor) => {\n const conversation = await fetchDmConversation(id, cursor, auth);\n\n let next: DmCursorOptions | undefined = undefined;\n\n if (cursor?.minId && conversation.max_entry_id) {\n next = { minId: conversation.max_entry_id };\n } else if (conversation.min_entry_id) {\n next = { maxId: conversation.min_entry_id };\n }\n\n return {\n conversation,\n next,\n };\n },\n );\n}\n\nexport function findDmConversationsByUserId(\n inbox: DmInbox,\n userId: string,\n): DmConversation[] {\n const conversations: DmConversation[] = [];\n\n for (const conversationId in inbox.conversations) {\n const conversation = inbox.conversations[conversationId];\n const hasUser = conversation.participants.some(\n (participant) => participant.user_id === userId,\n );\n\n if (hasUser) {\n conversations.push(conversation);\n }\n }\n\n return conversations;\n}\n","import { Cookie } from 'tough-cookie';\nimport { bearerToken, FetchTransformOptions, RequestApiResult } from './api';\nimport { TwitterAuth, TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { FlowSubtaskHandler, TwitterUserAuth } from './auth-user';\nimport { getProfile, getUserIdByScreenName, Profile } from './profile';\nimport {\n fetchSearchProfiles,\n fetchSearchTweets,\n SearchMode,\n searchProfiles,\n searchTweets,\n} from './search';\nimport {\n fetchProfileFollowing,\n fetchProfileFollowers,\n getFollowing,\n getFollowers,\n} from './relationships';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTrends } from './trends';\nimport {\n Tweet,\n getTweetAnonymous,\n getTweets,\n getLatestTweet,\n getLikedTweets,\n getTweetWhere,\n getTweetsWhere,\n getTweetsByUserId,\n TweetQuery,\n getTweet,\n fetchListTweets,\n getTweetsAndRepliesByUserId,\n getTweetsAndReplies,\n fetchLikedTweets,\n} from './tweets';\nimport fetch from 'cross-fetch';\nimport { RateLimitStrategy } from './rate-limit';\nimport {\n DmConversationTimeline,\n DmInbox,\n DmMessageEntry,\n DmCursorOptions,\n getDmConversation,\n getDmMessages,\n getDmInbox,\n findDmConversationsByUserId,\n DmConversation,\n} from './direct-messages';\n\nconst twUrl = 'https://x.com';\n\nexport interface ScraperOptions {\n /**\n * An alternative fetch function to use instead of the default fetch function. This may be useful\n * in nonstandard runtime environments, such as edge workers.\n */\n fetch: typeof fetch;\n\n /**\n * Additional options that control how requests and responses are processed. This can be used to\n * proxy requests through other hosts, for example.\n */\n transform: Partial<FetchTransformOptions>;\n\n /**\n * A handling strategy for rate limits (HTTP 429).\n */\n rateLimitStrategy: RateLimitStrategy;\n\n /**\n * Experimental features that may be added, changed, or removed at any time. Use with caution.\n */\n experimental: {\n /**\n * Enables the generation of the `x-client-transaction-id` header on requests. This may resolve some errors.\n */\n xClientTransactionId: boolean;\n /**\n * Enables the generation of the `x-xp-forwarded-for` header on requests. This may resolve some errors.\n */\n xpff: boolean;\n };\n}\n\n/**\n * An interface to Twitter's undocumented API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\nexport class Scraper {\n private auth!: TwitterAuth;\n private authTrends!: TwitterAuth;\n private token: string;\n\n /**\n * Creates a new Scraper object.\n * - Scrapers maintain their own guest tokens for Twitter's internal API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\n constructor(private readonly options?: Partial<ScraperOptions>) {\n this.token = bearerToken;\n this.useGuestAuth();\n }\n\n /**\n * Registers a subtask handler for the given subtask ID. This\n * will override any existing handler for the same subtask.\n * @param subtaskId The ID of the subtask to register the handler for.\n * @param subtaskHandler The handler function to register.\n */\n public registerAuthSubtaskHandler(\n subtaskId: string,\n subtaskHandler: FlowSubtaskHandler,\n ): void {\n if (this.auth instanceof TwitterUserAuth) {\n this.auth.registerSubtaskHandler(subtaskId, subtaskHandler);\n }\n\n if (this.authTrends instanceof TwitterUserAuth) {\n this.authTrends.registerSubtaskHandler(subtaskId, subtaskHandler);\n }\n }\n\n /**\n * Initializes auth properties using a guest token.\n * Used when creating a new instance of this class, and when logging out.\n * @internal\n */\n private useGuestAuth() {\n this.auth = new TwitterGuestAuth(this.token, this.getAuthOptions());\n this.authTrends = new TwitterGuestAuth(this.token, this.getAuthOptions());\n }\n\n /**\n * Fetches a Twitter profile.\n * @param username The Twitter username of the profile to fetch, without an `@` at the beginning.\n * @returns The requested {@link Profile}.\n */\n public async getProfile(username: string): Promise<Profile> {\n const res = await getProfile(username, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n * Fetches the user ID corresponding to the provided screen name.\n * @param screenName The Twitter screen name of the profile to fetch.\n * @returns The ID of the corresponding account.\n */\n public async getUserIdByScreenName(screenName: string): Promise<string> {\n const res = await getUserIdByScreenName(screenName, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n * Fetches tweets from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxTweets The maximum number of tweets to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @returns An {@link AsyncGenerator} of tweets matching the provided filters.\n */\n public searchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode = SearchMode.Top,\n ): AsyncGenerator<Tweet, void> {\n return searchTweets(query, maxTweets, searchMode, this.auth);\n }\n\n /**\n * Fetches profiles from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of tweets matching the provided filter(s).\n */\n public searchProfiles(\n query: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return searchProfiles(query, maxProfiles, this.auth);\n }\n\n /**\n * Fetches tweets from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxTweets The maximum number of tweets to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchSearchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchSearchTweets(query, maxTweets, searchMode, this.auth, cursor);\n }\n\n /**\n * Fetches profiles from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchSearchProfiles(\n query: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchSearchProfiles(query, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches list tweets from Twitter.\n * @param listId The list id\n * @param maxTweets The maximum number of tweets to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchListTweets(\n listId: string,\n maxTweets: number,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchListTweets(listId, maxTweets, cursor, this.auth);\n }\n\n /**\n * Fetch the tweets a user has liked\n * @param userId The user whose liked tweets should be returned\n * @param maxTweets The maximum number of tweets to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchLikedTweets(\n userId: string,\n maxTweets: number,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchLikedTweets(userId, maxTweets, cursor, this.auth);\n }\n\n /**\n * Fetch the profiles a user is following\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of following profiles for the provided user.\n */\n public getFollowing(\n userId: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return getFollowing(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetch the profiles that follow a user\n * @param userId The user whose followers should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of profiles following the provided user.\n */\n public getFollowers(\n userId: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return getFollowers(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetches following profiles from Twitter.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches profile followers from Twitter.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches the current trends from Twitter.\n * @returns The current list of trends.\n */\n public getTrends(): Promise<string[]> {\n return getTrends(this.authTrends);\n }\n\n /**\n * Fetches tweets from a Twitter user.\n * @param user The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n return getTweets(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches liked tweets from a Twitter user. Requires authentication.\n * @param user The user whose likes should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of liked tweets from the provided user.\n */\n public getLikedTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n return getLikedTweets(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets from a Twitter user using their ID.\n * @param userId The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsByUserId(\n userId: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet, void> {\n return getTweetsByUserId(userId, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets and replies from a Twitter user.\n * @param user The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsAndReplies(\n user: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet> {\n return getTweetsAndReplies(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets and replies from a Twitter user using their ID.\n * @param userId The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsAndRepliesByUserId(\n userId: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet, void> {\n return getTweetsAndRepliesByUserId(userId, maxTweets, this.auth);\n }\n\n /**\n * Fetches the first tweet matching the given query.\n *\n * Example:\n * ```js\n * const timeline = scraper.getTweets('user', 200);\n * const retweet = await scraper.getTweetWhere(timeline, { isRetweet: true });\n * ```\n * @param tweets The {@link AsyncIterable} of tweets to search through.\n * @param query A query to test **all** tweets against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Tweet}.\n */\n public getTweetWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n ): Promise<Tweet | null> {\n return getTweetWhere(tweets, query);\n }\n\n /**\n * Fetches all tweets matching the given query.\n *\n * Example:\n * ```js\n * const timeline = scraper.getTweets('user', 200);\n * const retweets = await scraper.getTweetsWhere(timeline, { isRetweet: true });\n * ```\n * @param tweets The {@link AsyncIterable} of tweets to search through.\n * @param query A query to test **all** tweets against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Tweet}.\n */\n public getTweetsWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n ): Promise<Tweet[]> {\n return getTweetsWhere(tweets, query);\n }\n\n /**\n * Fetches the most recent tweet from a Twitter user.\n * @param user The user whose latest tweet should be returned.\n * @param includeRetweets Whether or not to include retweets. Defaults to `false`.\n * @returns The {@link Tweet} object or `null`/`undefined` if it couldn't be fetched.\n */\n public getLatestTweet(\n user: string,\n includeRetweets = false,\n max = 200,\n ): Promise<Tweet | null | void> {\n return getLatestTweet(user, includeRetweets, max, this.auth);\n }\n\n /**\n * Fetches a single tweet.\n * @param id The ID of the tweet to fetch.\n * @returns The {@link Tweet} object, or `null` if it couldn't be fetched.\n */\n public getTweet(id: string): Promise<Tweet | null> {\n if (this.auth instanceof TwitterUserAuth) {\n return getTweet(id, this.auth);\n } else {\n return getTweetAnonymous(id, this.auth);\n }\n }\n\n /**\n * Retrieves the direct message inbox for the authenticated user.\n *\n * @return A promise that resolves to an object representing the direct message inbox.\n */\n public getDmInbox(): Promise<DmInbox> {\n return getDmInbox(this.auth);\n }\n\n /**\n * Retrieves the direct message conversation for the specified conversation ID.\n *\n * @param conversationId - The unique identifier of the DM conversation to retrieve.\n * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n * @return A promise that resolves to the timeline of the DM conversation.\n */\n public getDmConversation(\n conversationId: string,\n cursor?: DmCursorOptions,\n ): Promise<DmConversationTimeline> {\n return getDmConversation(conversationId, cursor, this.auth);\n }\n\n /**\n * Retrieves direct messages from a specific conversation.\n *\n * @param conversationId - The unique identifier of the conversation to fetch messages from.\n * @param [maxMessages=20] - The maximum number of messages to retrieve per request.\n * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n * @returns An {@link AsyncGenerator} of messages from the provided conversation.\n */\n public getDmMessages(\n conversationId: string,\n maxMessages = 20,\n cursor?: DmCursorOptions,\n ): AsyncGenerator<DmMessageEntry, void> {\n return getDmMessages(conversationId, maxMessages, cursor, this.auth);\n }\n\n /**\n * Retrieves a list of direct message conversations for a specific user based on their user ID.\n *\n * @param inbox - The DM inbox containing all available conversations.\n * @param userId - The unique identifier of the user whose DM conversations are to be retrieved.\n * @return An array of DM conversations associated with the specified user ID.\n */\n public findDmConversationsByUserId(\n inbox: DmInbox,\n userId: string,\n ): DmConversation[] {\n return findDmConversationsByUserId(inbox, userId);\n }\n\n /**\n * Returns if the scraper has a guest token. The token may not be valid.\n * @returns `true` if the scraper has a guest token; otherwise `false`.\n */\n public hasGuestToken(): boolean {\n return this.auth.hasToken() || this.authTrends.hasToken();\n }\n\n /**\n * Returns if the scraper is logged in as a real user.\n * @returns `true` if the scraper is logged in with a real user account; otherwise `false`.\n */\n public async isLoggedIn(): Promise<boolean> {\n return (\n (await this.auth.isLoggedIn()) && (await this.authTrends.isLoggedIn())\n );\n }\n\n /**\n * Login to Twitter as a real Twitter account. This enables running\n * searches.\n * @param username The username of the Twitter account to login with.\n * @param password The password of the Twitter account to login with.\n * @param email The email to log in with, if you have email confirmation enabled.\n * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n */\n public async login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void> {\n // Swap in a real authorizer for all requests\n const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions());\n await userAuth.login(username, password, email, twoFactorSecret);\n this.auth = userAuth;\n this.authTrends = userAuth;\n }\n\n /**\n * Log out of Twitter.\n */\n public async logout(): Promise<void> {\n await this.auth.logout();\n await this.authTrends.logout();\n\n // Swap in guest authorizers for all requests\n this.useGuestAuth();\n }\n\n /**\n * Retrieves all cookies for the current session.\n * @returns All cookies for the current session.\n */\n public async getCookies(): Promise<Cookie[]> {\n return await this.authTrends\n .cookieJar()\n .getCookies(\n typeof document !== 'undefined' ? document.location.toString() : twUrl,\n );\n }\n\n /**\n * Set cookies for the current session.\n * @param cookies The cookies to set for the current session.\n */\n public async setCookies(cookies: (string | Cookie)[]): Promise<void> {\n const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions());\n for (const cookie of cookies) {\n await userAuth.cookieJar().setCookie(cookie, twUrl);\n }\n\n this.auth = userAuth;\n this.authTrends = userAuth;\n }\n\n /**\n * Clear all cookies for the current session.\n */\n public async clearCookies(): Promise<void> {\n await this.auth.cookieJar().removeAllCookies();\n await this.authTrends.cookieJar().removeAllCookies();\n }\n\n /**\n * Sets the optional cookie to be used in requests.\n * @param _cookie The cookie to be used in requests.\n * @deprecated This function no longer represents any part of Twitter's auth flow.\n * @returns This scraper instance.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public withCookie(_cookie: string): Scraper {\n console.warn(\n 'Warning: Scraper#withCookie is deprecated and will be removed in a later version. Use Scraper#login or Scraper#setCookies instead.',\n );\n return this;\n }\n\n /**\n * Sets the optional CSRF token to be used in requests.\n * @param _token The CSRF token to be used in requests.\n * @deprecated This function no longer represents any part of Twitter's auth flow.\n * @returns This scraper instance.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public withXCsrfToken(_token: string): Scraper {\n console.warn(\n 'Warning: Scraper#withXCsrfToken is deprecated and will be removed in a later version.',\n );\n return this;\n }\n\n private getAuthOptions(): Partial<TwitterAuthOptions> {\n return {\n fetch: this.options?.fetch,\n transform: this.options?.transform,\n rateLimitStrategy: this.options?.rateLimitStrategy,\n experimental: {\n xClientTransactionId: this.options?.experimental?.xClientTransactionId,\n xpff: this.options?.experimental?.xpff,\n },\n };\n }\n\n private handleResponse<T>(res: RequestApiResult<T>): T {\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n }\n}\n"],"names":["log","crypto","DOMParser","jitter","endpoints","SearchMode","cursor"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/errors.ts","../../../src/rate-limit.ts","../../../src/castle.ts","../../../src/requests.ts","../../../src/xpff.ts","../../../src/auth.ts","../../../src/platform/platform-interface.ts","../../../src/platform/index.ts","../../../src/xctxid.ts","../../../src/chrome-fingerprint.ts","../../../src/api.ts","../../../src/auth-user.ts","../../../src/api-data.ts","../../../src/profile.ts","../../../src/timeline-async.ts","../../../src/type-util.ts","../../../src/timeline-tweet-util.ts","../../../src/timeline-v2.ts","../../../src/timeline-search.ts","../../../src/search.ts","../../../src/timeline-relationship.ts","../../../src/relationships.ts","../../../src/trends.ts","../../../src/timeline-list.ts","../../../src/tweets.ts","../../../src/direct-messages-async.ts","../../../src/direct-messages.ts","../../../src/scraper.ts"],"sourcesContent":["export class ApiError extends Error {\n constructor(readonly response: Response, readonly data: any) {\n super(\n `Response status: ${response.status} | headers: ${JSON.stringify(\n headersToString(response.headers),\n )} | data: ${typeof data === 'string' ? data : JSON.stringify(data)}`,\n );\n }\n\n static async fromResponse(response: Response) {\n // Try our best to parse the result, but don't bother if we can't\n let data: string | object | undefined = undefined;\n try {\n if (response.headers.get('content-type')?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n } catch {\n try {\n data = await response.text();\n } catch {}\n }\n\n return new ApiError(response, data);\n }\n}\n\nfunction headersToString(headers: Headers): string {\n const result: string[] = [];\n headers.forEach((value, key) => {\n result.push(`${key}: ${value}`);\n });\n return result.join('\\n');\n}\n\nexport class AuthenticationError extends Error {\n constructor(message?: string) {\n super(message || 'Authentication failed');\n this.name = 'AuthenticationError';\n }\n}\n\nexport interface TwitterApiErrorPosition {\n line: number;\n column: number;\n}\n\nexport interface TwitterApiErrorTraceInfo {\n trace_id: string;\n}\n\nexport interface TwitterApiErrorExtensions {\n code?: number;\n kind?: string;\n name?: string;\n source?: string;\n tracing?: TwitterApiErrorTraceInfo;\n}\n\nexport interface TwitterApiErrorRaw extends TwitterApiErrorExtensions {\n message?: string;\n locations?: TwitterApiErrorPosition[];\n path?: string[];\n extensions?: TwitterApiErrorExtensions;\n}\n","import { FetchParameters } from './api-types';\nimport { ApiError } from './errors';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:rate-limit');\n\n/**\n * Information about a rate-limiting event. Both the request and response\n * information are provided.\n */\nexport interface RateLimitEvent {\n /** The complete arguments that were passed to the fetch function. */\n fetchParameters: FetchParameters;\n /** The failing HTTP response. */\n response: Response;\n}\n\n/**\n * The public interface for all rate-limiting strategies. Library consumers are\n * welcome to provide their own implementations of this interface in the Scraper\n * constructor options.\n *\n * The {@link RateLimitEvent} object contains both the request and response\n * information associated with the event.\n *\n * @example\n * import { Scraper, RateLimitStrategy } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom rate-limiting implementation that just logs request/response information.\n * class ConsoleLogRateLimitStrategy implements RateLimitStrategy {\n * async onRateLimit(event: RateLimitEvent): Promise<void> {\n * console.log(event.fetchParameters, event.response);\n * }\n * }\n *\n * const scraper = new Scraper({\n * rateLimitStrategy: new ConsoleLogRateLimitStrategy(),\n * });\n */\nexport interface RateLimitStrategy {\n /**\n * Called when the scraper is rate limited.\n * @param event The event information, including the request and response info.\n */\n onRateLimit(event: RateLimitEvent): Promise<void>;\n}\n\n/**\n * A rate-limiting strategy that simply waits for the current rate limit period to expire.\n * This has been known to take up to 13 minutes, in some cases.\n */\nexport class WaitingRateLimitStrategy implements RateLimitStrategy {\n async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n /*\n Known headers at this point:\n - x-rate-limit-limit: Maximum number of requests per time period?\n - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset.\n - x-rate-limit-remaining: Number of requests remaining in current time period?\n */\n const xRateLimitLimit = res.headers.get('x-rate-limit-limit');\n const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining');\n const xRateLimitReset = res.headers.get('x-rate-limit-reset');\n\n log(\n `Rate limit event: limit=${xRateLimitLimit}, remaining=${xRateLimitRemaining}, reset=${xRateLimitReset}`,\n );\n\n if (xRateLimitRemaining == '0' && xRateLimitReset) {\n const currentTime = new Date().valueOf() / 1000;\n const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime);\n\n // I have seen this block for 800s (~13 *minutes*)\n await new Promise((resolve) => setTimeout(resolve, timeDeltaMs));\n }\n }\n}\n\n/**\n * A rate-limiting strategy that throws an {@link ApiError} when a rate limiting event occurs.\n */\nexport class ErrorRateLimitStrategy implements RateLimitStrategy {\n async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n throw await ApiError.fromResponse(res);\n }\n}\n","/**\n * castle.ts - Local Castle.io v11 token generation for Twitter/X login flow.\n *\n * Ported from yubie-re/castleio-gen (Python, MIT license, archived May 2025)\n * to TypeScript. Generates device fingerprint tokens required by Twitter's\n * login flow to avoid error 399 (\"suspicious activity\").\n *\n * This generates Castle.io SDK v2.6.0 compatible tokens (version 11).\n *\n * Token structure overview:\n * 1. Collect device/browser fingerprint data (3 parts)\n * 2. Collect behavioral event data (mouse/keyboard/touch metrics)\n * 3. Apply layered XOR encryption with timestamp and UUID keys\n * 4. Prepend header (timestamp, SDK version, publisher key, UUID)\n * 5. XXTEA-encrypt the entire payload\n * 6. Base64URL-encode with version prefix and random XOR byte\n */\n\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:castle');\n\n// ─── Field Encoding Types ────────────────────────────────────────────────────\n\n/**\n * How a fingerprint field's value is serialized into the token.\n * Each field has a 1-byte header (5-bit index + 3-bit encoding type),\n * followed by encoding-specific body bytes.\n */\n/** @internal Exported for testing */\nexport enum FieldEncoding {\n /** No body bytes (field presence alone is the signal) */\n Empty = -1,\n /** Marker field, no body bytes */\n Marker = 1,\n /** Single byte value */\n Byte = 3,\n /** XXTEA-encrypted byte array with length prefix */\n EncryptedBytes = 4,\n /** 1 or 2 byte value (2 bytes with high bit set if > 127) */\n CompactInt = 5,\n /** Single byte, value is Math.round()'d first */\n RoundedByte = 6,\n /** Raw bytes appended directly after header */\n RawAppend = 7,\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Twitter's Castle.io publishable key (32-char, without pk_ prefix) */\nconst TWITTER_CASTLE_PK = 'AvRa79bHyJSYSQHnRpcVtzyxetSvFerx';\n\n/** XXTEA encryption key for the entire token */\nconst XXTEA_KEY = [1164413191, 3891440048, 185273099, 2746598870];\n\n/**\n * Per-field XXTEA key tail: field key = [fieldIndex, initTime, ...PER_FIELD_KEY_TAIL].\n * XXTEA uses 128-bit (4-word) keys, so only indices 0-3 of the assembled key participate\n * in encryption. The extra elements here are inert but kept for faithful parity with the\n * Python SDK source.\n */\nconst PER_FIELD_KEY_TAIL = [\n 16373134, 643144773, 1762804430, 1186572681, 1164413191,\n];\n\n/** Timestamp epoch offset: seconds since ~Aug 23 2018 */\nconst TS_EPOCH = 1535e6;\n\n/** SDK version 2.6.0 encoded as 16-bit: (3<<13)|(1<<11)|(6<<6)|0 = 0x6980 */\nconst SDK_VERSION = 0x6980;\n\n/** Token format version byte (v11) */\nconst TOKEN_VERSION = 0x0b;\n\n/**\n * Fingerprint part indices — each section is tagged with a part ID\n * in its size/index header byte.\n */\nconst FP_PART = {\n DEVICE: 0, // Part 1: hardware/OS/rendering fingerprint\n BROWSER: 4, // Part 2: browser environment fingerprint\n TIMING: 7, // Part 3: timing-based fingerprint\n} as const;\n\n// ─── Simulated Browser Profile ──────────────────────────────────────────────\n\n/**\n * Simulated browser environment values embedded in the fingerprint.\n * These should match a realistic Chrome-on-Windows configuration.\n *\n * Users can provide a partial override via `ScraperOptions.experimental.browserProfile`\n * to customize the fingerprint. Unspecified fields are randomized from realistic pools.\n */\nexport interface BrowserProfile {\n locale: string;\n language: string;\n timezone: string;\n screenWidth: number;\n screenHeight: number;\n /** Available screen width (excludes OS chrome like taskbars) */\n availableWidth: number;\n /** Available screen height (excludes OS chrome like taskbars) */\n availableHeight: number;\n /** WebGL ANGLE renderer string */\n gpuRenderer: string;\n /** Device memory in GB (encoded as value * 10) */\n deviceMemoryGB: number;\n /** Logical CPU core count */\n hardwareConcurrency: number;\n /** Screen color depth in bits */\n colorDepth: number;\n /** CSS device pixel ratio (encoded as value * 10) */\n devicePixelRatio: number;\n}\n\n/** Default fallback profile: Chrome 144 on Windows 10, NVIDIA GTX 1080 Ti, 1080p */\nconst DEFAULT_PROFILE: BrowserProfile = {\n locale: 'en-US',\n language: 'en',\n timezone: 'America/New_York',\n screenWidth: 1920,\n screenHeight: 1080,\n availableWidth: 1920,\n availableHeight: 1032, // 1080 minus Windows taskbar (~48px)\n gpuRenderer:\n 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',\n deviceMemoryGB: 8,\n hardwareConcurrency: 24,\n colorDepth: 24,\n devicePixelRatio: 1.0,\n};\n\n// ─── Randomization Pools ─────────────────────────────────────────────────────\n// These pools are available for callers who want to build a custom BrowserProfile.\n//\n// WARNING: Randomizing gpuRenderer without also changing the static canvas hashes\n// (fields 13 and 18 in the token) creates an impossible fingerprint — different GPUs\n// produce different canvas renderings. Twitter cross-references these, so a mismatch\n// triggers 399 bot-detection errors. Until we have per-GPU canvas hashes, the default\n// profile uses a fixed GPU + matching canvas hashes. Only override gpuRenderer if you\n// also supply matching canvas fingerprints.\n\n/** Common desktop screen resolutions (width, height, available height with taskbar) */\nconst SCREEN_RESOLUTIONS = [\n { w: 1920, h: 1080, ah: 1032 },\n { w: 2560, h: 1440, ah: 1392 },\n { w: 1366, h: 768, ah: 720 },\n { w: 1536, h: 864, ah: 816 },\n { w: 1440, h: 900, ah: 852 },\n { w: 1680, h: 1050, ah: 1002 },\n { w: 3840, h: 2160, ah: 2112 },\n];\n\n/** Common WebGL ANGLE renderer strings for Chrome on Windows.\n * Not used by default — see WARNING above about canvas hash correlation. */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst GPU_RENDERERS = [\n 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (AMD, AMD Radeon RX 580 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n 'ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)',\n];\n\n/** navigator.deviceMemory values reported by Chrome (in GB) */\nconst DEVICE_MEMORY_VALUES = [4, 8, 8, 16]; // 8 weighted more heavily\n\n/** navigator.hardwareConcurrency values */\nconst HARDWARE_CONCURRENCY_VALUES = [4, 8, 8, 12, 16, 24];\n\n/**\n * Generate a randomized browser profile by picking values from realistic pools.\n *\n * **Caution:** GPU renderer is NOT randomized because the canvas fingerprint\n * hashes in the token are static and correspond to the DEFAULT_PROFILE GPU.\n * Mismatching GPU + canvas hashes triggers Twitter 399 bot-detection errors.\n * Screen resolution, device memory, and CPU cores are safe to randomize since\n * they don't affect canvas rendering.\n */\nexport function randomizeBrowserProfile(): BrowserProfile {\n const screen = SCREEN_RESOLUTIONS[randInt(0, SCREEN_RESOLUTIONS.length - 1)];\n return {\n ...DEFAULT_PROFILE,\n screenWidth: screen.w,\n screenHeight: screen.h,\n availableWidth: screen.w,\n availableHeight: screen.ah,\n // gpuRenderer intentionally NOT randomized — see JSDoc above\n deviceMemoryGB:\n DEVICE_MEMORY_VALUES[randInt(0, DEVICE_MEMORY_VALUES.length - 1)],\n hardwareConcurrency:\n HARDWARE_CONCURRENCY_VALUES[\n randInt(0, HARDWARE_CONCURRENCY_VALUES.length - 1)\n ],\n };\n}\n\n// ─── Utility Functions ───────────────────────────────────────────────────────\n\nfunction getRandomBytes(n: number): Uint8Array {\n const buf = new Uint8Array(n);\n if (\n typeof globalThis.crypto !== 'undefined' &&\n globalThis.crypto.getRandomValues\n ) {\n globalThis.crypto.getRandomValues(buf);\n } else {\n for (let i = 0; i < n; i++) buf[i] = Math.floor(Math.random() * 256);\n }\n return buf;\n}\n\nfunction randInt(min: number, max: number): number {\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n\nfunction randFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction concat(...arrays: Uint8Array[]): Uint8Array {\n const len = arrays.reduce((s, a) => s + a.length, 0);\n const out = new Uint8Array(len);\n let off = 0;\n for (const a of arrays) {\n out.set(a, off);\n off += a.length;\n }\n return out;\n}\n\nfunction toHex(input: Uint8Array): string {\n return Array.from(input)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction fromHex(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2)\n out[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n return out;\n}\n\nfunction textEnc(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\n/** Create a Uint8Array from individual byte values */\nfunction u8(...vals: number[]): Uint8Array {\n return new Uint8Array(vals);\n}\n\n/** Encode a 16-bit value as 2 big-endian bytes */\nfunction be16(v: number): Uint8Array {\n return u8((v >>> 8) & 0xff, v & 0xff);\n}\n\n/** Encode a 32-bit value as 4 big-endian bytes */\nfunction be32(v: number): Uint8Array {\n return u8((v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\n\nfunction xorBytes(data: Uint8Array, key: Uint8Array): Uint8Array {\n const out = new Uint8Array(data.length);\n for (let i = 0; i < data.length; i++) out[i] = data[i] ^ key[i % key.length];\n return out;\n}\n\nfunction xorNibbles(nibbles: string, keyNibble: string): string {\n const k = parseInt(keyNibble, 16);\n return nibbles\n .split('')\n .map((n) => (parseInt(n, 16) ^ k).toString(16))\n .join('');\n}\n\nfunction base64url(data: Uint8Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(data).toString('base64url');\n }\n let bin = '';\n for (let i = 0; i < data.length; i++) bin += String.fromCharCode(data[i]);\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ─── XXTEA Encryption ───────────────────────────────────────────────────────\n\n/**\n * Encrypt data using XXTEA (Corrected Block TEA) algorithm.\n * Used for both the overall token encryption and per-field encryption.\n * @internal Exported for testing\n */\nexport function xxteaEncrypt(data: Uint8Array, key: number[]): Uint8Array {\n // Pad to 4-byte boundary\n const padLen = Math.ceil(data.length / 4) * 4;\n const padded = new Uint8Array(padLen);\n padded.set(data);\n\n const n = padLen / 4;\n // Read as little-endian 32-bit words\n const v = new Uint32Array(n);\n for (let i = 0; i < n; i++) {\n v[i] =\n (padded[i * 4] |\n (padded[i * 4 + 1] << 8) |\n (padded[i * 4 + 2] << 16) |\n (padded[i * 4 + 3] << 24)) >>>\n 0;\n }\n\n if (n <= 1) return padded;\n\n const k = new Uint32Array(key.map((x) => x >>> 0));\n const DELTA = 0x9e3779b9;\n const u = n - 1;\n let sum = 0;\n let z = v[u];\n let y: number;\n let rounds = 6 + Math.floor(52 / (u + 1));\n\n while (rounds-- > 0) {\n sum = (sum + DELTA) >>> 0;\n const e = (sum >>> 2) & 3;\n for (let p = 0; p < u; p++) {\n y = v[p + 1];\n const mx =\n ((((z >>> 5) ^ (y << 2)) >>> 0) + (((y >>> 3) ^ (z << 4)) >>> 0)) ^\n (((sum ^ y) >>> 0) + ((k[(p & 3) ^ e] ^ z) >>> 0));\n v[p] = (v[p] + mx) >>> 0;\n z = v[p];\n }\n y = v[0];\n const mx =\n ((((z >>> 5) ^ (y << 2)) >>> 0) + (((y >>> 3) ^ (z << 4)) >>> 0)) ^\n (((sum ^ y) >>> 0) + ((k[(u & 3) ^ e] ^ z) >>> 0));\n v[u] = (v[u] + mx) >>> 0;\n z = v[u];\n }\n\n // Write back as little-endian bytes\n const out = new Uint8Array(n * 4);\n for (let i = 0; i < n; i++) {\n out[i * 4] = v[i] & 0xff;\n out[i * 4 + 1] = (v[i] >>> 8) & 0xff;\n out[i * 4 + 2] = (v[i] >>> 16) & 0xff;\n out[i * 4 + 3] = (v[i] >>> 24) & 0xff;\n }\n return out;\n}\n\n/** Encrypt a fingerprint field's data using per-field XXTEA key */\nfunction fieldEncrypt(\n data: Uint8Array,\n fieldIndex: number,\n initTime: number,\n): Uint8Array {\n return xxteaEncrypt(data, [\n fieldIndex,\n Math.floor(initTime),\n ...PER_FIELD_KEY_TAIL,\n ]);\n}\n\n// ─── Timestamp Encoding ─────────────────────────────────────────────────────\n\n/** @internal Exported for testing */\nexport function encodeTimestampBytes(ms: number): Uint8Array {\n let t = Math.floor(ms / 1000 - TS_EPOCH);\n t = Math.max(Math.min(t, 268435455), 0); // Clamp to 28-bit unsigned\n return be32(t);\n}\n\nfunction xorAndAppendKey(buf: Uint8Array, key: number): string {\n const hex = toHex(buf);\n const keyNib = (key & 0xf).toString(16);\n return xorNibbles(hex.substring(1), keyNib) + keyNib;\n}\n\nfunction encodeTimestampEncrypted(ms: number): string {\n const tsBytes = encodeTimestampBytes(ms);\n const slice = Math.floor(ms) % 1000;\n const sliceBytes = be16(slice);\n const k = randInt(0, 15);\n return xorAndAppendKey(tsBytes, k) + xorAndAppendKey(sliceBytes, k);\n}\n\n// ─── Key Derivation ─────────────────────────────────────────────────────────\n\n/**\n * Derive an XOR key from a hex string by slicing, rotating, and XOR-ing.\n * Used for the two-layer XOR encryption of fingerprint data.\n */\n/**\n * @internal Exported for testing only.\n */\nexport function deriveAndXor(\n keyHex: string,\n sliceLen: number,\n rotChar: string,\n data: Uint8Array,\n): Uint8Array {\n const sub = keyHex.substring(0, sliceLen).split('');\n if (sub.length === 0) return data;\n const rot = parseInt(rotChar, 16) % sub.length;\n const rotated = sub.slice(rot).concat(sub.slice(0, rot)).join('');\n return xorBytes(data, fromHex(rotated));\n}\n\n// ─── Custom Float Encoding ──────────────────────────────────────────────────\n\n/**\n * Encode a floating-point value into a compact format with configurable\n * exponent and mantissa bit widths. Used for behavioral metric encoding.\n */\n/** @internal Exported for testing */\nexport function customFloatEncode(\n expBits: number,\n manBits: number,\n value: number,\n): number {\n if (value === 0) return 0;\n let n = Math.abs(value);\n let exp = 0;\n while (2 <= n) {\n n /= 2;\n exp++;\n }\n while (n < 1 && n > 0) {\n n *= 2;\n exp--;\n }\n exp = Math.min(exp, (1 << expBits) - 1);\n const frac = n - Math.floor(n);\n let mantissa = 0;\n if (frac > 0) {\n let pos = 1;\n let tmp = frac;\n while (tmp !== 0 && pos <= manBits) {\n tmp *= 2;\n const bit = Math.floor(tmp);\n mantissa |= bit << (manBits - pos);\n tmp -= bit;\n pos++;\n }\n }\n return (exp << manBits) | mantissa;\n}\n\n/**\n * Encode a behavioral float value for the token.\n * Values 0-15 use a 2-bit exponent / 4-bit mantissa format.\n * Values > 15 use a 4-bit exponent / 3-bit mantissa format.\n */\n/** @internal Exported for testing */\nexport function encodeFloatVal(v: number): number {\n const n = Math.max(v, 0);\n if (n <= 15) return 64 | customFloatEncode(2, 4, n + 1);\n return 128 | customFloatEncode(4, 3, n - 14);\n}\n\n// ─── Field Serialization ────────────────────────────────────────────────────\n\n/**\n * Serialize a single fingerprint field into its binary representation.\n *\n * Format: [header byte] [optional body bytes]\n * Header: upper 5 bits = field index, lower 3 bits = encoding type\n *\n * @param index - Field index (0-31) within the fingerprint part\n * @param encoding - How the value should be serialized\n * @param val - The field value (number or byte array)\n * @param initTime - Init timestamp (required for EncryptedBytes encoding)\n */\n/** @internal Exported for testing */\nexport function encodeField(\n index: number,\n encoding: FieldEncoding,\n val: number | Uint8Array,\n initTime?: number,\n): Uint8Array {\n // Header byte: field index in upper 5 bits, encoding type in lower 3 bits\n // Note: FieldEncoding.Empty = -1, and 7 & -1 = 7 in JS bitwise\n const hdr = u8(((31 & index) << 3) | (7 & encoding));\n\n if (encoding === FieldEncoding.Empty || encoding === FieldEncoding.Marker)\n return hdr;\n\n let body: Uint8Array;\n switch (encoding) {\n case FieldEncoding.Byte:\n body = u8(val as number);\n break;\n case FieldEncoding.RoundedByte:\n body = u8(Math.round(val as number));\n break;\n case FieldEncoding.CompactInt: {\n const v = val as number;\n body = v <= 127 ? u8(v) : be16((1 << 15) | (32767 & v));\n break;\n }\n case FieldEncoding.EncryptedBytes: {\n if (initTime == null) {\n throw new Error('initTime is required for EncryptedBytes encoding');\n }\n const enc = fieldEncrypt(val as Uint8Array, index, initTime);\n body = concat(u8(enc.length), enc);\n break;\n }\n case FieldEncoding.RawAppend:\n body = val instanceof Uint8Array ? val : u8(val as number);\n break;\n default:\n body = new Uint8Array(0);\n }\n return concat(hdr, body);\n}\n\n// ─── Bit Encoding Helpers ───────────────────────────────────────────────────\n\n/** Pack a list of set-bit positions into a fixed-size byte array (big-endian) */\nfunction encodeBits(bits: number[], byteSize: number): Uint8Array {\n const numBytes = byteSize / 8;\n const arr = new Uint8Array(numBytes);\n for (const bit of bits) {\n const bi = numBytes - 1 - Math.floor(bit / 8);\n if (bi >= 0 && bi < numBytes) arr[bi] |= 1 << bit % 8;\n }\n return arr;\n}\n\n/**\n * Encode screen dimensions. If screen and available dimensions match,\n * uses a compact 2-byte form with high bit set; otherwise 4 bytes.\n */\nfunction screenDimBytes(screen: number, avail: number): Uint8Array {\n const r = 32767 & screen;\n const e = 65535 & avail;\n return r === e ? be16(32768 | r) : concat(be16(r), be16(e));\n}\n\n/** Convert boolean array to a packed integer bitfield */\nfunction boolsToBin(arr: boolean[], totalBits: number): number {\n const e = arr.length > totalBits ? arr.slice(0, totalBits) : arr;\n const c = e.length;\n let r = 0;\n for (let i = c - 1; i >= 0; i--) {\n if (e[i]) r |= 1 << (c - i - 1);\n }\n if (c < totalBits) r <<= totalBits - c;\n return r;\n}\n\n// ─── Codec Playability ──────────────────────────────────────────────────────\n\n/**\n * Encode media codec support as a 2-byte bitfield.\n * Values: 0 = unsupported, 1 = maybe, 2 = probably\n */\nfunction encodeCodecPlayability(): Uint8Array {\n const codecs = {\n webm: 2, // VP8/VP9\n mp4: 2, // H.264\n ogg: 0, // Theora (Chrome dropped support)\n aac: 2, // AAC audio\n xm4a: 1, // M4A container\n wav: 2, // PCM audio\n mpeg: 2, // MP3 audio\n ogg2: 2, // Vorbis audio\n };\n const bits = Object.values(codecs)\n .map((c) => c.toString(2).padStart(2, '0'))\n .join('');\n return be16(parseInt(bits, 2));\n}\n\n// ─── Timezone Utilities ─────────────────────────────────────────────────────\n\n/** Known timezone enum values for compact encoding in fingerprint Part 2 */\nconst TIMEZONE_ENUM: Record<string, number> = {\n 'America/New_York': 0,\n 'America/Sao_Paulo': 1,\n 'America/Chicago': 2,\n 'America/Los_Angeles': 3,\n 'America/Mexico_City': 4,\n 'Asia/Shanghai': 5,\n};\n\n/**\n * Compute timezone offset and DST difference for fingerprinting.\n * Returns values as (minutes / 15) encoded as unsigned bytes.\n */\nfunction getTimezoneInfo(tz: string): { offset: number; dstDiff: number } {\n const knownOffsets: Record<string, { offset: number; dstDiff: number }> = {\n 'America/New_York': { offset: 20, dstDiff: 4 },\n 'America/Chicago': { offset: 24, dstDiff: 4 },\n 'America/Los_Angeles': { offset: 32, dstDiff: 4 },\n 'America/Denver': { offset: 28, dstDiff: 4 },\n 'America/Sao_Paulo': { offset: 12, dstDiff: 4 },\n 'America/Mexico_City': { offset: 24, dstDiff: 4 },\n 'Asia/Shanghai': { offset: 246, dstDiff: 0 },\n 'Asia/Tokyo': { offset: 220, dstDiff: 0 },\n 'Europe/London': { offset: 0, dstDiff: 4 },\n 'Europe/Berlin': { offset: 252, dstDiff: 4 },\n UTC: { offset: 0, dstDiff: 0 },\n };\n\n try {\n const now = new Date();\n const jan = new Date(now.getFullYear(), 0, 1);\n const jul = new Date(now.getFullYear(), 6, 1);\n\n const getOffset = (date: Date, zone: string) => {\n const utc = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));\n const local = new Date(date.toLocaleString('en-US', { timeZone: zone }));\n return (utc.getTime() - local.getTime()) / 60000;\n };\n\n const currentOffset = getOffset(now, tz);\n const janOffset = getOffset(jan, tz);\n const julOffset = getOffset(jul, tz);\n const dstDifference = Math.abs(janOffset - julOffset);\n\n return {\n offset: Math.floor(currentOffset / 15) & 0xff,\n dstDiff: Math.floor(dstDifference / 15) & 0xff,\n };\n } catch {\n return knownOffsets[tz] || { offset: 20, dstDiff: 4 };\n }\n}\n\n// ─── Fingerprint Part 1: Device & Rendering ─────────────────────────────────\n\n/**\n * Build device/rendering fingerprint fields (Part 1).\n * Contains hardware info, screen dimensions, browser features,\n * canvas/WebGL render hashes, and the user agent string.\n */\nfunction buildDeviceFingerprint(\n initTime: number,\n profile: BrowserProfile,\n userAgent: string,\n): Uint8Array {\n const tz = getTimezoneInfo(profile.timezone);\n const { Byte, EncryptedBytes, CompactInt, RoundedByte, RawAppend } =\n FieldEncoding;\n\n // Field 12 (user agent) uses manual XXTEA encryption with RawAppend\n const encryptedUA = fieldEncrypt(textEnc(userAgent), 12, initTime);\n const uaPayload = concat(u8(1), u8(encryptedUA.length), encryptedUA);\n\n const fields: Uint8Array[] = [\n encodeField(0, Byte, 1), // Platform: Win32\n encodeField(1, Byte, 0), // Vendor: Google Inc.\n encodeField(2, EncryptedBytes, textEnc(profile.locale), initTime), // Locale\n encodeField(3, RoundedByte, profile.deviceMemoryGB * 10), // Device memory (GB * 10)\n encodeField(\n 4,\n RawAppend,\n concat(\n // Screen dimensions (width + height)\n screenDimBytes(profile.screenWidth, profile.availableWidth),\n screenDimBytes(profile.screenHeight, profile.availableHeight),\n ),\n ),\n encodeField(5, CompactInt, profile.colorDepth), // Screen color depth\n encodeField(6, CompactInt, profile.hardwareConcurrency), // CPU logical cores\n encodeField(7, RoundedByte, profile.devicePixelRatio * 10), // Pixel ratio (* 10)\n encodeField(8, RawAppend, u8(tz.offset, tz.dstDiff)), // Timezone offset info\n // MIME type hash — captured from Chrome 144 on Windows 10.\n // Source: yubie-re/castleio-gen (Python SDK, MIT license).\n encodeField(9, RawAppend, u8(0x02, 0x7d, 0x5f, 0xc9, 0xa7)),\n // Browser plugins hash — Chrome no longer exposes plugins to navigator.plugins,\n // so this is a fixed hash. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n encodeField(10, RawAppend, u8(0x05, 0x72, 0x93, 0x02, 0x08)),\n encodeField(\n 11,\n RawAppend, // Browser feature flags\n concat(u8(12), encodeBits([0, 1, 2, 3, 4, 5, 6], 16)),\n ),\n encodeField(12, RawAppend, uaPayload), // User agent (encrypted)\n // Canvas font rendering hash — generated by Castle.io SDK's canvas fingerprinting (text rendering).\n // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n encodeField(13, EncryptedBytes, textEnc('54b4b5cf'), initTime),\n encodeField(\n 14,\n RawAppend, // Media input devices\n concat(u8(3), encodeBits([0, 1, 2], 8)),\n ),\n // Fields 15 (DoNotTrack) and 16 (JavaEnabled) intentionally omitted\n encodeField(17, Byte, 0), // productSub type\n // Canvas circle rendering hash — generated by Castle.io SDK's canvas fingerprinting (arc drawing).\n // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n encodeField(18, EncryptedBytes, textEnc('c6749e76'), initTime),\n encodeField(19, EncryptedBytes, textEnc(profile.gpuRenderer), initTime), // WebGL renderer\n encodeField(\n 20,\n EncryptedBytes, // Epoch locale string\n textEnc('12/31/1969, 7:00:00 PM'),\n initTime,\n ),\n encodeField(\n 21,\n RawAppend, // WebDriver flags (none set)\n concat(u8(8), encodeBits([], 8)),\n ),\n encodeField(22, CompactInt, 33), // eval.toString() length\n // Field 23 (navigator.buildID) intentionally omitted (Chrome doesn't have it)\n encodeField(24, CompactInt, 12549), // Max recursion depth\n encodeField(25, Byte, 0), // Recursion error message type\n encodeField(26, Byte, 1), // Recursion error name type\n encodeField(27, CompactInt, 4644), // Stack trace string length\n encodeField(28, RawAppend, u8(0x00)), // Touch support metric\n encodeField(29, Byte, 3), // Undefined call error type\n // Navigator properties hash — hash of enumerable navigator property names.\n // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n encodeField(30, RawAppend, u8(0x5d, 0xc5, 0xab, 0xb5, 0x88)),\n encodeField(31, RawAppend, encodeCodecPlayability()), // Codec playability\n ];\n\n const data = concat(...fields);\n const sizeIdx = ((7 & FP_PART.DEVICE) << 5) | (31 & fields.length);\n return concat(u8(sizeIdx), data);\n}\n\n// ─── Fingerprint Part 2: Browser Environment ────────────────────────────────\n\n/**\n * Build browser environment fingerprint (Part 2).\n * Contains timezone, language info, Chrome-specific feature flags,\n * and various browser environment checks.\n */\nfunction buildBrowserFingerprint(\n profile: BrowserProfile,\n initTime: number,\n): Uint8Array {\n const { Byte, EncryptedBytes, CompactInt, Marker, RawAppend } = FieldEncoding;\n\n // Use compact enum encoding for known timezones, encrypted string otherwise\n const timezoneField =\n profile.timezone in TIMEZONE_ENUM\n ? encodeField(1, Byte, TIMEZONE_ENUM[profile.timezone])\n : encodeField(1, EncryptedBytes, textEnc(profile.timezone), initTime);\n\n const fields: Uint8Array[] = [\n encodeField(0, Byte, 0), // Constant marker\n timezoneField, // Timezone\n encodeField(\n 2,\n EncryptedBytes, // Language list\n textEnc(`${profile.locale},${profile.language}`),\n initTime,\n ),\n encodeField(6, CompactInt, 0), // Expected property count\n encodeField(\n 10,\n RawAppend, // Castle data bitfield\n concat(u8(4), encodeBits([1, 2, 3], 8)),\n ),\n encodeField(12, CompactInt, 80), // Negative error string length\n encodeField(13, RawAppend, u8(9, 0, 0)), // Driver check values\n encodeField(\n 17,\n RawAppend, // Chrome feature flags\n concat(u8(0x0d), encodeBits([1, 5, 8, 9, 10], 16)),\n ),\n encodeField(18, Marker, 0), // Device logic expected\n encodeField(21, RawAppend, u8(0, 0, 0, 0)), // Class properties count\n encodeField(22, EncryptedBytes, textEnc(profile.locale), initTime), // User locale (secondary)\n encodeField(\n 23,\n RawAppend, // Worker capabilities\n concat(u8(2), encodeBits([0], 8)),\n ),\n encodeField(\n 24,\n RawAppend, // Inner/outer dimension diff\n concat(be16(0), be16(randInt(10, 30))),\n ),\n ];\n\n const data = concat(...fields);\n const sizeIdx = ((7 & FP_PART.BROWSER) << 5) | (31 & fields.length);\n return concat(u8(sizeIdx), data);\n}\n\n// ─── Fingerprint Part 3: Timing ─────────────────────────────────────────────\n\n/**\n * Build timing fingerprint (Part 3).\n * Contains Castle SDK initialization timing data.\n */\nfunction buildTimingFingerprint(initTime: number): Uint8Array {\n const minute = new Date(initTime).getUTCMinutes();\n\n const fields: Uint8Array[] = [\n encodeField(3, FieldEncoding.CompactInt, 1), // Time since window.open (ms)\n encodeField(4, FieldEncoding.CompactInt, minute), // Castle init time (minutes)\n ];\n\n const data = concat(...fields);\n const sizeIdx = ((7 & FP_PART.TIMING) << 5) | (31 & fields.length);\n return concat(u8(sizeIdx), data);\n}\n\n// ─── Event Log ──────────────────────────────────────────────────────────────\n\n/** DOM event type IDs used in the simulated event log */\nconst EventType = {\n CLICK: 0,\n FOCUS: 5,\n BLUR: 6,\n ANIMATIONSTART: 18,\n MOUSEMOVE: 21,\n MOUSELEAVE: 25,\n MOUSEENTER: 26,\n RESIZE: 27,\n} as const;\n\n/** Flag bit set on events that include a target element ID */\nconst HAS_TARGET_FLAG = 128;\n\n/** Target element ID for \"unknown element\" */\nconst TARGET_UNKNOWN = 63;\n\n/**\n * Generate a simulated DOM event log.\n * Produces a realistic-looking sequence of mouse, keyboard, and focus events.\n */\nfunction generateEventLog(): Uint8Array {\n const simpleEvents = [\n EventType.MOUSEMOVE,\n EventType.ANIMATIONSTART,\n EventType.MOUSELEAVE,\n EventType.MOUSEENTER,\n EventType.RESIZE,\n ];\n const targetedEvents: number[] = [\n EventType.CLICK,\n EventType.BLUR,\n EventType.FOCUS,\n ];\n const allEvents = [...simpleEvents, ...targetedEvents];\n\n const count = randInt(30, 70);\n const eventBytes: number[] = [];\n\n for (let i = 0; i < count; i++) {\n const eventId = allEvents[randInt(0, allEvents.length - 1)];\n if (targetedEvents.includes(eventId)) {\n eventBytes.push(eventId | HAS_TARGET_FLAG);\n eventBytes.push(TARGET_UNKNOWN);\n } else {\n eventBytes.push(eventId);\n }\n }\n\n // Format: [2-byte total length] [0x00] [2-byte event count] [event bytes...]\n const inner = concat(u8(0), be16(count), new Uint8Array(eventBytes));\n return concat(be16(inner.length), inner);\n}\n\n// ─── Behavioral Metrics ─────────────────────────────────────────────────────\n\n/**\n * Build the behavioral bitfield indicating which input types were detected.\n * Simulates a user who used mouse and keyboard (no touch).\n */\nfunction buildBehavioralBitfield(): Uint8Array {\n // 15 flags with totalBits=16: the extra bit causes a left-shift-by-1 in boolsToBin,\n // matching the Python SDK's behavior where the MSB is always 0.\n const flags = new Array(15).fill(false);\n flags[2] = true; // Has click events\n flags[3] = true; // Has keydown events\n flags[5] = true; // Has backspace key\n flags[6] = true; // Not a touch device\n flags[9] = true; // Has mouse movement\n flags[11] = true; // Has focus events\n flags[12] = true; // Has scroll events\n\n const packedBits = boolsToBin(flags, 16);\n // Encode with type prefix: (6 << 20) | (2 << 16) | value\n const encoded = (6 << 20) | (2 << 16) | (65535 & packedBits);\n return u8((encoded >>> 16) & 0xff, (encoded >>> 8) & 0xff, encoded & 0xff);\n}\n\n/** Sentinel: metric not available (e.g., touch metrics on desktop) */\nconst NO_DATA = -1;\n\n/**\n * Generate simulated behavioral float metrics.\n * Each value represents a statistical measurement of user input patterns\n * (mouse movement angles, key timing, click durations, etc.)\n */\nfunction buildFloatMetrics(): Uint8Array {\n // NO_DATA (-1) encodes as 0x00 (metric not available)\n const metrics: number[] = [\n // ── Mouse & key timing ──\n randFloat(40, 50), // 0: Mouse angle vector mean\n NO_DATA, // 1: Touch angle vector (no touch device)\n randFloat(70, 80), // 2: Key same-time difference\n NO_DATA, // 3: (unused)\n randFloat(60, 70), // 4: Mouse down-to-up time mean\n NO_DATA, // 5: (unused)\n 0, // 6: (zero placeholder)\n 0, // 7: Mouse click time difference\n\n // ── Duration distributions ──\n randFloat(60, 80), // 8: Mouse down-up duration median\n randFloat(5, 10), // 9: Mouse down-up duration std deviation\n randFloat(30, 40), // 10: Key press duration median\n randFloat(2, 5), // 11: Key press duration std deviation\n\n // ── Touch metrics (all disabled for desktop) ──\n NO_DATA,\n NO_DATA,\n NO_DATA,\n NO_DATA, // 12-15\n NO_DATA,\n NO_DATA,\n NO_DATA,\n NO_DATA, // 16-19\n\n // ── Mouse trajectory analysis ──\n randFloat(150, 180), // 20: Mouse movement angle mean\n randFloat(3, 6), // 21: Mouse movement angle std deviation\n randFloat(150, 180), // 22: Mouse movement angle mean (500ms window)\n randFloat(3, 6), // 23: Mouse movement angle std (500ms window)\n randFloat(0, 2), // 24: Mouse position deviation X\n randFloat(0, 2), // 25: Mouse position deviation Y\n 0,\n 0, // 26-27: (zero placeholders)\n\n // ── Touch sequential/gesture metrics (disabled) ──\n NO_DATA,\n NO_DATA, // 28-29\n NO_DATA,\n NO_DATA, // 30-31\n\n // ── Key pattern analysis ──\n 0,\n 0, // 32-33: Letter-digit transition ratio\n 0,\n 0, // 34-35: Digit-invalid transition ratio\n 0,\n 0, // 36-37: Double-invalid transition ratio\n\n // ── Mouse vector differences ──\n 1.0,\n 0, // 38-39: Mouse vector diff (mean, std)\n 1.0,\n 0, // 40-41: Mouse vector diff 2 (mean, std)\n randFloat(0, 4), // 42: Mouse vector diff (500ms mean)\n randFloat(0, 3), // 43: Mouse vector diff (500ms std)\n\n // ── Rounded movement metrics ──\n randFloat(25, 50), // 44: Mouse time diff (rounded mean)\n randFloat(25, 50), // 45: Mouse time diff (rounded std)\n randFloat(25, 50), // 46: Mouse vector diff (rounded mean)\n randFloat(25, 30), // 47: Mouse vector diff (rounded std)\n\n // ── Speed change analysis ──\n randFloat(0, 2), // 48: Mouse speed change mean\n randFloat(0, 1), // 49: Mouse speed change std\n randFloat(0, 1), // 50: Mouse vector 500ms aggregate\n\n // ── Trailing ──\n 1, // 51: Universal flag\n 0, // 52: Terminator\n ];\n\n const out = new Uint8Array(metrics.length);\n for (let i = 0; i < metrics.length; i++) {\n out[i] = metrics[i] === NO_DATA ? 0 : encodeFloatVal(metrics[i]);\n }\n return out;\n}\n\n/**\n * Generate simulated event count integers.\n * Each value represents how many times a specific DOM event type occurred.\n */\nfunction buildEventCounts(): Uint8Array {\n const counts: number[] = [\n randInt(100, 200), // 0: mousemove events\n randInt(1, 5), // 1: keyup events\n randInt(1, 5), // 2: click events\n 0, // 3: touchstart events (none on desktop)\n randInt(0, 5), // 4: keydown events\n 0, // 5: touchmove events (none)\n 0, // 6: mousedown-mouseup pairs\n 0, // 7: vector diff samples\n randInt(0, 5), // 8: wheel events\n randInt(0, 11), // 9: (internal counter)\n randInt(0, 1), // 10: (internal counter)\n ];\n // Append the count of entries as a trailing byte\n return concat(new Uint8Array(counts), u8(counts.length));\n}\n\n/** Combine all behavioral metrics into a single byte sequence */\nfunction buildBehavioralData(): Uint8Array {\n return concat(\n buildBehavioralBitfield(),\n buildFloatMetrics(),\n buildEventCounts(),\n );\n}\n\n// ─── Token Assembly ─────────────────────────────────────────────────────────\n\nfunction buildTokenHeader(\n uuid: string,\n publisherKey: string,\n initTime: number,\n): Uint8Array {\n const timestamp = fromHex(encodeTimestampEncrypted(initTime));\n const version = be16(SDK_VERSION);\n const pkBytes = textEnc(publisherKey);\n const uuidBytes = fromHex(uuid);\n return concat(timestamp, version, pkBytes, uuidBytes);\n}\n\n/**\n * Generate a Castle.io v11 token for Twitter's login flow.\n *\n * The token embeds a simulated browser fingerprint and behavioral data,\n * encrypted with XXTEA and layered XOR, to satisfy Twitter's anti-bot\n * checks during the login flow.\n *\n * @param userAgent - The user agent string to embed in the fingerprint.\n * Should match the UA used for HTTP requests.\n * @returns Object with `token` (the Castle request token) and `cuid` (for __cuid cookie)\n */\nexport function generateLocalCastleToken(\n userAgent: string,\n profileOverride?: Partial<BrowserProfile>,\n): {\n token: string;\n cuid: string;\n} {\n const now = Date.now();\n // Use the known-good DEFAULT_PROFILE as base. Randomization is opt-in because\n // the static canvas hashes (fields 13, 18) must match the GPU renderer — see\n // randomizeBrowserProfile() JSDoc for details.\n const profile = { ...DEFAULT_PROFILE, ...profileOverride };\n\n // Simulate page load: init_time is 2-30 minutes before current time\n const initTime = now - randFloat(2 * 60 * 1000, 30 * 60 * 1000);\n\n log('Generating local Castle.io v11 token');\n\n // ── Step 1: Collect fingerprint data ──\n const deviceFp = buildDeviceFingerprint(initTime, profile, userAgent);\n const browserFp = buildBrowserFingerprint(profile, initTime);\n const timingFp = buildTimingFingerprint(initTime);\n const eventLog = generateEventLog();\n const behavioral = buildBehavioralData();\n\n // Concatenate all parts with 0xFF terminator\n const fingerprintData = concat(\n deviceFp,\n browserFp,\n timingFp,\n eventLog,\n behavioral,\n u8(0xff),\n );\n\n // ── Step 2: First XOR layer (timestamp-derived key) ──\n const sendTime = Date.now();\n const timestampKey = encodeTimestampEncrypted(sendTime);\n const xorPass1 = deriveAndXor(\n timestampKey,\n 4,\n timestampKey[3],\n fingerprintData,\n );\n\n // ── Step 3: Second XOR layer (UUID-derived key) ──\n const tokenUuid = toHex(getRandomBytes(16));\n const withTimestampPrefix = concat(fromHex(timestampKey), xorPass1);\n const xorPass2 = deriveAndXor(\n tokenUuid,\n 8,\n tokenUuid[9],\n withTimestampPrefix,\n );\n\n // ── Step 4: Build header (timestamp, SDK version, publisher key, UUID) ──\n const header = buildTokenHeader(tokenUuid, TWITTER_CASTLE_PK, initTime);\n\n // ── Step 5: XXTEA encrypt the full payload ──\n const plaintext = concat(header, xorPass2);\n const encrypted = xxteaEncrypt(plaintext, XXTEA_KEY);\n\n // ── Step 6: Prepend version and padding info ──\n const paddingBytes = encrypted.length - plaintext.length;\n const versioned = concat(u8(TOKEN_VERSION, paddingBytes), encrypted);\n\n // ── Step 7: Random-byte XOR + length checksum ──\n const randomByte = getRandomBytes(1)[0];\n const checksum = (versioned.length * 2) & 0xff;\n const withChecksum = concat(versioned, u8(checksum));\n const xored = xorBytes(withChecksum, u8(randomByte));\n const finalPayload = concat(u8(randomByte), xored);\n\n // ── Step 8: Base64URL encode ──\n const token = base64url(finalPayload);\n\n log(\n `Generated castle token: ${token.length} chars, cuid: ${tokenUuid.substring(\n 0,\n 6,\n )}...`,\n );\n\n return { token, cuid: tokenUuid };\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:requests');\n\n/**\n * Updates a cookie jar with the Set-Cookie headers from the provided Headers instance.\n * @param cookieJar The cookie jar to update.\n * @param headers The response headers to populate the cookie jar with.\n */\nexport async function updateCookieJar(\n cookieJar: CookieJar,\n headers: Headers | HeadersPolyfill,\n) {\n // Try to use getSetCookie() if available (proper way to get all set-cookie headers)\n let setCookieHeaders: string[] = [];\n\n if (typeof headers.getSetCookie === 'function') {\n setCookieHeaders = headers.getSetCookie();\n } else {\n // Fallback: get the single set-cookie header\n const setCookieHeader = headers.get('set-cookie');\n if (setCookieHeader) {\n // Split combined set-cookie headers\n setCookieHeaders = setCookie.splitCookiesString(setCookieHeader);\n }\n }\n\n if (setCookieHeaders.length > 0) {\n for (const cookieStr of setCookieHeaders) {\n const cookie = Cookie.parse(cookieStr);\n if (!cookie) {\n log(`Failed to parse cookie: ${cookieStr.substring(0, 100)}`);\n continue;\n }\n\n // Skip cookies that are being explicitly deleted (Max-Age=0 or expired)\n // This prevents twitter from clearing important cookies like ct0\n if (\n cookie.maxAge === 0 ||\n (cookie.expires && cookie.expires < new Date())\n ) {\n if (cookie.key === 'ct0') {\n log(`Skipping deletion of ct0 cookie (Max-Age=0)`);\n }\n continue;\n }\n\n try {\n const url = `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${\n cookie.path\n }`;\n await cookieJar.setCookie(cookie, url);\n if (cookie.key === 'ct0') {\n log(\n `Successfully set ct0 cookie with value: ${cookie.value.substring(\n 0,\n 20,\n )}...`,\n );\n }\n } catch (err) {\n // Log cookie setting errors\n log(`Failed to set cookie ${cookie.key}: ${err}`);\n if (cookie.key === 'ct0') {\n log(`FAILED to set ct0 cookie! Error: ${err}`);\n }\n }\n }\n } else if (typeof document !== 'undefined') {\n for (const cookie of document.cookie.split(';')) {\n const hardCookie = Cookie.parse(cookie);\n if (hardCookie) {\n await cookieJar.setCookie(hardCookie, document.location.toString());\n }\n }\n }\n}\n","import debug from 'debug';\n\nconst log = debug('twitter-scraper:xpff');\n\nlet isoCrypto: Crypto | null = null;\n\nasync function getCrypto(): Promise<Crypto> {\n if (isoCrypto != null) {\n return isoCrypto;\n }\n\n // In Node.js, the global `crypto` object is only available from v19.0.0 onwards.\n // For earlier versions, we need to import the 'crypto' module.\n if (typeof crypto === 'undefined') {\n log('Global crypto is undefined, importing from crypto module...');\n const { webcrypto } = await import('crypto');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isoCrypto = webcrypto as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return webcrypto as any;\n }\n isoCrypto = crypto;\n return crypto;\n}\n\nasync function sha256(message: string): Promise<Uint8Array> {\n const msgBuffer = new TextEncoder().encode(message);\n const crypto = await getCrypto();\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n return new Uint8Array(hashBuffer);\n}\n\n// https://stackoverflow.com/a/40031979\nfunction buf2hex(buffer: ArrayBuffer): string {\n return [...new Uint8Array(buffer)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// Adapted from https://github.com/dsekz/twitter-x-xp-forwarded-for-header\nexport class XPFFHeaderGenerator {\n constructor(private readonly seed: string) {}\n\n private async deriveKey(guestId: string): Promise<Uint8Array> {\n const combined = `${this.seed}${guestId}`;\n const result = await sha256(combined);\n return result;\n }\n\n async generateHeader(plaintext: string, guestId: string): Promise<string> {\n log(`Generating XPFF key for guest ID: ${guestId}`);\n const key = await this.deriveKey(guestId);\n const crypto = await getCrypto();\n const nonce = crypto.getRandomValues(new Uint8Array(12));\n const cipher = await crypto.subtle.importKey(\n 'raw',\n key as BufferSource,\n { name: 'AES-GCM' },\n false,\n ['encrypt'],\n );\n const encrypted = await crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: nonce,\n },\n cipher,\n new TextEncoder().encode(plaintext),\n );\n\n // Combine nonce and encrypted data\n const combined = new Uint8Array(nonce.length + encrypted.byteLength);\n combined.set(nonce);\n combined.set(new Uint8Array(encrypted), nonce.length);\n const result = buf2hex(combined.buffer);\n\n log(`XPFF header generated for guest ID ${guestId}: ${result}`);\n\n return result;\n }\n}\n\nconst xpffBaseKey =\n '0e6be1f1e21ffc33590b888fd4dc81b19713e570e805d4e5df80a493c9571a05';\n\nfunction xpffPlain(): string {\n const timestamp = Date.now();\n return JSON.stringify({\n navigator_properties: {\n hasBeenActive: 'true',\n userAgent:\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',\n webdriver: 'false',\n },\n created_at: timestamp,\n });\n}\n\nexport async function generateXPFFHeader(guestId: string): Promise<string> {\n const generator = new XPFFHeaderGenerator(xpffBaseKey);\n const plaintext = xpffPlain();\n return generator.generateHeader(plaintext, guestId);\n}\n","import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport fetch from 'cross-fetch';\nimport {\n CHROME_SEC_CH_UA,\n CHROME_USER_AGENT,\n FetchTransformOptions,\n flexParseJson,\n} from './api';\nimport type { BrowserProfile } from './castle';\nimport {\n RateLimitEvent,\n RateLimitStrategy,\n WaitingRateLimitStrategy,\n} from './rate-limit';\nimport { AuthenticationError } from './errors';\nimport debug from 'debug';\nimport { generateXPFFHeader } from './xpff';\n\nconst log = debug('twitter-scraper:auth');\n\nexport interface TwitterAuthOptions {\n fetch: typeof fetch;\n transform: Partial<FetchTransformOptions>;\n rateLimitStrategy: RateLimitStrategy;\n experimental: {\n xClientTransactionId?: boolean;\n xpff?: boolean;\n /**\n * Delay in milliseconds between login flow steps, to mimic human-like timing.\n * Without a delay, Twitter may flag rapid-fire requests as bot activity (error 399).\n * Set to 0 to disable (e.g. in tests). Default is 1-3 seconds (average ~2s) with random jitter.\n */\n flowStepDelay?: number;\n /**\n * Override the browser profile used for Castle.io fingerprint token generation.\n * Unspecified fields are randomized from realistic value pools.\n * Set this if you want a consistent fingerprint or need to match specific hardware.\n */\n browserProfile?: Partial<BrowserProfile>;\n };\n}\n\nexport interface TwitterAuth {\n fetch: typeof fetch;\n\n /**\n * How to behave when being rate-limited.\n * @param event The event information.\n */\n onRateLimit(event: RateLimitEvent): Promise<void>;\n\n /**\n * Returns the current cookie jar.\n */\n cookieJar(): CookieJar;\n\n /**\n * Returns the current cookies.\n */\n getCookies(): Promise<Cookie[]>;\n\n /**\n * Returns if a user is logged-in to Twitter through this instance.\n * @returns `true` if a user is logged-in; otherwise `false`.\n */\n isLoggedIn(): Promise<boolean>;\n\n /**\n * Logs into a Twitter account.\n * @param username The username to log in with.\n * @param password The password to log in with.\n * @param email The email to log in with, if you have email confirmation enabled.\n * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n */\n login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void>;\n\n /**\n * Logs out of the current session.\n */\n logout(): Promise<void>;\n\n /**\n * Deletes the current guest token token.\n */\n deleteToken(): void;\n\n /**\n * Returns if the authentication state has a token.\n * @returns `true` if the authentication state has a token; `false` otherwise.\n */\n hasToken(): boolean;\n\n /**\n * Returns the time that authentication was performed.\n * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet.\n */\n authenticatedAt(): Date | null;\n\n /**\n * Installs the authentication information into a headers-like object. If needed, the\n * authentication token will be updated from the API automatically.\n * @param headers A Headers instance representing a request's headers.\n * @param _url The URL being requested (currently unused, reserved for future use).\n * @param bearerTokenOverride Optional bearer token to use instead of the default one.\n */\n installTo(\n headers: Headers,\n _url: string,\n bearerTokenOverride?: string,\n ): Promise<void>;\n}\n\n/**\n * Wraps the provided fetch function with transforms.\n * @param fetchFn The fetch function.\n * @param transform The transform options.\n * @returns The input fetch function, wrapped with the provided transforms.\n */\nfunction withTransform(\n fetchFn: typeof fetch,\n transform?: Partial<FetchTransformOptions>,\n): typeof fetch {\n return async (input, init) => {\n const fetchArgs = (await transform?.request?.(input, init)) ?? [\n input,\n init,\n ];\n const res = await fetchFn(...fetchArgs);\n return (await transform?.response?.(res)) ?? res;\n };\n}\n\n/**\n * A guest authentication token manager. Automatically handles token refreshes.\n */\nexport class TwitterGuestAuth implements TwitterAuth {\n protected bearerToken: string;\n protected jar: CookieJar;\n protected guestToken?: string;\n protected guestCreatedAt?: Date;\n protected rateLimitStrategy: RateLimitStrategy;\n\n fetch: typeof fetch;\n\n constructor(\n bearerToken: string,\n readonly options?: Partial<TwitterAuthOptions>,\n ) {\n this.fetch = withTransform(options?.fetch ?? fetch, options?.transform);\n this.rateLimitStrategy =\n options?.rateLimitStrategy ?? new WaitingRateLimitStrategy();\n this.bearerToken = bearerToken;\n this.jar = new CookieJar();\n }\n\n async onRateLimit(event: RateLimitEvent): Promise<void> {\n await this.rateLimitStrategy.onRateLimit(event);\n }\n\n cookieJar(): CookieJar {\n return this.jar;\n }\n\n isLoggedIn(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n login(_username: string, _password: string, _email?: string): Promise<void> {\n return this.updateGuestToken();\n }\n\n logout(): Promise<void> {\n this.deleteToken();\n this.jar = new CookieJar();\n return Promise.resolve();\n }\n\n deleteToken() {\n delete this.guestToken;\n delete this.guestCreatedAt;\n }\n\n hasToken(): boolean {\n return this.guestToken != null;\n }\n\n authenticatedAt(): Date | null {\n if (this.guestCreatedAt == null) {\n return null;\n }\n\n return new Date(this.guestCreatedAt);\n }\n\n /**\n * Install only authentication credentials (bearer token, guest token, cookies)\n * without browser fingerprint or platform headers. Useful for callers that\n * build their own header set (e.g. the login flow).\n */\n protected async installAuthCredentials(\n headers: Headers,\n bearerTokenOverride?: string,\n ): Promise<void> {\n const tokenToUse = bearerTokenOverride ?? this.bearerToken;\n headers.set('authorization', `Bearer ${tokenToUse}`);\n\n // Only use guest tokens when not overriding the bearer token\n // Guest tokens are tied to the bearer token they were generated with\n if (!bearerTokenOverride) {\n if (this.shouldUpdate()) {\n await this.updateGuestToken();\n }\n\n if (this.guestToken) {\n headers.set('x-guest-token', this.guestToken);\n }\n }\n\n headers.set('cookie', await this.getCookieString());\n }\n\n async installTo(\n headers: Headers,\n url: string,\n bearerTokenOverride?: string,\n ): Promise<void> {\n await this.installAuthCredentials(headers, bearerTokenOverride);\n\n headers.set('user-agent', CHROME_USER_AGENT);\n\n // Standard browser accept headers - required by Twitter API validation\n if (!headers.has('accept')) {\n headers.set('accept', '*/*');\n }\n headers.set('accept-language', 'en-US,en;q=0.9');\n\n headers.set('sec-ch-ua', CHROME_SEC_CH_UA);\n headers.set('sec-ch-ua-mobile', '?0');\n headers.set('sec-ch-ua-platform', '\"Windows\"');\n\n // Referer header - required by Cloudflare for GraphQL endpoints\n headers.set('referer', 'https://x.com/');\n\n // Origin header - required for cross-origin requests from x.com to api.x.com\n headers.set('origin', 'https://x.com');\n\n // Sec-Fetch headers - automatically set by browsers, required for API authentication\n // Since we send requests from x.com origin to api.x.com, these are \"same-site\" (not same-origin)\n headers.set('sec-fetch-site', 'same-site');\n headers.set('sec-fetch-mode', 'cors');\n headers.set('sec-fetch-dest', 'empty');\n\n // Chrome priority hint - present on all API requests\n headers.set('priority', 'u=1, i');\n\n // Set content-type for GraphQL requests if not already set.\n // Only match the known API base URLs (api.x.com and x.com/i/api).\n if (\n !headers.has('content-type') &&\n (url.includes('api.x.com/graphql/') ||\n url.includes('x.com/i/api/graphql/'))\n ) {\n headers.set('content-type', 'application/json');\n }\n\n await this.installCsrfToken(headers);\n\n if (this.options?.experimental?.xpff) {\n const guestId = await this.guestId();\n if (guestId != null) {\n const xpffHeader = await generateXPFFHeader(guestId);\n headers.set('x-xp-forwarded-for', xpffHeader);\n }\n }\n }\n\n async installCsrfToken(headers: Headers): Promise<void> {\n const cookies = await this.getCookies();\n const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n if (xCsrfToken) {\n headers.set('x-csrf-token', xCsrfToken.value);\n }\n }\n\n protected async setCookie(key: string, value: string): Promise<void> {\n const cookie = Cookie.parse(`${key}=${value}`);\n if (!cookie) {\n throw new Error('Failed to parse cookie.');\n }\n\n await this.jar.setCookie(cookie, this.getCookieJarUrl());\n\n if (typeof document !== 'undefined') {\n document.cookie = cookie.toString();\n }\n }\n\n public async getCookies(): Promise<Cookie[]> {\n return this.jar.getCookies(this.getCookieJarUrl());\n }\n\n protected async getCookieString(): Promise<string> {\n const cookies = await this.getCookies();\n return cookies.map((cookie) => `${cookie.key}=${cookie.value}`).join('; ');\n }\n\n protected async removeCookie(key: string): Promise<void> {\n //@ts-expect-error don't care\n const store: MemoryCookieStore = this.jar.store;\n const cookies = await this.jar.getCookies(this.getCookieJarUrl());\n for (const cookie of cookies) {\n if (!cookie.domain || !cookie.path) continue;\n await store.removeCookie(cookie.domain, cookie.path, key);\n\n if (typeof document !== 'undefined') {\n document.cookie = `${cookie.key}=; Max-Age=0; path=${cookie.path}; domain=${cookie.domain}`;\n }\n }\n }\n\n private getCookieJarUrl(): string {\n return typeof document !== 'undefined'\n ? document.location.toString()\n : 'https://x.com';\n }\n\n protected async guestId(): Promise<string | null> {\n const cookies = await this.getCookies();\n const guestIdCookie = cookies.find((cookie) => cookie.key === 'guest_id');\n return guestIdCookie ? guestIdCookie.value : null;\n }\n\n /**\n * Updates the authentication state with a new guest token from the Twitter API.\n */\n protected async updateGuestToken() {\n try {\n await this.updateGuestTokenCore();\n } catch (err) {\n log('Failed to update guest token; this may cause issues:', err);\n }\n }\n\n private async updateGuestTokenCore() {\n const guestActivateUrl = 'https://api.x.com/1.1/guest/activate.json';\n\n // Must include full browser headers - Cloudflare rejects requests\n // that only have Authorization/Cookie without proper browser fingerprint\n const headers = new Headers({\n authorization: `Bearer ${this.bearerToken}`,\n 'user-agent': CHROME_USER_AGENT,\n accept: '*/*',\n 'accept-language': 'en-US,en;q=0.9',\n 'content-type': 'application/x-www-form-urlencoded',\n 'sec-ch-ua': CHROME_SEC_CH_UA,\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n origin: 'https://x.com',\n referer: 'https://x.com/',\n 'sec-fetch-site': 'same-site',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-dest': 'empty',\n cookie: await this.getCookieString(),\n });\n\n log(`Making POST request to ${guestActivateUrl}`);\n\n const res = await this.fetch(guestActivateUrl, {\n method: 'POST',\n headers: headers,\n });\n\n await updateCookieJar(this.jar, res.headers);\n\n if (!res.ok) {\n throw new AuthenticationError(await res.text());\n }\n\n const o = await flexParseJson<any>(res);\n if (o == null || o['guest_token'] == null) {\n throw new AuthenticationError('guest_token not found.');\n }\n\n const newGuestToken = o['guest_token'];\n if (typeof newGuestToken !== 'string') {\n throw new AuthenticationError('guest_token was not a string.');\n }\n\n this.guestToken = newGuestToken;\n this.guestCreatedAt = new Date();\n\n await this.setCookie('gt', newGuestToken);\n\n log(`Updated guest token (length: ${newGuestToken.length})`);\n }\n\n /**\n * Returns if the authentication token needs to be updated or not.\n * @returns `true` if the token needs to be updated; `false` otherwise.\n */\n private shouldUpdate(): boolean {\n return (\n !this.hasToken() ||\n (this.guestCreatedAt != null &&\n this.guestCreatedAt <\n new Date(new Date().valueOf() - 3 * 60 * 60 * 1000))\n );\n }\n}\n","export interface PlatformExtensions {\n /**\n * Randomizes the runtime's TLS ciphers to bypass TLS client fingerprinting, which\n * hopefully avoids random 404s on some requests.\n *\n * **References:**\n * - https://github.com/imputnet/cobalt/pull/574\n */\n randomizeCiphers(): Promise<void>;\n}\n\nexport const genericPlatform = new (class implements PlatformExtensions {\n randomizeCiphers(): Promise<void> {\n return Promise.resolve();\n }\n})();\n","import { PlatformExtensions, genericPlatform } from './platform-interface';\n\nexport * from './platform-interface';\n\ndeclare const PLATFORM_NODE: boolean;\n\nexport class Platform implements PlatformExtensions {\n async randomizeCiphers() {\n const platform = await Platform.importPlatform();\n await platform?.randomizeCiphers();\n }\n\n private static async importPlatform(): Promise<null | PlatformExtensions> {\n if (PLATFORM_NODE) {\n const { platform } = await import('./node/index.js');\n return platform as PlatformExtensions;\n }\n\n return genericPlatform;\n }\n}\n","import fetch from 'cross-fetch';\nimport debug from 'debug';\nimport { CHROME_SEC_CH_UA, CHROME_USER_AGENT } from './api';\n\nconst log = debug('twitter-scraper:xctxid');\n\n// @ts-expect-error import type annotation (\"the current file is a CommonJS module\")\ntype LinkeDOM = typeof import('linkedom');\n\nlet linkedom: LinkeDOM | null = null;\nasync function linkedomImport(): Promise<LinkeDOM> {\n if (!linkedom) {\n const mod = await import('linkedom');\n linkedom = mod;\n return mod;\n }\n return linkedom;\n}\n\nasync function parseHTML(html: string): Promise<Window & typeof globalThis> {\n if (typeof window !== 'undefined') {\n const { defaultView } = new DOMParser().parseFromString(html, 'text/html');\n if (!defaultView) {\n throw new Error('Failed to get defaultView from parsed HTML.');\n }\n return defaultView;\n } else {\n const { DOMParser } = await linkedomImport();\n return new DOMParser().parseFromString(html, 'text/html').defaultView;\n }\n}\n\n// Copied from https://github.com/Lqm1/x-client-transaction-id/blob/main/utils.ts with minor tweaks to support us passing a custom fetch function\nasync function handleXMigration(fetchFn: typeof fetch): Promise<Document> {\n // Set headers to mimic a browser request\n const headers = {\n accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'accept-language': 'ja',\n 'cache-control': 'no-cache',\n pragma: 'no-cache',\n priority: 'u=0, i',\n 'sec-ch-ua': CHROME_SEC_CH_UA,\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'document',\n 'sec-fetch-mode': 'navigate',\n 'sec-fetch-site': 'none',\n 'sec-fetch-user': '?1',\n 'upgrade-insecure-requests': '1',\n 'user-agent': CHROME_USER_AGENT,\n };\n\n // Fetch X.com homepage\n const response = await fetchFn('https://x.com', {\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch X homepage: ${response.statusText}`);\n }\n\n const htmlText = await response.text();\n\n // Parse HTML using linkedom\n let dom = await parseHTML(htmlText);\n let document = dom.window.document;\n\n // Check for migration redirection links\n const migrationRedirectionRegex = new RegExp(\n '(http(?:s)?://(?:www\\\\.)?(twitter|x){1}\\\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\\\-_]+)+',\n 'i',\n );\n\n const metaRefresh = document.querySelector(\"meta[http-equiv='refresh']\");\n const metaContent = metaRefresh\n ? metaRefresh.getAttribute('content') || ''\n : '';\n\n const migrationRedirectionUrl =\n migrationRedirectionRegex.exec(metaContent) ||\n migrationRedirectionRegex.exec(htmlText);\n\n if (migrationRedirectionUrl) {\n // Follow redirection URL\n const redirectResponse = await fetchFn(migrationRedirectionUrl[0]);\n\n if (!redirectResponse.ok) {\n throw new Error(\n `Failed to follow migration redirection: ${redirectResponse.statusText}`,\n );\n }\n\n const redirectHtml = await redirectResponse.text();\n dom = await parseHTML(redirectHtml);\n document = dom.window.document;\n }\n\n // Handle migration form if present\n const migrationForm =\n document.querySelector(\"form[name='f']\") ||\n document.querySelector(\"form[action='https://x.com/x/migrate']\");\n\n if (migrationForm) {\n const url =\n migrationForm.getAttribute('action') || 'https://x.com/x/migrate';\n const method = migrationForm.getAttribute('method') || 'POST';\n\n // Collect form input fields\n const requestPayload = new FormData();\n\n const inputFields = migrationForm.querySelectorAll('input');\n for (const element of Array.from(inputFields)) {\n const name = element.getAttribute('name');\n const value = element.getAttribute('value');\n if (name && value) {\n requestPayload.append(name, value);\n }\n }\n\n // Submit form using POST request\n const formResponse = await fetchFn(url, {\n method: method,\n body: requestPayload,\n headers,\n });\n\n if (!formResponse.ok) {\n throw new Error(\n `Failed to submit migration form: ${formResponse.statusText}`,\n );\n }\n\n const formHtml = await formResponse.text();\n dom = await parseHTML(formHtml);\n document = dom.window.document;\n }\n\n // Return final DOM document\n return document;\n}\n\n// Cache for the x.com document to avoid repeated fetches.\n// The document is needed to generate transaction IDs but doesn't change frequently.\n// We cache the Promise (not the result) to prevent concurrent calls from all fetching separately.\n//\n// NOTE: This cache is module-level and shared across ALL Scraper instances in the process.\n// If multiple Scraper instances use different fetch functions or auth contexts, they will\n// still share the same cached document. This is acceptable because the document content\n// (JS bundle hashes for transaction ID generation) is the same regardless of auth state.\n//\n// WARNING: When using multiple Scraper instances with different proxies (e.g., different\n// IP addresses or regions), the first instance's fetch function wins for the cache duration.\n// Subsequent instances will reuse the cached document even if their proxy would return\n// different content. If this is a problem, call clearDocumentCache() between switching\n// scraper instances to force a fresh fetch with the new proxy's fetch function.\nlet cachedDocumentPromise: Promise<Document> | null = null;\nlet cachedDocumentTimestamp = 0;\nconst DOCUMENT_CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Clear the cached x.com document. Useful for testing or when the cached\n * document may be stale (e.g., after a long-running process).\n */\nexport function clearDocumentCache(): void {\n cachedDocumentPromise = null;\n cachedDocumentTimestamp = 0;\n}\n\n/**\n * Returns a cached x.com Document, fetching a fresh one if stale.\n *\n * **Note:** Only the first caller's `fetchFn` is captured (first-caller-wins).\n * Subsequent callers within the cache TTL share the same cached document\n * regardless of which `fetchFn` they pass. This is acceptable because all\n * callers in practice share the same fetch configuration.\n */\nasync function getCachedDocument(fetchFn: typeof fetch): Promise<Document> {\n const now = Date.now();\n if (\n !cachedDocumentPromise ||\n now - cachedDocumentTimestamp > DOCUMENT_CACHE_TTL\n ) {\n log('Fetching fresh x.com document for transaction ID generation');\n cachedDocumentTimestamp = now;\n // Store the Promise immediately so concurrent calls share the same fetch\n cachedDocumentPromise = handleXMigration(fetchFn).catch((err) => {\n // On failure, clear the cache so the next call retries\n cachedDocumentPromise = null;\n throw err;\n });\n } else {\n log('Using cached x.com document for transaction ID generation');\n }\n return cachedDocumentPromise;\n}\n\nlet ClientTransaction:\n | typeof import('x-client-transaction-id')['ClientTransaction']\n | null = null;\nasync function clientTransaction(): Promise<\n typeof import('x-client-transaction-id')['ClientTransaction']\n> {\n if (!ClientTransaction) {\n const mod = await import('x-client-transaction-id');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ClientTransaction = mod.ClientTransaction as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return mod.ClientTransaction as any;\n }\n return ClientTransaction;\n}\n\n/**\n * Generate a client transaction ID for the given URL and HTTP method.\n *\n * Uses a module-level cached document (shared across all Scraper instances).\n * When using multiple scrapers with different proxies, call\n * {@link clearDocumentCache} between instances to avoid stale cache hits.\n */\nexport async function generateTransactionId(\n url: string,\n fetchFn: typeof fetch,\n method: 'GET' | 'POST',\n) {\n const parsedUrl = new URL(url);\n const path = parsedUrl.pathname;\n\n log(`Generating transaction ID for ${method} ${path}`);\n\n const document = await getCachedDocument(fetchFn);\n const ClientTransactionClass = await clientTransaction();\n const transaction = await ClientTransactionClass.create(document);\n const transactionId = await transaction.generateTransactionId(method, path);\n log(`Transaction ID: ${transactionId}`);\n\n return transactionId;\n}\n","/**\n * Chrome version-dependent fingerprint constants.\n *\n * IMPORTANT: All constants in this file are tied to a specific Chrome version\n * (currently Chrome 144 on Windows 10). When bumping the Chrome version:\n * 1. Update CHROME_USER_AGENT with the new version string\n * 2. Update CHROME_SEC_CH_UA with the matching Client Hints\n * 3. Update CHROME_JA3 fingerprint (capture via tls.peet.ws)\n * 4. Update CHROME_JA4R fingerprint\n * 5. Update CHROME_HTTP2_FINGERPRINT settings frame\n * 6. Review CHROME_HEADER_ORDER if Chrome changes header ordering\n * 7. Update castle.ts DEFAULT_PROFILE if Chrome version affects fingerprint fields\n *\n * All values must be consistent with each other and match a real Chrome release.\n */\n\n/**\n * User-Agent string matching Chrome 144 on Windows 10.\n * Must be consistent across all requests and match the TLS fingerprint.\n */\nexport const CHROME_USER_AGENT =\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36';\n\n/**\n * Chrome Client Hints header matching the Chrome 144 user-agent.\n */\nexport const CHROME_SEC_CH_UA =\n '\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"';\n\n/**\n * JA3 TLS fingerprint for Chrome 144.\n * Captured from a real Chrome 144 browser session via tls.peet.ws.\n */\nexport const CHROME_JA3 =\n '771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-10-35-16-11-51-27-65037-43-45-18-23-5-65281-13-17613,4588-29-23-24,0';\n\n/**\n * JA4r fingerprint for Chrome 144.\n * Format: t13d1516h2_CIPHERS_EXTENSIONS_SIG_ALGS\n */\nexport const CHROME_JA4R =\n 't13d1516h2_002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9_0005,000a,000b,000d,0012,0017,001b,0023,002b,002d,0033,44cd,fe0d,ff01_0403,0804,0401,0503,0805,0501,0806,0601';\n\n/**\n * Chrome 144 HTTP/2 fingerprint - mimics exact HTTP/2 SETTINGS frame.\n * Format: SETTINGS|window_size|unknown|priority_order\n */\nexport const CHROME_HTTP2_FINGERPRINT =\n '1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p';\n\n/**\n * Exact header order that Chrome 144 uses.\n * Header ordering is critical for HTTP/2 fingerprint evasion — servers can detect\n * non-browser clients by checking if headers arrive in a non-standard order.\n */\nexport const CHROME_HEADER_ORDER = [\n // HTTP/2 pseudo-headers (Chrome 144 order: method, authority, scheme, path)\n ':method',\n ':authority',\n ':scheme',\n ':path',\n // Chrome Client Hints (mandatory for modern detection bypass)\n 'sec-ch-ua',\n 'sec-ch-ua-mobile',\n 'sec-ch-ua-platform',\n // Standard browser headers\n 'upgrade-insecure-requests',\n 'user-agent',\n 'accept',\n 'origin',\n 'sec-fetch-site',\n 'sec-fetch-mode',\n 'sec-fetch-user',\n 'sec-fetch-dest',\n 'referer',\n 'accept-encoding',\n 'accept-language',\n 'priority',\n // Authentication headers\n 'authorization',\n 'x-csrf-token',\n 'x-guest-token',\n 'x-twitter-auth-type',\n 'x-twitter-active-user',\n 'x-twitter-client-language',\n 'x-client-transaction-id',\n 'x-xp-forwarded-for',\n // POST-specific\n 'content-type',\n 'cookie',\n];\n","import { FetchParameters } from './api-types';\nimport { TwitterAuth, TwitterGuestAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport debug from 'debug';\nimport { generateTransactionId } from './xctxid';\n\nconst log = debug('twitter-scraper:api');\n\nexport interface FetchTransformOptions {\n /**\n * Transforms the request options before a request is made. This executes after all of the default\n * parameters have been configured, and is stateless. It is safe to return new request options\n * objects.\n * @param args The request options.\n * @returns The transformed request options.\n */\n request: (\n ...args: FetchParameters\n ) => FetchParameters | Promise<FetchParameters>;\n\n /**\n * Transforms the response after a request completes. This executes immediately after the request\n * completes, and is stateless. It is safe to return a new response object.\n * @param response The response object.\n * @returns The transformed response object.\n */\n response: (response: Response) => Response | Promise<Response>;\n}\n\nexport const bearerToken =\n 'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF';\n\nexport const bearerToken2 =\n 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';\n\n// Re-exported from chrome-fingerprint.ts — see that file for all Chrome\n// version-dependent constants that must be updated together.\nexport { CHROME_USER_AGENT, CHROME_SEC_CH_UA } from './chrome-fingerprint';\n\nexport async function jitter(maxMs: number): Promise<void> {\n const jitter = Math.random() * maxMs;\n await new Promise((resolve) => setTimeout(resolve, jitter));\n}\n\n/**\n * An API result container.\n */\nexport type RequestApiResult<T> =\n | { success: true; value: T }\n | { success: false; err: Error };\n\n/**\n * Used internally to send HTTP requests to the Twitter API.\n * @internal\n * @param url - The URL to send the request to.\n * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request.\n * @param method - The HTTP method used when sending this request.\n * @param platform - The platform extensions to use.\n * @param headers - The headers to include in the request.\n * @param bearerTokenOverride - Optional bearer token to use instead of the default one.\n */\nexport async function requestApi<T>(\n url: string,\n auth: TwitterAuth,\n method: 'GET' | 'POST' = 'GET',\n platform: PlatformExtensions = new Platform(),\n headers: Headers = new Headers(),\n bearerTokenOverride?: string,\n): Promise<RequestApiResult<T>> {\n log(`Making ${method} request to ${url}`);\n\n await auth.installTo(headers, url, bearerTokenOverride);\n await platform.randomizeCiphers();\n\n if (\n auth instanceof TwitterGuestAuth &&\n auth.options?.experimental?.xClientTransactionId\n ) {\n const transactionId = await generateTransactionId(\n url,\n auth.fetch.bind(auth),\n method,\n );\n headers.set('x-client-transaction-id', transactionId);\n }\n\n let res: Response;\n do {\n const fetchParameters: FetchParameters = [\n url,\n {\n method,\n headers,\n credentials: 'include',\n },\n ];\n\n try {\n res = await auth.fetch(...fetchParameters);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n\n return {\n success: false,\n err,\n };\n }\n\n await updateCookieJar(auth.cookieJar(), res.headers);\n\n if (res.status === 429) {\n log('Rate limit hit, waiting for retry...');\n await auth.onRateLimit({\n fetchParameters: fetchParameters,\n response: res,\n });\n }\n } while (res.status === 429);\n\n if (!res.ok) {\n return {\n success: false,\n err: await ApiError.fromResponse(res),\n };\n }\n\n const value: T = await flexParseJson(res);\n if (res.headers.get('x-rate-limit-incoming') == '0') {\n auth.deleteToken();\n return { success: true, value };\n } else {\n return { success: true, value };\n }\n}\n\nexport async function flexParseJson<T>(res: Response): Promise<T> {\n try {\n return await res.json();\n } catch {\n log('Failed to parse response as JSON, trying text parse...');\n const text = await res.text();\n log('Response text:', text);\n return JSON.parse(text);\n }\n}\n\n/** @internal */\nexport function addApiFeatures(o: object) {\n return {\n ...o,\n rweb_lists_timeline_redesign_enabled: true,\n responsive_web_graphql_exclude_directive_enabled: true,\n verified_phone_label_enabled: false,\n creator_subscriptions_tweet_preview_api_enabled: true,\n responsive_web_graphql_timeline_navigation_enabled: true,\n responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n tweetypie_unmention_optimization_enabled: true,\n responsive_web_edit_tweet_api_enabled: true,\n graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n view_counts_everywhere_api_enabled: true,\n longform_notetweets_consumption_enabled: true,\n tweet_awards_web_tipping_enabled: false,\n freedom_of_speech_not_reach_fetch_enabled: true,\n standardized_nudges_misinfo: true,\n longform_notetweets_rich_text_read_enabled: true,\n responsive_web_enhance_cards_enabled: false,\n subscriptions_verification_info_enabled: true,\n subscriptions_verification_info_reason_enabled: true,\n subscriptions_verification_info_verified_since_enabled: true,\n super_follow_badge_privacy_enabled: false,\n super_follow_exclusive_tweet_notifications_enabled: false,\n super_follow_tweet_api_enabled: false,\n super_follow_user_api_enabled: false,\n android_graphql_skip_api_media_color_palette: false,\n creator_subscriptions_subscription_count_enabled: false,\n blue_business_profile_image_shape_enabled: false,\n unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n false,\n };\n}\n\nexport function addApiParams(\n params: URLSearchParams,\n includeTweetReplies: boolean,\n): URLSearchParams {\n params.set('include_profile_interstitial_type', '1');\n params.set('include_blocking', '1');\n params.set('include_blocked_by', '1');\n params.set('include_followed_by', '1');\n params.set('include_want_retweets', '1');\n params.set('include_mute_edge', '1');\n params.set('include_can_dm', '1');\n params.set('include_can_media_tag', '1');\n params.set('include_ext_has_nft_avatar', '1');\n params.set('include_ext_is_blue_verified', '1');\n params.set('include_ext_verified_type', '1');\n params.set('skip_status', '1');\n params.set('cards_platform', 'Web-12');\n params.set('include_cards', '1');\n params.set('include_ext_alt_text', 'true');\n params.set('include_ext_limited_action_results', 'false');\n params.set('include_quote_count', 'true');\n params.set('include_reply_count', '1');\n params.set('tweet_mode', 'extended');\n params.set('include_ext_collab_control', 'true');\n params.set('include_ext_views', 'true');\n params.set('include_entities', 'true');\n params.set('include_user_entities', 'true');\n params.set('include_ext_media_color', 'true');\n params.set('include_ext_media_availability', 'true');\n params.set('include_ext_sensitive_media_warning', 'true');\n params.set('include_ext_trusted_friends_metadata', 'true');\n params.set('send_error_codes', 'true');\n params.set('simple_quoted_tweet', 'true');\n params.set('include_tweet_replies', `${includeTweetReplies}`);\n params.set(\n 'ext',\n 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe',\n );\n return params;\n}\n","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { CHROME_SEC_CH_UA, CHROME_USER_AGENT, flexParseJson } from './api';\nimport { CookieJar } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport { TwitterApiErrorRaw, AuthenticationError, ApiError } from './errors';\nimport { Type, type Static } from '@sinclair/typebox';\nimport { Check } from '@sinclair/typebox/value';\nimport * as OTPAuth from 'otpauth';\nimport { FetchParameters } from './api-types';\nimport debug from 'debug';\n\nimport { generateTransactionId } from './xctxid';\nimport { generateLocalCastleToken } from './castle';\n\nconst log = debug('twitter-scraper:auth-user');\n\nexport interface TwitterUserAuthFlowInitRequest {\n flow_name: string;\n input_flow_data: Record<string, unknown>;\n subtask_versions: Record<string, number>;\n}\n\nexport interface TwitterUserAuthFlowSubtaskRequest {\n flow_token: string;\n subtask_inputs: ({\n subtask_id: string;\n } & Record<string, unknown>)[];\n}\n\nexport type TwitterUserAuthFlowRequest =\n | TwitterUserAuthFlowInitRequest\n | TwitterUserAuthFlowSubtaskRequest;\n\nexport interface TwitterUserAuthFlowResponse {\n errors?: TwitterApiErrorRaw[];\n flow_token?: string;\n status?: string;\n subtasks?: TwitterUserAuthSubtask[];\n}\n\nconst TwitterUserAuthSubtask = Type.Object({\n subtask_id: Type.String(),\n enter_text: Type.Optional(Type.Object({})),\n});\ntype TwitterUserAuthSubtask = Static<typeof TwitterUserAuthSubtask>;\n\nexport type FlowTokenResultSuccess = {\n status: 'success';\n response: TwitterUserAuthFlowResponse;\n};\n\nexport type FlowTokenResultError = {\n status: 'error';\n err: Error;\n};\n\nexport type FlowTokenResult = FlowTokenResultSuccess | FlowTokenResultError;\n\nexport interface TwitterUserAuthCredentials {\n username: string;\n password: string;\n email?: string;\n twoFactorSecret?: string;\n}\n\n/**\n * The API interface provided to custom subtask handlers for interacting with the Twitter authentication flow.\n * This interface allows handlers to send flow requests and access the current flow token.\n *\n * The API is passed to each subtask handler and provides methods necessary for implementing\n * custom authentication subtasks. It abstracts away the low-level details of communicating\n * with Twitter's authentication API.\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom subtask handler that implements a hypothetical example subtask\n * const exampleHandler: FlowSubtaskHandler = async (subtaskId, response, credentials, api) => {\n * // Process the example subtask somehow\n * const data = await processExampleTask();\n *\n * // Submit the processed data using the provided API\n * return await api.sendFlowRequest({\n * flow_token: api.getFlowToken(),\n * subtask_inputs: [{\n * subtask_id: subtaskId,\n * example_data: {\n * value: data,\n * link: \"next_link\"\n * }\n * }]\n * });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleSubtask\", exampleHandler);\n * ```\n */\nexport interface FlowSubtaskHandlerApi {\n /**\n * Send a flow request to the Twitter API.\n * @param request The request object containing flow token and subtask inputs\n * @returns The result of the flow task\n */\n sendFlowRequest: (\n request: TwitterUserAuthFlowRequest,\n ) => Promise<FlowTokenResult>;\n /**\n * Gets the current flow token.\n * @returns The current flow token\n */\n getFlowToken: () => string;\n}\n\n/**\n * A handler function for processing Twitter authentication flow subtasks.\n * Library consumers can implement and register custom handlers for new or\n * existing subtask types using the Scraper.registerAuthSubtaskHandler method.\n *\n * Each subtask handler is called when its corresponding subtask ID is encountered\n * during the authentication flow. The handler receives the subtask ID, the previous\n * response data, the user's credentials, and an API interface for interacting with\n * the authentication flow.\n *\n * Handlers should process their specific subtask and return either a successful response\n * or an error. Success responses typically lead to the next subtask in the flow, while\n * errors will halt the authentication process.\n *\n * @param subtaskId - The identifier of the subtask being handled\n * @param previousResponse - The complete response from the previous authentication flow step\n * @param credentials - The user's authentication credentials including username, password, etc.\n * @param api - An interface providing methods to interact with the authentication flow\n * @returns A promise resolving to either a successful flow response or an error\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // Custom handler for a hypothetical verification subtask\n * const verificationHandler: FlowSubtaskHandler = async (\n * subtaskId,\n * response,\n * credentials,\n * api\n * ) => {\n * // Extract the verification data from the response\n * const verificationData = response.subtasks?.[0].exampleData?.value;\n * if (!verificationData) {\n * return {\n * status: 'error',\n * err: new Error('No verification data found in response')\n * };\n * }\n *\n * // Process the verification data somehow\n * const result = await processVerification(verificationData);\n *\n * // Submit the result using the flow API\n * return await api.sendFlowRequest({\n * flow_token: api.getFlowToken(),\n * subtask_inputs: [{\n * subtask_id: subtaskId,\n * example_verification: {\n * value: result,\n * link: \"next_link\"\n * }\n * }]\n * });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleVerificationSubtask\", verificationHandler);\n *\n * // Later, when logging in...\n * await scraper.login(\"username\", \"password\");\n * ```\n */\nexport type FlowSubtaskHandler = (\n subtaskId: string,\n previousResponse: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n) => Promise<FlowTokenResult>;\n\n/**\n * A user authentication token manager.\n */\nexport class TwitterUserAuth extends TwitterGuestAuth {\n private readonly subtaskHandlers: Map<string, FlowSubtaskHandler> = new Map();\n\n constructor(bearerToken: string, options?: Partial<TwitterAuthOptions>) {\n super(bearerToken, options);\n this.initializeDefaultHandlers();\n }\n\n /**\n * Register a custom subtask handler or override an existing one\n * @param subtaskId The ID of the subtask to handle\n * @param handler The handler function that processes the subtask\n */\n registerSubtaskHandler(subtaskId: string, handler: FlowSubtaskHandler): void {\n this.subtaskHandlers.set(subtaskId, handler);\n }\n\n private initializeDefaultHandlers(): void {\n this.subtaskHandlers.set(\n 'LoginJsInstrumentationSubtask',\n this.handleJsInstrumentationSubtask.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterUserIdentifierSSO',\n this.handleEnterUserIdentifierSSO.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterAlternateIdentifierSubtask',\n this.handleEnterAlternateIdentifierSubtask.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginEnterPassword',\n this.handleEnterPassword.bind(this),\n );\n this.subtaskHandlers.set(\n 'AccountDuplicationCheck',\n this.handleAccountDuplicationCheck.bind(this),\n );\n this.subtaskHandlers.set(\n 'LoginTwoFactorAuthChallenge',\n this.handleTwoFactorAuthChallenge.bind(this),\n );\n this.subtaskHandlers.set('LoginAcid', this.handleAcid.bind(this));\n this.subtaskHandlers.set(\n 'LoginSuccessSubtask',\n this.handleSuccessSubtask.bind(this),\n );\n }\n\n async isLoggedIn(): Promise<boolean> {\n const cookies = await this.getCookies();\n // Both ct0 (CSRF token) and auth_token (session token) are required for authenticated requests.\n // ct0 alone is NOT sufficient - without auth_token, Twitter returns 401 on all API calls.\n return (\n cookies.some((c) => c.key === 'ct0') &&\n cookies.some((c) => c.key === 'auth_token')\n );\n }\n\n async login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void> {\n // Pre-flight: visit x.com to establish Cloudflare cookies and session context.\n // A real browser visits the page before starting the login API flow, and skipping\n // this step can trigger Twitter's anti-bot detection (error 399).\n // The preflight also extracts the guest token from the page HTML (via inline <script>\n // that sets the `gt` cookie), matching real browser behavior where no separate\n // guest/activate.json call is made.\n await this.preflight();\n\n // Only call guest/activate.json if preflight didn't set the guest token.\n // Real browsers get the guest token from inline JS in the login page HTML,\n // not from a separate API call.\n if (!this.guestToken) {\n await this.updateGuestToken();\n }\n\n // IMPORTANT: Do NOT generate ct0 or send x-csrf-token during login.\n // Real browsers do NOT have a ct0 cookie during the unauthenticated login flow.\n // Sending x-csrf-token when the server doesn't expect it triggers bot detection (error 399).\n\n const credentials: TwitterUserAuthCredentials = {\n username,\n password,\n email,\n twoFactorSecret,\n };\n\n let next: FlowTokenResult = await this.initLogin();\n while (next.status === 'success' && next.response.subtasks?.length) {\n const flowToken = next.response.flow_token;\n if (flowToken == null) {\n // Should never happen\n throw new Error('flow_token not found.');\n }\n\n const subtaskId = next.response.subtasks[0].subtask_id;\n\n // Add a human-like delay between flow steps.\n // Real browsers take 1-3 seconds between steps (page render, user reading, typing).\n // Without this delay, Twitter flags the rapid-fire request pattern as bot activity (error 399).\n const configuredDelay = this.options?.experimental?.flowStepDelay;\n const delay =\n configuredDelay !== undefined\n ? configuredDelay\n : 1000 + Math.floor(Math.random() * 2000); // default: 1-3 seconds\n if (delay > 0) {\n log(`Waiting ${delay}ms before handling subtask: ${subtaskId}`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n const handler = this.subtaskHandlers.get(subtaskId);\n\n if (handler) {\n next = await handler(subtaskId, next.response, credentials, {\n sendFlowRequest: this.executeFlowTask.bind(this),\n getFlowToken: () => flowToken,\n });\n } else {\n throw new Error(`Unknown subtask ${subtaskId}`);\n }\n }\n if (next.status === 'error') {\n throw next.err;\n }\n }\n\n /**\n * Pre-flight request to establish Cloudflare cookies and session context.\n * Mimics a real browser visiting x.com before starting the login API flow.\n */\n private async preflight(): Promise<void> {\n try {\n const headers = new Headers({\n accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'accept-language': 'en-US,en;q=0.9',\n 'sec-ch-ua': CHROME_SEC_CH_UA,\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'document',\n 'sec-fetch-mode': 'navigate',\n 'sec-fetch-site': 'none',\n 'sec-fetch-user': '?1',\n 'upgrade-insecure-requests': '1',\n 'user-agent': CHROME_USER_AGENT,\n });\n\n log('Pre-flight: fetching https://x.com/i/flow/login');\n const res = await this.fetch('https://x.com/i/flow/login', {\n redirect: 'follow',\n headers: headers,\n });\n\n await updateCookieJar(this.jar, res.headers);\n log(`Pre-flight response: ${res.status}`);\n\n // Extract guest token from the HTML page.\n // Real browsers get the guest token from inline <script> tags that set\n // document.cookie=\"gt=<token>; ...\" rather than calling guest/activate.json.\n try {\n const html = await res.text();\n const gtMatch = html.match(/document\\.cookie=\"gt=(\\d+)/);\n if (gtMatch) {\n this.guestToken = gtMatch[1];\n this.guestCreatedAt = new Date();\n // Also set the gt cookie in our jar (as the browser would)\n await this.setCookie('gt', gtMatch[1]);\n log(`Extracted guest token from HTML (length: ${gtMatch[1].length})`);\n }\n } catch (err) {\n log('Failed to extract guest token from HTML (non-fatal):', err);\n }\n } catch (err) {\n log('Pre-flight request failed (non-fatal):', err);\n }\n }\n\n async logout(): Promise<void> {\n if (!this.hasToken()) {\n return;\n }\n\n try {\n const logoutUrl = 'https://api.x.com/1.1/account/logout.json';\n const headers = new Headers();\n await this.installTo(headers, logoutUrl);\n\n await this.fetch(logoutUrl, {\n method: 'POST',\n headers,\n });\n } catch (error) {\n // Ignore errors during logout but still clean up state\n log('Error during logout:', error);\n } finally {\n this.deleteToken();\n this.jar = new CookieJar();\n }\n }\n\n async installTo(\n headers: Headers,\n url: string,\n bearerTokenOverride?: string,\n ): Promise<void> {\n // Reuse all shared browser + auth headers from the guest auth base class\n await super.installTo(headers, url, bearerTokenOverride);\n\n // CRITICAL: Tell Twitter this is an authenticated user session (not guest)\n headers.set('x-twitter-auth-type', 'OAuth2Session');\n headers.set('x-twitter-active-user', 'yes');\n headers.set('x-twitter-client-language', 'en');\n\n // Note: Transaction ID generation is NOT done here. It is handled by\n // requestApi() (api.ts) which knows the actual HTTP method (GET vs POST).\n // Generating it here would use the wrong method and be immediately\n // overwritten by requestApi anyway.\n }\n\n private async initLogin(): Promise<FlowTokenResult> {\n // Reset stale session cookies from previous logins.\n // We preserve __cf_bm (Cloudflare cookie from preflight) and gt (guest token).\n // ct0 should NOT exist during login - real browsers don't have it until authenticated.\n await this.removeCookie('twitter_ads_id');\n await this.removeCookie('ads_prefs');\n await this.removeCookie('_twitter_sess');\n await this.removeCookie('zipbox_forms_auth_token');\n await this.removeCookie('lang');\n await this.removeCookie('bouncer_reset_cookie');\n await this.removeCookie('twid');\n await this.removeCookie('twitter_ads_idb');\n await this.removeCookie('email_uid');\n await this.removeCookie('external_referer');\n await this.removeCookie('aa_u');\n\n return await this.executeFlowTask({\n flow_name: 'login',\n input_flow_data: {\n flow_context: {\n debug_overrides: {},\n start_location: {\n location: 'manual_link',\n },\n },\n },\n subtask_versions: {\n action_list: 2,\n alert_dialog: 1,\n app_download_cta: 1,\n check_logged_in_account: 1,\n choice_selection: 3,\n contacts_live_sync_permission_prompt: 0,\n cta: 7,\n email_verification: 2,\n end_flow: 1,\n enter_date: 1,\n enter_email: 2,\n enter_password: 5,\n enter_phone: 2,\n enter_recaptcha: 1,\n enter_text: 5,\n enter_username: 2,\n generic_urt: 3,\n in_app_notification: 1,\n interest_picker: 3,\n js_instrumentation: 1,\n menu_dialog: 1,\n notifications_permission_prompt: 2,\n open_account: 2,\n open_home_timeline: 1,\n open_link: 1,\n phone_verification: 4,\n privacy_options: 1,\n security_key: 3,\n select_avatar: 4,\n select_banner: 2,\n settings_list: 7,\n show_code: 1,\n sign_up: 2,\n sign_up_review: 4,\n tweet_selection_urt: 1,\n update_users: 1,\n upload_media: 1,\n user_recommendations_list: 4,\n user_recommendations_urt: 1,\n wait_spinner: 3,\n web_modal: 1,\n },\n });\n }\n\n private async handleJsInstrumentationSubtask(\n subtaskId: string,\n prev: TwitterUserAuthFlowResponse,\n _credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n // Extract the JS instrumentation URL from the subtask response.\n // The script at this URL collects browser metrics (fingerprinting) that Twitter\n // validates. Sending \"{}\" (empty) triggers bot detection (error 399).\n const subtasks = prev.subtasks as {\n subtask_id: string;\n js_instrumentation?: { url: string };\n }[];\n const jsSubtask = subtasks?.find((s) => s.subtask_id === subtaskId);\n const jsUrl: string | undefined = jsSubtask?.js_instrumentation?.url;\n\n let metricsResponse = '{}';\n if (jsUrl) {\n try {\n metricsResponse = await this.executeJsInstrumentation(jsUrl);\n log(\n `JS instrumentation executed successfully, response length: ${metricsResponse.length}`,\n );\n } catch (err) {\n log('Failed to execute JS instrumentation (falling back to {})', err);\n }\n }\n\n return await api.sendFlowRequest({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n js_instrumentation: {\n response: metricsResponse,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n /**\n * Maximum allowed size (in bytes) for the JS instrumentation script.\n * Twitter's scripts are typically ~50-100KB. Anything significantly larger\n * may indicate tampering or an unexpected response.\n */\n private static readonly JS_INSTRUMENTATION_MAX_SIZE = 512 * 1024; // 512KB\n\n /**\n * Fetches and executes the JS instrumentation script to generate browser\n * fingerprinting data. The result is written to an input element named\n * 'ui_metrics'.\n *\n * In browser environments, uses a hidden iframe with native DOM APIs.\n * In Node.js, uses linkedom (for DOM) and the vm module for execution.\n *\n * @security This method executes **remote JavaScript** fetched from Twitter's servers.\n * - In browsers, execution is isolated in a disposable iframe.\n * - In Node.js, `vm.runInContext` is used for convenience, NOT for security.\n * Node's `vm` module provides NO security sandbox — a malicious script can\n * trivially escape the context (e.g., via `this.constructor.constructor('return process')()`).\n * The only real trust boundary is that scripts are fetched from Twitter's known CDN URLs.\n * Setting `process: undefined` etc. in the sandbox context is cosmetic and does not\n * prevent escape.\n * - A maximum script size limit (512KB) and a 5-second timeout provide basic sanity checks.\n */\n private async executeJsInstrumentation(url: string): Promise<string> {\n log(`Fetching JS instrumentation from: ${url}`);\n const response = await this.fetch(url);\n const scriptContent = await response.text();\n log(`JS instrumentation script fetched, length: ${scriptContent.length}`);\n\n if (scriptContent.length > TwitterUserAuth.JS_INSTRUMENTATION_MAX_SIZE) {\n log(\n `WARNING: JS instrumentation script exceeds size limit (${scriptContent.length} > ${TwitterUserAuth.JS_INSTRUMENTATION_MAX_SIZE}), skipping execution`,\n );\n return '{}';\n }\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return this.executeJsInstrumentationBrowser(scriptContent);\n }\n return this.executeJsInstrumentationNode(scriptContent);\n }\n\n /**\n * Execute JS instrumentation in a browser environment using a hidden iframe.\n * The iframe provides natural isolation — the script gets its own document\n * and window, and we can override setTimeout without affecting the host page.\n */\n private async executeJsInstrumentationBrowser(\n scriptContent: string,\n ): Promise<string> {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n document.body.appendChild(iframe);\n\n try {\n const iframeWin = iframe.contentWindow;\n const iframeDoc = iframe.contentDocument;\n if (!iframeWin || !iframeDoc) {\n log('WARNING: Could not access iframe document/window');\n return '{}';\n }\n\n // Add the ui_metrics input element that the script writes its result to\n const input = iframeDoc.createElement('input');\n input.name = 'ui_metrics';\n input.type = 'hidden';\n iframeDoc.body.appendChild(input);\n\n // Override setTimeout to be synchronous — we need the result immediately\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (iframeWin as any).setTimeout = (fn: any) => fn();\n\n // Execute the script in the iframe context via <script> tag injection\n const script = iframeDoc.createElement('script');\n script.textContent = scriptContent;\n iframeDoc.body.appendChild(script);\n\n const value = input.value;\n if (value) {\n log(`JS instrumentation result extracted, length: ${value.length}`);\n return value;\n }\n\n log('WARNING: No ui_metrics value found after script execution');\n return '{}';\n } finally {\n document.body.removeChild(iframe);\n }\n }\n\n /**\n * Execute JS instrumentation in Node.js using linkedom for DOM emulation\n * and the vm module for sandboxed script execution.\n *\n * @security Node's `vm` module does NOT provide a security sandbox. A\n * malicious script can trivially escape the context. The only real trust\n * boundary is that scripts come from Twitter's CDN. The undefined globals\n * (process, require, etc.) are cosmetic — they do not prevent sandbox escape.\n */\n private async executeJsInstrumentationNode(\n scriptContent: string,\n ): Promise<string> {\n // Use linkedom to create a DOM environment with the required elements.\n // The script needs: document.createElement, getElementsByName, getElementsByTagName,\n // appendChild, removeChild, parentNode, children, innerText, lastElementChild, etc.\n // We use parseHTML (not DOMParser) for a more complete window/document implementation.\n const { parseHTML } = await import('linkedom');\n const { document: doc, window: win } = parseHTML(\n '<html><head></head><body><input name=\"ui_metrics\" type=\"hidden\" value=\"\" /></body></html>',\n );\n\n // Polyfill getElementsByName if linkedom doesn't implement it.\n if (typeof doc.getElementsByName !== 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (doc as any).getElementsByName = (name: string) =>\n doc.querySelectorAll(`[name=\"${name}\"]`);\n }\n\n // Execute the script in a sandboxed VM context.\n // The script expects `document` and `window` as globals and uses `setTimeout`\n // to schedule execution. We make setTimeout synchronous since we need the result\n // immediately. The script checks document.readyState to decide between setTimeout\n // and addEventListener('load'/'DOMContentLoaded').\n const vm = await import('vm');\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const origSetTimeout = (win as any).setTimeout;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (win as any).setTimeout = (fn: any) => fn();\n\n try {\n Object.defineProperty(doc, 'readyState', {\n value: 'complete',\n writable: true,\n configurable: true,\n });\n } catch {\n // If readyState can't be set, the script will use event listeners\n }\n\n const sandbox = {\n document: doc,\n window: win,\n Date: Date,\n JSON: JSON,\n parseInt: parseInt,\n // Deny access to Node.js internals to limit sandbox escape surface\n process: undefined,\n require: undefined,\n global: undefined,\n globalThis: undefined,\n };\n vm.runInNewContext(scriptContent, sandbox, { timeout: 5000 });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (win as any).setTimeout = origSetTimeout;\n\n // Extract the result from the ui_metrics input element\n const inputs = doc.getElementsByName('ui_metrics');\n if (inputs && inputs.length > 0) {\n const value =\n (inputs[0] as HTMLInputElement).value ||\n inputs[0].getAttribute('value');\n if (value) {\n log(`JS instrumentation result extracted, length: ${value.length}`);\n return value;\n }\n }\n\n log('WARNING: No ui_metrics value found after script execution');\n return '{}';\n }\n\n private async handleEnterAlternateIdentifierSubtask(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n text: credentials.email,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleEnterUserIdentifierSSO(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n // Generate a Castle.io device fingerprint token.\n // Twitter requires this token with the username submission step (settings_list).\n // Without it, Twitter returns error 399 (\"suspicious activity\").\n let castleToken: string | undefined;\n try {\n castleToken = await this.generateCastleToken();\n log(`Castle token generated, length: ${castleToken.length}`);\n } catch (err) {\n log('Failed to generate castle token (continuing without it):', err);\n }\n\n const settingsList: {\n setting_responses: {\n key: string;\n response_data: { text_data: { result: string } };\n }[];\n link: string;\n castle_token?: string;\n } = {\n setting_responses: [\n {\n key: 'user_identifier',\n response_data: {\n text_data: { result: credentials.username },\n },\n },\n ],\n link: 'next_link',\n };\n\n if (castleToken) {\n settingsList.castle_token = castleToken;\n }\n\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n settings_list: settingsList,\n },\n ],\n });\n }\n\n /**\n * Generates a Castle.io device fingerprint token for the login flow.\n * Uses local token generation (Castle.io v11 format) to avoid external\n * API dependencies and rate limits.\n */\n private async generateCastleToken(): Promise<string> {\n const userAgent = CHROME_USER_AGENT;\n\n const browserProfile = this.options?.experimental?.browserProfile;\n const { token, cuid } = generateLocalCastleToken(userAgent, browserProfile);\n\n // Set the __cuid cookie (Castle.io uses this for tracking)\n await this.setCookie('__cuid', cuid);\n\n log(\n `Castle token generated locally, length: ${\n token.length\n }, cuid: ${cuid.substring(0, 6)}...`,\n );\n\n return token;\n }\n\n private async handleEnterPassword(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n // Generate a fresh castle token for the password step too.\n let castleToken: string | undefined;\n try {\n castleToken = await this.generateCastleToken();\n log(`Castle token for password step, length: ${castleToken.length}`);\n } catch (err) {\n log(\n 'Failed to generate castle token for password (continuing without):',\n err,\n );\n }\n\n const enterPassword: {\n password: string;\n link: string;\n castle_token?: string;\n } = {\n password: credentials.password,\n link: 'next_link',\n };\n\n if (castleToken) {\n enterPassword.castle_token = castleToken;\n }\n\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_password: enterPassword,\n },\n ],\n });\n }\n\n private async handleAccountDuplicationCheck(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n _credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n check_logged_in_account: {\n link: 'AccountDuplicationCheck_false',\n },\n },\n ],\n });\n }\n\n private async handleTwoFactorAuthChallenge(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n if (!credentials.twoFactorSecret) {\n return {\n status: 'error',\n err: new AuthenticationError(\n 'Two-factor authentication is required but no secret was provided',\n ),\n };\n }\n\n const totp = new OTPAuth.TOTP({ secret: credentials.twoFactorSecret });\n let lastResult!: FlowTokenResult;\n for (let attempts = 1; attempts < 4; attempts += 1) {\n const result = await api.sendFlowRequest({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n link: 'next_link',\n text: totp.generate(),\n },\n },\n ],\n });\n\n if (result.status === 'success') {\n return result;\n }\n\n lastResult = result;\n log(`2FA attempt ${attempts} failed: ${result.err.message}`);\n await new Promise((resolve) => setTimeout(resolve, 2000 * attempts));\n }\n return lastResult;\n }\n\n private async handleAcid(\n subtaskId: string,\n _prev: TwitterUserAuthFlowResponse,\n credentials: TwitterUserAuthCredentials,\n api: FlowSubtaskHandlerApi,\n ): Promise<FlowTokenResult> {\n return await this.executeFlowTask({\n flow_token: api.getFlowToken(),\n subtask_inputs: [\n {\n subtask_id: subtaskId,\n enter_text: {\n text: credentials.email,\n link: 'next_link',\n },\n },\n ],\n });\n }\n\n private async handleSuccessSubtask(): Promise<FlowTokenResult> {\n // Login completed successfully, nothing more to do\n log('Successfully logged in with user credentials.');\n return {\n status: 'success',\n response: {},\n };\n }\n\n private async executeFlowTask(\n data: TwitterUserAuthFlowRequest,\n ): Promise<FlowTokenResult> {\n let onboardingTaskUrl = 'https://api.x.com/1.1/onboarding/task.json';\n if ('flow_name' in data) {\n onboardingTaskUrl = `https://api.x.com/1.1/onboarding/task.json?flow_name=${data.flow_name}`;\n }\n\n log(`Making POST request to ${onboardingTaskUrl}`);\n log(\n 'Request data:',\n JSON.stringify(\n data,\n (key, value) => (key === 'password' ? '[REDACTED]' : value),\n 2,\n ),\n );\n // Match exact headers observed from real Chrome browser during login flow.\n // Notable absences vs authenticated requests: no cache-control, no pragma,\n // no x-csrf-token, no x-twitter-auth-type, no x-xp-forwarded-for.\n // We use installAuthCredentials() (not installTo()) to get only the auth\n // essentials (bearer token, guest token, cookies) without browser headers\n // that would need to be deleted afterwards.\n const headers = new Headers({\n accept: '*/*',\n 'accept-language': 'en-US,en;q=0.9',\n 'content-type': 'application/json',\n origin: 'https://x.com',\n priority: 'u=1, i',\n referer: 'https://x.com/',\n 'sec-ch-ua': CHROME_SEC_CH_UA,\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-site',\n 'user-agent': CHROME_USER_AGENT,\n 'x-twitter-active-user': 'yes',\n 'x-twitter-client-language': 'en',\n });\n await this.installAuthCredentials(headers);\n\n // Generate x-client-transaction-id if enabled - real browsers send this during login.\n if (this.options?.experimental?.xClientTransactionId) {\n const transactionId = await generateTransactionId(\n onboardingTaskUrl,\n this.fetch.bind(this),\n 'POST',\n );\n headers.set('x-client-transaction-id', transactionId);\n }\n\n // Strip flow_name from the body: real browsers only send it in the URL query parameter.\n const bodyData: Record<string, unknown> = { ...data };\n if ('flow_name' in bodyData) {\n delete bodyData.flow_name;\n }\n\n let res: Response;\n do {\n const fetchParameters: FetchParameters = [\n onboardingTaskUrl,\n {\n credentials: 'include',\n method: 'POST',\n headers: headers,\n body: JSON.stringify(bodyData),\n },\n ];\n\n try {\n res = await this.fetch(...fetchParameters);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n\n return {\n status: 'error',\n err: err,\n };\n }\n\n await updateCookieJar(this.jar, res.headers);\n\n log(`Response status: ${res.status}`);\n if (res.status === 429) {\n log('Rate limit hit, waiting before retrying...');\n await this.onRateLimit({\n fetchParameters: fetchParameters,\n response: res,\n });\n }\n } while (res.status === 429);\n\n // Parse the response body once - we need it for both error and success handling.\n // Twitter sometimes returns flow errors (e.g., error 399) with HTTP 400 status,\n // so we must parse the body before checking res.ok.\n let flow: TwitterUserAuthFlowResponse;\n try {\n flow = await flexParseJson(res);\n } catch {\n if (!res.ok) {\n return {\n status: 'error',\n err: new ApiError(res, 'Failed to parse response body'),\n };\n }\n return {\n status: 'error',\n err: new AuthenticationError('Failed to parse flow response.'),\n };\n }\n log(\n 'Flow response: status=%s subtasks=%s',\n flow.status,\n flow.subtasks?.map((s) => s.subtask_id).join(', '),\n );\n\n // Check for flow-level errors (can appear in both 200 and 400 responses)\n if (flow.errors?.length) {\n log('Twitter auth flow errors:', JSON.stringify(flow.errors, null, 2));\n\n // Special handling for error 399 - suspicious activity detected\n if (flow.errors[0].code === 399) {\n const message = flow.errors[0].message || '';\n\n // Extract challenge token for logging (format: \"g;...:...:...\")\n const challengeMatch = message.match(/g;[^:]+:[^:]+:[0-9]+/);\n if (challengeMatch) {\n log('Twitter challenge token detected:', challengeMatch[0]);\n }\n\n // Provide actionable error message\n return {\n status: 'error',\n err: new AuthenticationError(\n 'Twitter blocked this login attempt due to suspicious activity (error 399). ' +\n 'This is not an issue with your credentials - Twitter requires additional authentication.\\n\\n' +\n 'Solutions:\\n' +\n '1. Use cookie-based authentication (RECOMMENDED): Export cookies from your browser ' +\n 'and use scraper.setCookies() - see README for details\\n' +\n '2. Enable Two-Factor Authentication (2FA) on your account and provide totp_secret\\n' +\n '3. Wait 15 minutes before retrying (Twitter rate limit for suspicious logins)\\n' +\n '4. Login via browser first to establish device trust\\n\\n' +\n `Original error: ${message}`,\n ),\n };\n }\n\n return {\n status: 'error',\n err: new AuthenticationError(\n `Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`,\n ),\n };\n }\n\n // For non-200 responses without recognized flow errors, return generic API error\n if (!res.ok) {\n return { status: 'error', err: new ApiError(res, flow) };\n }\n\n if (flow?.flow_token == null) {\n return {\n status: 'error',\n err: new AuthenticationError('flow_token not found.'),\n };\n }\n\n if (typeof flow.flow_token !== 'string') {\n return {\n status: 'error',\n err: new AuthenticationError('flow_token was not a string.'),\n };\n }\n\n const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined;\n if (subtask && !Check(TwitterUserAuthSubtask, subtask as unknown)) {\n log(\n 'WARNING: Subtask failed schema validation: %s',\n subtask.subtask_id ?? 'unknown',\n );\n }\n\n if (subtask && subtask.subtask_id === 'DenyLoginSubtask') {\n return {\n status: 'error',\n err: new AuthenticationError('Authentication error: DenyLoginSubtask'),\n };\n }\n\n return {\n status: 'success',\n response: flow,\n };\n }\n}\n","import stringify from 'json-stable-stringify';\n\n/**\n * Examples of requests to API endpoints. These are parsed at runtime and used\n * as templates for requests to a particular endpoint. Please ensure these do\n * not contain any information that you do not want published to NPM.\n */\nconst endpoints = {\n UserTweets:\n 'https://api.x.com/graphql/eApPT8jppbYXlweF_ByTyA/UserTweets?variables=%7B%22userId%22%3A%2244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserTweetsAndReplies:\n 'https://api.x.com/graphql/aDl2OEiH_EFH10mA_ewZ9A/UserTweetsAndReplies?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserLikedTweets:\n 'https://api.x.com/graphql/JPxbOQGc_tXQ0Y29mvHKSw/Likes?variables=%7B%22userId%22%3A%222244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n UserByScreenName:\n 'https://api.x.com/graphql/AWbeRIdkLtqTRN7yL_H8yw/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withGrokTranslatedBio%22%3Atrue%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withPayments%22%3Afalse%2C%22withAuxiliaryUserLabels%22%3Atrue%7D',\n TweetDetail:\n 'https://api.x.com/graphql/ooUbmy0T2DmvwfjgARktiQ/TweetDetail?variables=%7B%22focalTweetId%22%3A%221985465713096794294%22%2C%22with_rux_injections%22%3Afalse%2C%22rankingMode%22%3A%22Relevance%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n TweetResultByRestId:\n 'https://api.x.com/graphql/d6YKjvQ920F-D4Y1PruO-A/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221985465713096794294%22%2C%22includePromotedContent%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withCommunity%22%3Atrue%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%7D',\n ListTweets:\n 'https://api.x.com/graphql/aJxgBm1YveGJCRiWJFx5WA/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n SearchTimeline:\n 'https://api.x.com/graphql/nK1dw4oV3k4w5TdtcAdSww/SearchTimeline?variables=%7B%22rawQuery%22%3A%22twitter%22%2C%22count%22%3A20%2C%22querySource%22%3A%22typed_query%22%2C%22product%22%3A%22Top%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22rweb_lists_timeline_redesign_enabled%22%3Atrue%7D',\n Followers:\n 'https://api.x.com/graphql/efNzdTpE-mkUcLARCd3RPQ/Followers?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n Following:\n 'https://api.x.com/graphql/M3LO-sJg6BCWdEliN_C2fQ/Following?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n} as const;\n\nexport interface EndpointFieldInfo {\n /**\n * Request variables, used for providing arguments such as user IDs or result counts.\n */\n variables: Record<string, unknown>;\n\n /**\n * Request features, used for encoding feature flags into the request. These may either be\n * boolean values or numerically-encoded booleans (1 or 0). It is possible this may change\n * to include other representations of booleans as Twitter's backend evolves.\n */\n features: Record<string, unknown>;\n\n /**\n * Request field toggles, used for limiting how returned fields are represented. This is\n * rarely used.\n */\n fieldToggles: Record<string, unknown>;\n}\n\ntype SomePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\ntype EndpointVersion = string;\ntype EndpointName = string;\ntype EncodedVariables = string;\ntype EncodedFeatures = string;\ntype EncodedFieldToggles = string;\n\n// TODO: Set up field-level Intellisense for the QraphQL parameters in these?\ntype BaseUrl =\n | 'https://twitter.com/i/api/graphql'\n | 'https://x.com/i/api/graphql'\n | 'https://api.x.com/graphql';\ntype EndpointFields<EndpointUrl> =\n EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}&fieldToggles=${EncodedFieldToggles}`\n ? EndpointFieldInfo\n : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}`\n ? SomePartial<EndpointFieldInfo, 'fieldToggles'>\n : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}`\n ? SomePartial<EndpointFieldInfo, 'features' | 'fieldToggles'>\n : Partial<EndpointFieldInfo>;\n\nexport type ApiRequestInfo<EndpointUrl> = EndpointFields<EndpointUrl> & {\n /**\n * The URL, without any GraphQL query parameters.\n */\n url: string;\n\n /**\n * Converts the request back into a URL to be sent to the Twitter API.\n */\n toRequestUrl(): string;\n};\n\n/** Wrapper class for API request information. */\nclass ApiRequest<EndpointUrl> {\n url: string;\n variables?: Record<string, unknown> | undefined;\n features?: Record<string, unknown> | undefined;\n fieldToggles?: Record<string, unknown> | undefined;\n\n constructor(info: Omit<ApiRequestInfo<EndpointUrl>, 'toRequestUrl'>) {\n this.url = info.url;\n this.variables = info.variables;\n this.features = info.features;\n this.fieldToggles = info.fieldToggles;\n }\n\n toRequestUrl(): string {\n const params = new URLSearchParams();\n\n // Only include query parameters with values\n if (this.variables) {\n // Stringify with the query keys in sorted order like the Go package\n const variablesStr = stringify(this.variables);\n if (variablesStr) params.set('variables', variablesStr);\n }\n\n if (this.features) {\n const featuresStr = stringify(this.features);\n if (featuresStr) params.set('features', featuresStr);\n }\n\n if (this.fieldToggles) {\n const fieldTogglesStr = stringify(this.fieldToggles);\n if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr);\n }\n\n return `${this.url}?${params.toString()}`;\n }\n}\n\n/**\n * Parses information from a Twitter API endpoint using an example request\n * URL against that endpoint. This can be used to extract GraphQL parameters\n * in order to easily reuse and/or override them later.\n * @param example An example of the endpoint to analyze.\n * @returns The parsed endpoint information.\n */\nfunction parseEndpointExample<\n Endpoints,\n Endpoint extends string & keyof Endpoints,\n>(example: Endpoint): ApiRequestInfo<Endpoints[Endpoint]> {\n const { protocol, host, pathname, searchParams: query } = new URL(example);\n\n const base = `${protocol}//${host}${pathname}`;\n const variables = query.get('variables');\n const features = query.get('features');\n const fieldToggles = query.get('fieldToggles');\n\n return new ApiRequest<Endpoints[Endpoint]>({\n url: base,\n variables: variables ? JSON.parse(variables) : undefined,\n features: features ? JSON.parse(features) : undefined,\n fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined,\n } as Omit<ApiRequestInfo<Endpoints[Endpoint]>, 'toRequestUrl'>) as ApiRequestInfo<\n Endpoints[Endpoint]\n >;\n}\n\ntype ApiRequestFactory<Endpoints> = {\n [Endpoint in keyof Endpoints as `create${string &\n Endpoint}Request`]: () => ApiRequestInfo<Endpoints[Endpoint]>;\n};\n\nfunction createApiRequestFactory<Endpoints extends Record<string, string>>(\n endpoints: Endpoints,\n): ApiRequestFactory<Endpoints> {\n type UntypedApiRequestFactory = ApiRequestFactory<Record<string, string>>;\n\n return Object.entries(endpoints)\n .map<UntypedApiRequestFactory>(([endpointName, endpointExample]) => {\n // Create a partial factory for only one endpoint\n return {\n [`create${endpointName}Request`]: () => {\n // Create a new instance on each invocation so that we can safely\n // mutate requests before sending them off\n return parseEndpointExample<Endpoints, any>(endpointExample);\n },\n };\n })\n .reduce((agg, next) => {\n // Merge all of our factories into one that includes every endpoint\n return Object.assign(agg, next);\n }) as ApiRequestFactory<Endpoints>;\n}\n\nexport const apiRequestFactory = createApiRequestFactory(endpoints);\n","import { requestApi, RequestApiResult, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TwitterApiErrorRaw } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport interface CoreUserRaw {\n created_at?: string;\n name?: string;\n screen_name?: string;\n}\n\nexport interface LegacyUserRaw {\n created_at?: string;\n description?: string;\n entities?: {\n url?: {\n urls?: {\n url?: string;\n expanded_url?: string;\n display_url?: string;\n indices?: [number, number];\n }[];\n };\n description?: {\n // TODO: Get the proper type of this.\n urls?: any[];\n };\n };\n favourites_count?: number;\n followers_count?: number;\n friends_count?: number;\n media_count?: number;\n statuses_count?: number;\n id_str?: string;\n listed_count?: number;\n name?: string;\n location?: string;\n geo_enabled?: boolean;\n pinned_tweet_ids_str?: string[];\n profile_background_color?: string;\n profile_banner_url?: string;\n profile_image_url_https?: string;\n protected?: boolean;\n screen_name?: string;\n verified?: boolean;\n has_custom_timelines?: boolean;\n has_extended_profile?: boolean;\n url?: string;\n can_dm?: boolean;\n id?: number;\n // TODO: Get the proper type of this.\n utc_offset?: any;\n // TODO: Get the proper type of this.\n time_zone?: any;\n // TODO: Get the proper type of this.\n lang?: any;\n contributors_enabled?: boolean;\n is_translator?: boolean;\n is_translation_enabled?: boolean;\n profile_background_image_url?: string;\n profile_background_image_url_https?: string;\n profile_background_tile?: boolean;\n profile_image_url?: string;\n profile_link_color?: string;\n profile_sidebar_border_color?: string;\n profile_sidebar_fill_color?: string;\n profile_text_color?: string;\n profile_use_background_image?: boolean;\n default_profile?: boolean;\n default_profile_image?: boolean;\n can_secret_dm?: boolean;\n can_media_tag?: boolean;\n following?: boolean;\n follow_request_sent?: boolean;\n notifications?: boolean;\n blocking?: boolean;\n subscribed_by?: boolean;\n blocked_by?: boolean;\n want_retweets?: boolean;\n dm_blocked_by?: boolean;\n dm_blocking?: boolean;\n business_profile_state?: string;\n translator_type?: string;\n // TODO: Get the proper type of this.\n withheld_in_countries?: any[];\n followed_by?: boolean;\n}\n\n/**\n * A parsed profile object.\n */\nexport interface Profile {\n avatar?: string;\n banner?: string;\n biography?: string;\n birthday?: string;\n followersCount?: number;\n followingCount?: number;\n friendsCount?: number;\n mediaCount?: number;\n statusesCount?: number;\n isPrivate?: boolean;\n isVerified?: boolean;\n isBlueVerified?: boolean;\n joined?: Date;\n likesCount?: number;\n listedCount?: number;\n location?: string;\n name?: string;\n pinnedTweetIds?: string[];\n tweetsCount?: number;\n url?: string;\n userId?: string;\n username?: string;\n website?: string;\n canDm?: boolean;\n}\n\nexport interface UserRaw {\n data: {\n user: {\n result: {\n __typename?: string;\n message?: string;\n reason?: string;\n rest_id?: string;\n is_blue_verified?: boolean;\n legacy: LegacyUserRaw;\n core?: CoreUserRaw;\n avatar?: {\n image_url?: string;\n };\n location?: {\n location?: string;\n };\n };\n };\n };\n errors?: TwitterApiErrorRaw[];\n}\n\nfunction getAvatarOriginalSizeUrl(avatarUrl: string | undefined) {\n return avatarUrl ? avatarUrl.replace('_normal', '') : undefined;\n}\n\nexport function parseProfile(\n legacy: LegacyUserRaw,\n isBlueVerified?: boolean,\n): Profile {\n const profile: Profile = {\n avatar: getAvatarOriginalSizeUrl(legacy.profile_image_url_https),\n banner: legacy.profile_banner_url,\n biography: legacy.description,\n followersCount: legacy.followers_count,\n followingCount: legacy.friends_count,\n friendsCount: legacy.friends_count,\n mediaCount: legacy.media_count,\n isPrivate: legacy.protected ?? false,\n isVerified: legacy.verified,\n likesCount: legacy.favourites_count,\n listedCount: legacy.listed_count,\n location: legacy.location,\n name: legacy.name,\n pinnedTweetIds: legacy.pinned_tweet_ids_str,\n tweetsCount: legacy.statuses_count,\n url: `https://x.com/${legacy.screen_name}`,\n userId: legacy.id_str,\n username: legacy.screen_name,\n isBlueVerified: isBlueVerified ?? false,\n canDm: legacy.can_dm,\n };\n\n if (legacy.created_at != null) {\n profile.joined = new Date(Date.parse(legacy.created_at));\n }\n\n const urls = legacy.entities?.url?.urls;\n if (urls?.length != null && urls?.length > 0) {\n profile.website = urls[0].expanded_url;\n }\n\n return profile;\n}\n\nexport async function getProfile(\n username: string,\n auth: TwitterAuth,\n): Promise<RequestApiResult<Profile>> {\n const request = apiRequestFactory.createUserByScreenNameRequest();\n request.variables.screen_name = username;\n\n // Use bearerToken2 for UserByScreenName endpoint\n const res = await requestApi<UserRaw>(\n request.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n if (!res.success) {\n return res;\n }\n\n const { value } = res;\n const { errors } = value;\n if (\n (!value.data || !value.data.user || !value.data.user.result) &&\n errors != null &&\n errors.length > 0\n ) {\n return {\n success: false,\n err: new Error(errors.map((e) => e.message).join('\\n')),\n };\n }\n\n if (!value.data || !value.data.user || !value.data.user.result) {\n return {\n success: false,\n err: new Error('User not found.'),\n };\n }\n const { result: user } = value.data.user;\n const { legacy } = user;\n\n if (user.__typename === 'UserUnavailable' && user?.reason === 'Suspended') {\n return {\n success: false,\n err: new Error('User is suspended.'),\n };\n }\n\n if (user.rest_id == null || user.rest_id.length === 0) {\n return {\n success: false,\n err: new Error('rest_id not found.'),\n };\n }\n\n legacy.id_str = user.rest_id;\n legacy.screen_name ??= user.core?.screen_name;\n legacy.profile_image_url_https ??= user.avatar?.image_url;\n legacy.created_at ??= user.core?.created_at;\n legacy.location ??= user.location?.location;\n legacy.name ??= user.core?.name;\n\n if (legacy.screen_name == null || legacy.screen_name.length === 0) {\n return {\n success: false,\n err: new Error(`User ${username} does not exist or is private.`),\n };\n }\n\n return {\n success: true,\n value: parseProfile(legacy, user.is_blue_verified),\n };\n}\n\nconst idCache = new Map<string, string>();\n\nexport async function getUserIdByScreenName(\n screenName: string,\n auth: TwitterAuth,\n): Promise<RequestApiResult<string>> {\n const cached = idCache.get(screenName);\n if (cached != null) {\n return { success: true, value: cached };\n }\n\n const profileRes = await getProfile(screenName, auth);\n if (!profileRes.success) {\n return profileRes;\n }\n\n const profile = profileRes.value;\n if (profile.userId != null) {\n idCache.set(screenName, profile.userId);\n\n return {\n success: true,\n value: profile.userId,\n };\n }\n\n return {\n success: false,\n err: new Error('User ID is undefined.'),\n };\n}\n","import { jitter } from './api';\nimport { Profile } from './profile';\nimport { Tweet } from './tweets';\n\nexport interface FetchProfilesResponse {\n profiles: Profile[];\n next?: string;\n}\n\nexport type FetchProfiles = (\n query: string,\n maxProfiles: number,\n cursor: string | undefined,\n) => Promise<FetchProfilesResponse>;\n\nexport interface FetchTweetsResponse {\n tweets: Tweet[];\n next?: string;\n}\n\nexport type FetchTweets = (\n query: string,\n maxTweets: number,\n cursor: string | undefined,\n) => Promise<FetchTweetsResponse>;\n\nexport async function* getUserTimeline(\n query: string,\n maxProfiles: number,\n fetchFunc: FetchProfiles,\n): AsyncGenerator<Profile, void> {\n let nProfiles = 0;\n let cursor: string | undefined = undefined;\n let consecutiveEmptyBatches = 0;\n while (nProfiles < maxProfiles) {\n const batch: FetchProfilesResponse = await fetchFunc(\n query,\n maxProfiles,\n cursor,\n );\n\n const { profiles, next } = batch;\n cursor = next;\n\n if (profiles.length === 0) {\n consecutiveEmptyBatches++;\n if (consecutiveEmptyBatches > 5) break;\n } else consecutiveEmptyBatches = 0;\n\n for (const profile of profiles) {\n if (nProfiles < maxProfiles) yield profile;\n else break;\n nProfiles++;\n }\n\n if (!next) break;\n\n await jitter(1000);\n }\n}\n\nexport async function* getTweetTimeline(\n query: string,\n maxTweets: number,\n fetchFunc: FetchTweets,\n): AsyncGenerator<Tweet, void> {\n let nTweets = 0;\n let cursor: string | undefined = undefined;\n while (nTweets < maxTweets) {\n const batch: FetchTweetsResponse = await fetchFunc(\n query,\n maxTweets,\n cursor,\n );\n\n const { tweets, next } = batch;\n\n if (tweets.length === 0) {\n break;\n }\n\n for (const tweet of tweets) {\n if (nTweets < maxTweets) {\n cursor = next;\n yield tweet;\n } else {\n break;\n }\n\n nTweets++;\n }\n\n await jitter(1000);\n }\n}\n","export type NonNullableField<T, K extends keyof T> = {\n [P in K]-?: T[P];\n} & T;\n\nexport function isFieldDefined<T, K extends keyof T>(key: K) {\n return function (value: T): value is NonNullableField<T, K> {\n return isDefined(value[key]);\n };\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value != null;\n}\n","import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1';\nimport { Photo, Video } from './tweets';\nimport { isFieldDefined, NonNullableField } from './type-util';\n\nconst reHashtag = /\\B(\\#\\S+\\b)/g;\nconst reCashtag = /\\B(\\$\\S+\\b)/g;\nconst reTwitterUrl = /https:(\\/\\/t\\.co\\/([A-Za-z0-9]|[A-Za-z]){10})/g;\nconst reUsername = /\\B(\\@\\S{1,15}\\b)/g;\n\nexport function parseMediaGroups(media: TimelineMediaExtendedRaw[]): {\n sensitiveContent?: boolean;\n photos: Photo[];\n videos: Video[];\n} {\n const photos: Photo[] = [];\n const videos: Video[] = [];\n let sensitiveContent: boolean | undefined = undefined;\n\n for (const m of media\n .filter(isFieldDefined('id_str'))\n .filter(isFieldDefined('media_url_https'))) {\n if (m.type === 'photo') {\n photos.push({\n id: m.id_str,\n url: m.media_url_https,\n alt_text: m.ext_alt_text,\n });\n } else if (m.type === 'video') {\n videos.push(parseVideo(m));\n } else if (m.type === 'animated_gif') {\n videos.push(parseGif(m));\n }\n\n const sensitive = m.ext_sensitive_media_warning;\n if (sensitive != null) {\n sensitiveContent =\n sensitive.adult_content ||\n sensitive.graphic_violence ||\n sensitive.other;\n }\n }\n\n return { sensitiveContent, photos, videos };\n}\n\nfunction parseGif(\n m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n const gif: Video = {\n id: m.id_str,\n preview: m.media_url_https,\n };\n\n const variants = m.video_info?.variants ?? [];\n\n const url = variants.find((v) => v.content_type === 'video/mp4')?.url;\n\n if (url) {\n gif.preview = url;\n gif.url = url;\n }\n\n return gif;\n}\n\nfunction parseVideo(\n m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n const video: Video = {\n id: m.id_str,\n preview: m.media_url_https,\n };\n\n let maxBitrate = 0;\n const variants = m.video_info?.variants ?? [];\n for (const variant of variants) {\n const bitrate = variant.bitrate;\n if (bitrate != null && bitrate > maxBitrate && variant.url != null) {\n let variantUrl = variant.url;\n const stringStart = 0;\n const tagSuffixIdx = variantUrl.indexOf('?tag=10');\n if (tagSuffixIdx !== -1) {\n variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);\n }\n\n video.url = variantUrl;\n maxBitrate = bitrate;\n }\n }\n\n return video;\n}\n\nexport function reconstructTweetHtml(\n tweet: LegacyTweetRaw,\n photos: Photo[],\n videos: Video[],\n): string {\n const media: string[] = [];\n\n // HTML parsing with regex :)\n let html = tweet.full_text ?? '';\n\n html = html.replace(reHashtag, linkHashtagHtml);\n html = html.replace(reCashtag, linkCashtagHtml);\n html = html.replace(reUsername, linkUsernameHtml);\n html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media));\n\n for (const { url } of photos) {\n if (media.indexOf(url) !== -1) {\n continue;\n }\n\n html += `<br><img src=\"${url}\"/>`;\n }\n\n for (const { preview: url } of videos) {\n if (media.indexOf(url) !== -1) {\n continue;\n }\n\n html += `<br><img src=\"${url}\"/>`;\n }\n\n html = html.replace(/\\n/g, '<br>');\n\n return html;\n}\n\nfunction linkHashtagHtml(hashtag: string) {\n return `<a href=\"https://x.com/hashtag/${hashtag.replace(\n '#',\n '',\n )}\">${hashtag}</a>`;\n}\n\nfunction linkCashtagHtml(cashtag: string) {\n return `<a href=\"https://x.com/search?q=%24${cashtag.replace(\n '$',\n '',\n )}\">${cashtag}</a>`;\n}\n\nfunction linkUsernameHtml(username: string) {\n return `<a href=\"https://x.com/${username.replace('@', '')}\">${username}</a>`;\n}\n\nfunction unwrapTcoUrlHtml(tweet: LegacyTweetRaw, foundedMedia: string[]) {\n return function (tco: string) {\n for (const entity of tweet.entities?.urls ?? []) {\n if (tco === entity.url && entity.expanded_url != null) {\n return `<a href=\"${entity.expanded_url}\">${tco}</a>`;\n }\n }\n\n for (const entity of tweet.extended_entities?.media ?? []) {\n if (tco === entity.url && entity.media_url_https != null) {\n foundedMedia.push(entity.media_url_https);\n return `<br><a href=\"${tco}\"><img src=\"${entity.media_url_https}\"/></a>`;\n }\n }\n\n return tco;\n };\n}\n","import { CoreUserRaw, LegacyUserRaw } from './profile';\nimport { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util';\nimport {\n EditControlInitialRaw,\n LegacyTweetRaw,\n ParseTweetResult,\n QueryTweetsResponse,\n SearchResultRaw,\n TimelineResultRaw,\n} from './timeline-v1';\nimport { Tweet } from './tweets';\nimport { isFieldDefined } from './type-util';\n\nexport interface TimelineUserResultRaw {\n rest_id?: string;\n legacy?: LegacyUserRaw;\n is_blue_verified?: boolean;\n core?: CoreUserRaw;\n}\n\nexport interface TimelineEntryItemContentRaw {\n itemType?: string;\n __typename?: string;\n tweetDisplayType?: string;\n tweetResult?: {\n result?: TimelineResultRaw;\n };\n tweet_results?: {\n result?: TimelineResultRaw;\n };\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface TimelineEntryRaw {\n entryId: string;\n content?: {\n entryType?: string;\n __typename?: string;\n cursorType?: string;\n value?: string;\n items?: {\n entryId?: string;\n item?: {\n content?: TimelineEntryItemContentRaw;\n itemContent?: SearchEntryItemContentRaw;\n };\n }[];\n itemContent?: TimelineEntryItemContentRaw;\n };\n}\n\nexport interface SearchEntryItemContentRaw {\n tweetDisplayType?: string;\n tweet_results?: {\n result?: SearchResultRaw;\n };\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface SearchEntryRaw {\n entryId: string;\n sortIndex: string;\n content?: {\n cursorType?: string;\n entryType?: string;\n __typename?: string;\n value?: string;\n items?: {\n item?: {\n content?: SearchEntryItemContentRaw;\n };\n }[];\n itemContent?: SearchEntryItemContentRaw;\n };\n}\n\nexport interface TimelineInstruction {\n entries?: TimelineEntryRaw[];\n entry?: TimelineEntryRaw;\n type?: string;\n}\n\nexport interface TimelineV2 {\n data?: {\n user?: {\n result?: {\n __typename?: string;\n timeline?: {\n timeline?: {\n instructions?: TimelineInstruction[];\n };\n };\n };\n };\n };\n}\n\nexport interface ThreadedConversation {\n data?: {\n threaded_conversation_with_injections_v2?: {\n instructions?: TimelineInstruction[];\n };\n };\n}\n\nfunction getLegacyTweetId(tweet: Readonly<LegacyTweetRaw>): string | undefined {\n if (tweet.id_str) {\n return tweet.id_str;\n }\n\n return tweet.conversation_id_str;\n}\n\nexport function parseLegacyTweet(\n coreUser?: Readonly<CoreUserRaw>,\n user?: Readonly<LegacyUserRaw>,\n tweet?: Readonly<LegacyTweetRaw>,\n editControl?: Readonly<EditControlInitialRaw>,\n): ParseTweetResult {\n if (tweet == null) {\n return {\n success: false,\n err: new Error('Tweet was not found in the timeline object.'),\n };\n }\n\n if (user == null) {\n return {\n success: false,\n err: new Error('User was not found in the timeline object.'),\n };\n }\n\n const tweetId = getLegacyTweetId(tweet);\n if (!tweetId) {\n return {\n success: false,\n err: new Error('Tweet ID was not found in object.'),\n };\n }\n\n const hashtags = tweet.entities?.hashtags ?? [];\n const mentions = tweet.entities?.user_mentions ?? [];\n const media = tweet.extended_entities?.media ?? [];\n const pinnedTweets = new Set<string | undefined>(\n user.pinned_tweet_ids_str ?? [],\n );\n const urls = tweet.entities?.urls ?? [];\n const { photos, videos, sensitiveContent } = parseMediaGroups(media);\n\n // The edit tweets array always contains the original tweet, even if it has not been edited\n const tweetVersions = editControl?.edit_tweet_ids ?? [tweetId];\n\n const name = user.name ?? coreUser?.name;\n const username = user.screen_name ?? coreUser?.screen_name;\n const tw: Tweet = {\n __raw_UNSTABLE: tweet,\n bookmarkCount: tweet.bookmark_count,\n conversationId: tweet.conversation_id_str,\n id: tweetId,\n hashtags: hashtags\n .filter(isFieldDefined('text'))\n .map((hashtag) => hashtag.text),\n likes: tweet.favorite_count,\n mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({\n id: mention.id_str,\n username: mention.screen_name,\n name: mention.name,\n })),\n name: name,\n permanentUrl: `https://x.com/${username}/status/${tweetId}`,\n photos,\n replies: tweet.reply_count,\n retweets: tweet.retweet_count,\n text: tweet.full_text,\n thread: [],\n urls: urls\n .filter(isFieldDefined('expanded_url'))\n .map((url) => url.expanded_url),\n userId: tweet.user_id_str,\n username: username,\n videos,\n isQuoted: false,\n isReply: false,\n isEdited: tweetVersions.length > 1,\n versions: tweetVersions,\n isRetweet: false,\n isPin: false,\n sensitiveContent: false,\n };\n\n if (tweet.created_at) {\n tw.timeParsed = new Date(Date.parse(tweet.created_at));\n tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);\n }\n\n if (tweet.place?.id) {\n tw.place = tweet.place;\n }\n\n const quotedStatusIdStr = tweet.quoted_status_id_str;\n const inReplyToStatusIdStr = tweet.in_reply_to_status_id_str;\n const retweetedStatusIdStr = tweet.retweeted_status_id_str;\n const retweetedStatusResult = tweet.retweeted_status_result?.result;\n\n if (quotedStatusIdStr) {\n tw.isQuoted = true;\n tw.quotedStatusId = quotedStatusIdStr;\n }\n\n if (inReplyToStatusIdStr) {\n tw.isReply = true;\n tw.inReplyToStatusId = inReplyToStatusIdStr;\n }\n\n if (retweetedStatusIdStr || retweetedStatusResult) {\n tw.isRetweet = true;\n tw.retweetedStatusId = retweetedStatusIdStr;\n\n if (retweetedStatusResult) {\n const parsedResult = parseLegacyTweet(\n retweetedStatusResult?.core?.user_results?.result?.core,\n retweetedStatusResult?.core?.user_results?.result?.legacy,\n retweetedStatusResult?.legacy,\n retweetedStatusResult?.edit_control?.edit_control_initial,\n );\n\n if (parsedResult.success) {\n tw.retweetedStatus = parsedResult.tweet;\n }\n }\n }\n\n const views = parseInt(tweet.ext_views?.count ?? '');\n if (!isNaN(views)) {\n tw.views = views;\n }\n\n if (pinnedTweets.has(tweetId)) {\n // TODO: Update tests so this can be assigned at the tweet declaration\n tw.isPin = true;\n }\n\n if (sensitiveContent) {\n // TODO: Update tests so this can be assigned at the tweet declaration\n tw.sensitiveContent = true;\n }\n\n tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos);\n\n return { success: true, tweet: tw };\n}\n\nfunction parseResult(result?: TimelineResultRaw): ParseTweetResult {\n const noteTweetResultText =\n result?.note_tweet?.note_tweet_results?.result?.text;\n\n if (result?.legacy && noteTweetResultText) {\n result.legacy.full_text = noteTweetResultText;\n }\n\n const tweetResult = parseLegacyTweet(\n result?.core?.user_results?.result?.core,\n result?.core?.user_results?.result?.legacy,\n result?.legacy,\n result?.edit_control?.edit_control_initial,\n );\n if (!tweetResult.success) {\n return tweetResult;\n }\n\n if (!tweetResult.tweet.views && result?.views?.count) {\n const views = parseInt(result.views.count);\n if (!isNaN(views)) {\n tweetResult.tweet.views = views;\n }\n }\n\n const quotedResult = result?.quoted_status_result?.result;\n if (quotedResult) {\n if (quotedResult.legacy && quotedResult.rest_id) {\n quotedResult.legacy.id_str = quotedResult.rest_id;\n }\n\n const quotedTweetResult = parseResult(quotedResult);\n if (quotedTweetResult.success) {\n tweetResult.tweet.quotedStatus = quotedTweetResult.tweet;\n }\n }\n\n return tweetResult;\n}\n\nconst expectedEntryTypes = ['tweet', 'profile-conversation'];\n\nfunction getTimelineInstructionEntries(\n instruction: TimelineInstruction,\n): TimelineEntryRaw[] {\n const entries = instruction.entries ?? [];\n if (instruction.entry) {\n entries.push(instruction.entry);\n }\n return entries;\n}\n\nexport function parseTimelineTweetsV2(\n timeline: TimelineV2,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n for (const instruction of instructions) {\n const entries = getTimelineInstructionEntries(instruction);\n for (const entry of entries) {\n const entryContent = entry.content;\n if (!entryContent) continue;\n\n // Handle pagination\n if (entryContent.cursorType === 'Bottom') {\n bottomCursor = entryContent.value;\n continue;\n } else if (entryContent.cursorType === 'Top') {\n topCursor = entryContent.value;\n continue;\n }\n\n const idStr = entry.entryId;\n if (\n !expectedEntryTypes.some((entryType) => idStr.startsWith(entryType))\n ) {\n continue;\n }\n\n if (entryContent.itemContent) {\n // Typically TimelineTimelineTweet entries\n parseAndPush(tweets, entryContent.itemContent, idStr);\n } else if (entryContent.items) {\n // Typically TimelineTimelineModule entries\n for (const item of entryContent.items) {\n if (item.item?.itemContent) {\n parseAndPush(tweets, item.item.itemContent, idStr);\n }\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseTimelineEntryItemContentRaw(\n content: TimelineEntryItemContentRaw,\n entryId: string,\n isConversation = false,\n) {\n let result = content.tweet_results?.result ?? content.tweetResult?.result;\n if (\n result?.__typename === 'Tweet' ||\n (result?.__typename === 'TweetWithVisibilityResults' && result?.tweet)\n ) {\n if (result?.__typename === 'TweetWithVisibilityResults')\n result = result.tweet;\n\n if (result?.legacy) {\n result.legacy.id_str =\n result.rest_id ??\n entryId.replace('conversation-', '').replace('tweet-', '');\n }\n\n const tweetResult = parseResult(result);\n if (tweetResult.success) {\n if (isConversation) {\n if (content?.tweetDisplayType === 'SelfThread') {\n tweetResult.tweet.isSelfThread = true;\n }\n }\n\n return tweetResult.tweet;\n }\n }\n\n return null;\n}\n\nexport function parseAndPush(\n tweets: Tweet[],\n content: TimelineEntryItemContentRaw,\n entryId: string,\n isConversation = false,\n) {\n const tweet = parseTimelineEntryItemContentRaw(\n content,\n entryId,\n isConversation,\n );\n\n if (tweet) {\n tweets.push(tweet);\n }\n}\n\nexport function parseThreadedConversation(\n conversation: ThreadedConversation,\n): Tweet[] {\n const tweets: Tweet[] = [];\n const instructions =\n conversation.data?.threaded_conversation_with_injections_v2?.instructions ??\n [];\n\n for (const instruction of instructions) {\n const entries = getTimelineInstructionEntries(instruction);\n for (const entry of entries) {\n const entryContent = entry.content?.itemContent;\n if (entryContent) {\n parseAndPush(tweets, entryContent, entry.entryId, true);\n }\n\n for (const item of entry.content?.items ?? []) {\n const itemContent = item.item?.itemContent;\n if (itemContent) {\n parseAndPush(tweets, itemContent, entry.entryId, true);\n }\n }\n }\n }\n\n for (const tweet of tweets) {\n if (tweet.inReplyToStatusId) {\n for (const parentTweet of tweets) {\n if (parentTweet.id === tweet.inReplyToStatusId) {\n tweet.inReplyToStatus = parentTweet;\n break;\n }\n }\n }\n\n if (tweet.isSelfThread && tweet.conversationId === tweet.id) {\n for (const childTweet of tweets) {\n if (childTweet.isSelfThread && childTweet.id !== tweet.id) {\n tweet.thread.push(childTweet);\n }\n }\n\n if (tweet.thread.length === 0) {\n tweet.isSelfThread = false;\n }\n }\n }\n\n return tweets;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { SearchEntryRaw, parseLegacyTweet } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface SearchTimeline {\n data?: {\n search_by_raw_query?: {\n search_timeline?: {\n timeline?: {\n instructions?: {\n entries?: SearchEntryRaw[];\n entry?: SearchEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n}\n\nexport function parseSearchTimelineTweets(\n timeline: SearchTimeline,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.search_by_raw_query?.search_timeline?.timeline\n ?.instructions ?? [];\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n } else if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.tweetDisplayType === 'Tweet') {\n const tweetResultRaw = itemContent.tweet_results?.result;\n const tweetResult = parseLegacyTweet(\n tweetResultRaw?.core?.user_results?.result?.core,\n tweetResultRaw?.core?.user_results?.result?.legacy,\n tweetResultRaw?.legacy,\n tweetResultRaw?.edit_control?.edit_control_initial,\n );\n\n if (tweetResult.success) {\n if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) {\n const views = parseInt(tweetResultRaw.views.count);\n if (!isNaN(views)) {\n tweetResult.tweet.views = views;\n }\n }\n\n tweets.push(tweetResult.tweet);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseSearchTimelineUsers(\n timeline: SearchTimeline,\n): QueryProfilesResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const profiles: Profile[] = [];\n const instructions =\n timeline.data?.search_by_raw_query?.search_timeline?.timeline\n ?.instructions ?? [];\n\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n } else if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.userDisplayType === 'User') {\n const userResultRaw = itemContent.user_results?.result;\n\n if (userResultRaw?.legacy) {\n const profile = parseProfile(\n userResultRaw.legacy,\n userResultRaw.is_blue_verified,\n );\n\n if (!profile.userId) {\n profile.userId = userResultRaw.rest_id;\n }\n\n profiles.push(profile);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTweetTimeline, getUserTimeline } from './timeline-async';\nimport { Tweet } from './tweets';\nimport {\n SearchTimeline,\n parseSearchTimelineTweets,\n parseSearchTimelineUsers,\n} from './timeline-search';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\n/**\n * The categories that can be used in Twitter searches.\n */\nexport enum SearchMode {\n Top,\n Latest,\n Photos,\n Videos,\n Users,\n}\n\nexport function searchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(query, maxTweets, (q, mt, c) => {\n return fetchSearchTweets(q, mt, searchMode, auth, c);\n });\n}\n\nexport function searchProfiles(\n query: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(query, maxProfiles, (q, mt, c) => {\n return fetchSearchProfiles(q, mt, auth, c);\n });\n}\n\nexport async function fetchSearchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryTweetsResponse> {\n const timeline = await getSearchTimeline(\n query,\n maxTweets,\n searchMode,\n auth,\n cursor,\n );\n\n return parseSearchTimelineTweets(timeline);\n}\n\nexport async function fetchSearchProfiles(\n query: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n const timeline = await getSearchTimeline(\n query,\n maxProfiles,\n SearchMode.Users,\n auth,\n cursor,\n );\n\n return parseSearchTimelineUsers(timeline);\n}\n\nasync function getSearchTimeline(\n query: string,\n maxItems: number,\n searchMode: SearchMode,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<SearchTimeline> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError('Scraper is not logged-in for search.');\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const searchTimelineRequest = apiRequestFactory.createSearchTimelineRequest();\n searchTimelineRequest.variables.rawQuery = query;\n searchTimelineRequest.variables.count = maxItems;\n searchTimelineRequest.variables.querySource = 'typed_query';\n searchTimelineRequest.variables.product = 'Top';\n\n if (cursor != null && cursor != '') {\n searchTimelineRequest.variables['cursor'] = cursor;\n }\n\n switch (searchMode) {\n case SearchMode.Latest:\n searchTimelineRequest.variables.product = 'Latest';\n break;\n case SearchMode.Photos:\n searchTimelineRequest.variables.product = 'Photos';\n break;\n case SearchMode.Videos:\n searchTimelineRequest.variables.product = 'Videos';\n break;\n case SearchMode.Users:\n searchTimelineRequest.variables.product = 'People';\n break;\n default:\n break;\n }\n\n const res = await requestApi<SearchTimeline>(\n searchTimelineRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { TimelineUserResultRaw } from './timeline-v2';\n\nexport interface RelationshipEntryItemContentRaw {\n itemType?: string;\n userDisplayType?: string;\n user_results?: {\n result?: TimelineUserResultRaw;\n };\n}\n\nexport interface RelationshipEntryRaw {\n entryId: string;\n sortIndex: string;\n content?: {\n cursorType?: string;\n entryType?: string;\n __typename?: string;\n value?: string;\n itemContent?: RelationshipEntryItemContentRaw;\n };\n}\n\nexport interface RelationshipTimeline {\n data?: {\n user?: {\n result?: {\n timeline?: {\n timeline?: {\n instructions?: {\n entries?: RelationshipEntryRaw[];\n entry?: RelationshipEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n };\n}\n\nexport function parseRelationshipTimeline(\n timeline: RelationshipTimeline,\n): QueryProfilesResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const profiles: Profile[] = [];\n const instructions =\n timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n\n for (const instruction of instructions) {\n if (\n instruction.type === 'TimelineAddEntries' ||\n instruction.type === 'TimelineReplaceEntry'\n ) {\n if (instruction.entry?.content?.cursorType === 'Bottom') {\n bottomCursor = instruction.entry.content.value;\n continue;\n }\n\n if (instruction.entry?.content?.cursorType === 'Top') {\n topCursor = instruction.entry.content.value;\n continue;\n }\n\n const entries = instruction.entries ?? [];\n for (const entry of entries) {\n const itemContent = entry.content?.itemContent;\n if (itemContent?.userDisplayType === 'User') {\n const userResultRaw = itemContent.user_results?.result;\n\n if (userResultRaw?.legacy) {\n const profile = parseProfile(\n userResultRaw.legacy,\n userResultRaw.is_blue_verified,\n );\n\n if (!profile.userId) {\n profile.userId = userResultRaw.rest_id;\n }\n\n // FIX: Twitter moved screen_name from legacy to core\n if (!profile.username && userResultRaw.core?.screen_name) {\n profile.username = userResultRaw.core.screen_name;\n profile.url = `https://x.com/${profile.username}`;\n }\n\n // FIX: Twitter moved created_at from legacy to core\n if (!profile.joined && userResultRaw.core?.created_at) {\n profile.joined = new Date(\n Date.parse(userResultRaw.core.created_at),\n );\n }\n\n profiles.push(profile);\n }\n } else if (entry.content?.cursorType === 'Bottom') {\n bottomCursor = entry.content.value;\n } else if (entry.content?.cursorType === 'Top') {\n topCursor = entry.content.value;\n }\n }\n }\n }\n\n return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { getUserTimeline } from './timeline-async';\nimport {\n RelationshipTimeline,\n parseRelationshipTimeline,\n} from './timeline-relationship';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport function getFollowing(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n return fetchProfileFollowing(q, mt, auth, c);\n });\n}\n\nexport function getFollowers(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n return fetchProfileFollowers(q, mt, auth, c);\n });\n}\n\nexport async function fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile following.',\n );\n }\n\n const timeline = await getFollowingTimeline(\n userId,\n maxProfiles,\n auth,\n cursor,\n );\n\n return parseRelationshipTimeline(timeline);\n}\n\nexport async function fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<QueryProfilesResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile followers.',\n );\n }\n\n const timeline = await getFollowersTimeline(\n userId,\n maxProfiles,\n auth,\n cursor,\n );\n\n return parseRelationshipTimeline(timeline);\n}\n\nasync function getFollowingTimeline(\n userId: string,\n maxItems: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<RelationshipTimeline> {\n if (!auth.isLoggedIn()) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile following.',\n );\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const followingRequest = apiRequestFactory.createFollowingRequest();\n followingRequest.variables.userId = userId;\n followingRequest.variables.count = maxItems;\n followingRequest.variables.includePromotedContent = false;\n\n if (cursor != null && cursor != '') {\n followingRequest.variables.cursor = cursor;\n }\n\n const res = await requestApi<RelationshipTimeline>(\n followingRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n\nasync function getFollowersTimeline(\n userId: string,\n maxItems: number,\n auth: TwitterAuth,\n cursor?: string,\n): Promise<RelationshipTimeline> {\n if (!auth.isLoggedIn()) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for profile followers.',\n );\n }\n\n if (maxItems > 50) {\n maxItems = 50;\n }\n\n const followersRequest = apiRequestFactory.createFollowersRequest();\n followersRequest.variables.userId = userId;\n followersRequest.variables.count = maxItems;\n followersRequest.variables.includePromotedContent = false;\n\n if (cursor != null && cursor != '') {\n followersRequest.variables.cursor = cursor;\n }\n\n const res = await requestApi<RelationshipTimeline>(\n followersRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { addApiParams, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TimelineV1 } from './timeline-v1';\n\nexport async function getTrends(auth: TwitterAuth): Promise<string[]> {\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('count', '20');\n params.set('candidate_source', 'trends');\n params.set('include_page_configuration', 'false');\n params.set('entity_tokens', 'false');\n\n // Use bearerToken2 for trends endpoint\n const res = await requestApi<TimelineV1>(\n `https://api.x.com/2/guide.json?${params.toString()}`,\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n if (!res.success) {\n throw res.err;\n }\n\n const instructions = res.value.timeline?.instructions ?? [];\n if (instructions.length < 2) {\n throw new Error('No trend entries found.');\n }\n\n // Some of this is silly, but for now we're assuming we know nothing about the\n // data, and that anything can be missing. Go has non-nilable strings and empty\n // slices are nil, so it largely doesn't need to worry about this.\n const entries = instructions[1].addEntries?.entries ?? [];\n if (entries.length < 2) {\n throw new Error('No trend entries found.');\n }\n\n const items = entries[1].content?.timelineModule?.items ?? [];\n const trends: string[] = [];\n for (const item of items) {\n const trend =\n item.item?.clientEventInfo?.details?.guideDetails?.transparentGuideDetails\n ?.trendMetadata?.trendName;\n if (trend != null) {\n trends.push(trend);\n }\n }\n\n return trends;\n}\n","import { QueryTweetsResponse } from './timeline-v1';\nimport { parseAndPush, TimelineEntryRaw } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface ListTimeline {\n data?: {\n list?: {\n tweets_timeline?: {\n timeline?: {\n instructions?: {\n entries?: TimelineEntryRaw[];\n entry?: TimelineEntryRaw;\n type?: string;\n }[];\n };\n };\n };\n };\n}\n\nexport function parseListTimelineTweets(\n timeline: ListTimeline,\n): QueryTweetsResponse {\n let bottomCursor: string | undefined;\n let topCursor: string | undefined;\n const tweets: Tweet[] = [];\n const instructions =\n timeline.data?.list?.tweets_timeline?.timeline?.instructions ?? [];\n for (const instruction of instructions) {\n const entries = instruction.entries ?? [];\n\n for (const entry of entries) {\n const entryContent = entry.content;\n if (!entryContent) continue;\n\n if (entryContent.cursorType === 'Bottom') {\n bottomCursor = entryContent.value;\n continue;\n } else if (entryContent.cursorType === 'Top') {\n topCursor = entryContent.value;\n continue;\n }\n\n const idStr = entry.entryId;\n if (\n !idStr.startsWith('tweet') &&\n !idStr.startsWith('list-conversation')\n ) {\n continue;\n }\n\n if (entryContent.itemContent) {\n parseAndPush(tweets, entryContent.itemContent, idStr);\n } else if (entryContent.items) {\n for (const contentItem of entryContent.items) {\n if (\n contentItem.item &&\n contentItem.item.itemContent &&\n contentItem.entryId\n ) {\n parseAndPush(\n tweets,\n contentItem.item.itemContent,\n contentItem.entryId.split('tweet-')[1],\n );\n }\n }\n }\n }\n }\n\n return { tweets, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { getUserIdByScreenName } from './profile';\nimport { LegacyTweetRaw, QueryTweetsResponse } from './timeline-v1';\nimport {\n parseTimelineTweetsV2,\n TimelineV2,\n TimelineEntryItemContentRaw,\n parseTimelineEntryItemContentRaw,\n ThreadedConversation,\n parseThreadedConversation,\n} from './timeline-v2';\nimport { getTweetTimeline } from './timeline-async';\nimport { apiRequestFactory } from './api-data';\nimport { ListTimeline, parseListTimelineTweets } from './timeline-list';\nimport { AuthenticationError } from './errors';\n\nexport interface Mention {\n id: string;\n username?: string;\n name?: string;\n}\n\nexport interface Photo {\n id: string;\n url: string;\n alt_text: string | undefined;\n}\n\nexport interface Video {\n id: string;\n preview: string;\n url?: string;\n}\n\nexport interface PlaceRaw {\n id?: string;\n place_type?: string;\n name?: string;\n full_name?: string;\n country_code?: string;\n country?: string;\n bounding_box?: {\n type?: string;\n coordinates?: number[][][];\n };\n}\n\n/**\n * A parsed Tweet object.\n */\nexport interface Tweet {\n __raw_UNSTABLE?: LegacyTweetRaw;\n bookmarkCount?: number;\n conversationId?: string;\n hashtags: string[];\n html?: string;\n id?: string;\n inReplyToStatus?: Tweet;\n inReplyToStatusId?: string;\n isEdited?: boolean;\n versions?: string[];\n isQuoted?: boolean;\n isPin?: boolean;\n isReply?: boolean;\n isRetweet?: boolean;\n isSelfThread?: boolean;\n likes?: number;\n name?: string;\n mentions: Mention[];\n permanentUrl?: string;\n photos: Photo[];\n place?: PlaceRaw;\n quotedStatus?: Tweet;\n quotedStatusId?: string;\n replies?: number;\n retweets?: number;\n retweetedStatus?: Tweet;\n retweetedStatusId?: string;\n text?: string;\n thread: Tweet[];\n timeParsed?: Date;\n timestamp?: number;\n urls: string[];\n userId?: string;\n username?: string;\n videos: Video[];\n views?: number;\n sensitiveContent?: boolean;\n}\n\nexport type TweetQuery =\n | Partial<Tweet>\n | ((tweet: Tweet) => boolean | Promise<boolean>);\n\nexport const features = addApiFeatures({\n interactive_text_enabled: true,\n longform_notetweets_inline_media_enabled: false,\n responsive_web_text_conversations_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n false,\n vibe_api_enabled: false,\n});\n\nexport async function fetchTweets(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const userTweetsRequest = apiRequestFactory.createUserTweetsRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserTweets endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchTweetsAndReplies(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 40) {\n maxTweets = 40;\n }\n\n const userTweetsRequest =\n apiRequestFactory.createUserTweetsAndRepliesRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserTweetsAndReplies endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchListTweets(\n listId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const listTweetsRequest = apiRequestFactory.createListTweetsRequest();\n listTweetsRequest.variables.listId = listId;\n listTweetsRequest.variables.count = maxTweets;\n\n if (cursor != null && cursor != '') {\n listTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for ListTweet endpoint\n const res = await requestApi<ListTimeline>(\n listTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseListTimelineTweets(res.value);\n}\n\nexport function getTweets(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchTweets(userId, mt, c, auth);\n });\n}\n\nexport function getTweetsByUserId(\n userId: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n return fetchTweets(q, mt, c, auth);\n });\n}\n\nexport function getTweetsAndReplies(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchTweetsAndReplies(userId, mt, c, auth);\n });\n}\n\nexport function getTweetsAndRepliesByUserId(\n userId: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n return fetchTweetsAndReplies(q, mt, c, auth);\n });\n}\n\nexport async function fetchLikedTweets(\n userId: string,\n maxTweets: number,\n cursor: string | undefined,\n auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching liked tweets.',\n );\n }\n\n if (maxTweets > 200) {\n maxTweets = 200;\n }\n\n const userTweetsRequest = apiRequestFactory.createUserLikedTweetsRequest();\n userTweetsRequest.variables.userId = userId;\n userTweetsRequest.variables.count = maxTweets;\n userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n if (cursor != null && cursor != '') {\n userTweetsRequest.variables['cursor'] = cursor;\n }\n\n // Use bearerToken2 for UserLikedTweets endpoint\n const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseTimelineTweetsV2(res.value);\n}\n\nexport function getLikedTweets(\n user: string,\n maxTweets: number,\n auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n const userIdRes = await getUserIdByScreenName(q, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n return fetchLikedTweets(userId, mt, c, auth);\n });\n}\n\nexport async function getTweetWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n): Promise<Tweet | null> {\n const isCallback = typeof query === 'function';\n\n for await (const tweet of tweets) {\n const matches = isCallback\n ? await query(tweet)\n : checkTweetMatches(tweet, query);\n\n if (matches) {\n return tweet;\n }\n }\n\n return null;\n}\n\nexport async function getTweetsWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n): Promise<Tweet[]> {\n const isCallback = typeof query === 'function';\n const filtered = [];\n\n for await (const tweet of tweets) {\n const matches = isCallback ? query(tweet) : checkTweetMatches(tweet, query);\n\n if (!matches) continue;\n filtered.push(tweet);\n }\n\n return filtered;\n}\n\nfunction checkTweetMatches(tweet: Tweet, options: Partial<Tweet>): boolean {\n return Object.keys(options).every((k) => {\n const key = k as keyof Tweet;\n return tweet[key] === options[key];\n });\n}\n\nexport async function getLatestTweet(\n user: string,\n includeRetweets: boolean,\n max: number,\n auth: TwitterAuth,\n): Promise<Tweet | null | void> {\n const timeline = getTweets(user, max, auth);\n\n // No point looping if max is 1, just use first entry.\n return max === 1\n ? (await timeline.next()).value\n : await getTweetWhere(timeline, { isRetweet: includeRetweets });\n}\n\nexport interface TweetResultByRestId {\n data?: TimelineEntryItemContentRaw;\n}\n\nexport async function getTweet(\n id: string,\n auth: TwitterAuth,\n): Promise<Tweet | null> {\n const tweetDetailRequest = apiRequestFactory.createTweetDetailRequest();\n tweetDetailRequest.variables.focalTweetId = id;\n\n // Use bearerToken2 for this specific endpoint (TweetDetail)\n // This is required for animated GIFs to appear in tweets with mixed media\n const res = await requestApi<ThreadedConversation>(\n tweetDetailRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n if (!res.value) {\n return null;\n }\n\n const tweets = parseThreadedConversation(res.value);\n\n return tweets.find((tweet) => tweet.id === id) ?? null;\n}\n\nexport async function getTweetAnonymous(\n id: string,\n auth: TwitterAuth,\n): Promise<Tweet | null> {\n const tweetResultByRestIdRequest =\n apiRequestFactory.createTweetResultByRestIdRequest();\n tweetResultByRestIdRequest.variables.tweetId = id;\n\n // Use bearerToken2 for this specific endpoint (TweetResultByRestId)\n // This matches the behavior observed in the Twitter web client and Go library\n // We pass it as an override to avoid mutating shared state (concurrency-safe)\n const res = await requestApi<TweetResultByRestId>(\n tweetResultByRestIdRequest.toRequestUrl(),\n auth,\n 'GET',\n undefined,\n undefined,\n bearerToken2,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n if (!res.value.data) {\n return null;\n }\n\n return parseTimelineEntryItemContentRaw(res.value.data, id);\n}\n","import {\n DmConversationTimeline,\n DmMessageEntry,\n DmCursorOptions,\n} from './direct-messages';\nimport { jitter } from './api';\n\nexport interface FetchDmConversationMessagesResponse {\n conversation: DmConversationTimeline;\n next?: DmCursorOptions;\n}\n\nexport type FetchDmConversationFn = (\n conversationId: string,\n maxMessages: number,\n cursor: DmCursorOptions | undefined,\n) => Promise<FetchDmConversationMessagesResponse>;\n\nexport async function* getDmConversationMessagesGenerator(\n conversationId: string,\n maxMessages: number,\n initialCursor: DmCursorOptions | undefined,\n fetchFunc: FetchDmConversationFn,\n): AsyncGenerator<DmMessageEntry, void> {\n let nMessages = 0;\n let cursor = initialCursor;\n\n while (nMessages < maxMessages) {\n const batch: FetchDmConversationMessagesResponse = await fetchFunc(\n conversationId,\n maxMessages,\n cursor,\n );\n\n const { conversation, next } = batch;\n\n if (!conversation?.entries || conversation?.entries?.length === 0) {\n break;\n }\n\n for (const entry of conversation.entries) {\n if (nMessages < maxMessages) {\n yield entry;\n nMessages++;\n } else {\n break;\n }\n }\n\n cursor = next;\n\n if (conversation.status === 'AT_END' || !next) {\n break;\n }\n\n await jitter(1000);\n }\n}\n","import { AuthenticationError } from './errors';\nimport { TwitterAuth } from './auth';\nimport { LegacyUserRaw } from './profile';\nimport { requestApi, addApiParams } from './api';\n\nimport { getDmConversationMessagesGenerator } from './direct-messages-async';\n\nexport interface DmInboxResponse {\n inbox_initial_state: DmInbox;\n}\n\nexport interface DmInbox {\n last_seen_event_id: string;\n trusted_last_seen_event_id: string;\n untrusted_last_seen_event_id: string;\n cursor: string;\n inbox_timelines: DmInboxTimelines;\n entries: DmMessageEntry[];\n users: { [key: string]: LegacyUserRaw };\n conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversationResponse {\n conversation_timeline: DmConversationTimeline;\n}\n\nexport interface DmConversationTimeline {\n status: DmStatus;\n min_entry_id: string;\n max_entry_id: string;\n entries: DmMessageEntry[];\n users: { [key: string]: LegacyUserRaw };\n conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversation {\n conversation_id: string;\n type: string;\n sort_event_id: string;\n sort_timestamp: string;\n participants: DmParticipant[];\n nsfw: boolean;\n notifications_disabled: boolean;\n mention_notifications_disabled: boolean;\n last_read_event_id: string;\n read_only: boolean;\n trusted: boolean;\n muted: boolean;\n status: DmStatus;\n min_entry_id: string;\n max_entry_id: string;\n}\n\nexport type DmStatus = 'AT_END' | 'HAS_MORE';\n\nexport interface DmParticipant {\n user_id: string;\n last_read_event_id?: string;\n}\n\nexport interface DmMessageEntry {\n welcome_message_create?: DmWelcomeMessage;\n message?: DmMessage;\n}\n\nexport interface DmMessage {\n id: string;\n time: string;\n affects_sort: boolean;\n request_id: string;\n conversation_id: string;\n message_data: DmMessageData;\n message_reactions: DmReaction[];\n}\n\nexport interface DmMessageData {\n id: string;\n time: string;\n recipient_id: string;\n sender_id: string;\n text: string;\n edit_count?: number;\n entities?: DmMessageEntities;\n}\n\nexport interface DmReaction {\n id: string;\n time: string;\n conversation_id: string;\n message_id: string;\n reaction_key: string;\n emoji_reaction: string;\n sender_id: string;\n}\n\nexport interface DmMessageEntities {\n // TODO: Not sure what these types are.\n hashtags: any[];\n symbols: any[];\n user_mentions: any[];\n urls: DmMessageUrl[];\n}\n\nexport interface DmMessageUrl {\n url: string;\n expanded_url: string;\n display_url: string;\n indices: number[];\n}\n\nexport interface DmWelcomeMessage extends DmMessage {\n welcome_message_id: string;\n}\n\nexport interface DmInboxTimelines {\n trusted: DmTimelineState;\n untrusted: DmTimelineState;\n untrusted_low_quality: DmTimelineState;\n}\n\nexport interface DmTimelineState {\n status: DmStatus;\n min_entry_id: string;\n}\n\nexport interface DmCursorOptions {\n maxId?: string;\n minId?: string;\n}\n\nexport async function fetchDmInbox(auth: TwitterAuth) {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching direct messages.',\n );\n }\n\n // TODO: Not sure how the \"cursor\" works for this. I don't have enough DMs to test.\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('nsfw_filtering_enabled', 'false');\n params.set('filter_low_quality', 'true');\n params.set('include_quality', 'all');\n params.set('include_ext_profile_image_shape', '1');\n params.set('dm_secret_conversations_enabled', 'false');\n params.set('krs_registration_enabled', 'false');\n params.set('include_ext_limited_action_results', 'true');\n params.set('dm_users', 'true');\n params.set('include_groups', 'true');\n params.set('include_inbox_timelines', 'true');\n params.set('supports_reactions', 'true');\n params.set('supports_edit', 'true');\n params.set('include_ext_edit_control', 'true');\n params.set('include_ext_business_affiliations_label', 'true');\n params.set('include_ext_parody_commentary_fan_label', 'true');\n params.set(\n 'ext',\n 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n );\n\n const res = await requestApi<DmInboxResponse>(\n `https://x.com/i/api/1.1/dm/inbox_initial_state.json?${params.toString()}`,\n auth,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseDmInbox(res.value);\n}\n\nexport async function parseDmInbox(inbox: DmInboxResponse) {\n return inbox.inbox_initial_state;\n}\n\n// This gets the current authenticated user's direct messages.\n// This requires the user to be authenticated.\nexport async function getDmInbox(auth: TwitterAuth) {\n return await fetchDmInbox(auth);\n}\n\n// This gets the current authenticated user's direct conversations.\n// This requires the user to be authenticated.\nexport async function fetchDmConversation(\n conversationId: string,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n) {\n if (!(await auth.isLoggedIn())) {\n throw new AuthenticationError(\n 'Scraper is not logged-in for fetching direct messages.',\n );\n }\n\n const params = new URLSearchParams();\n addApiParams(params, false);\n\n params.set('context', 'FETCH_DM_CONVERSATION_HISTORY');\n params.set('include_ext_profile_image_shape', '1');\n params.set('dm_secret_conversations_enabled', 'false');\n params.set('krs_registration_enabled', 'false');\n params.set('include_ext_limited_action_results', 'true');\n params.set('dm_users', 'true');\n params.set('include_groups', 'true');\n params.set('include_inbox_timelines', 'true');\n params.set('supports_reactions', 'true');\n params.set('supports_edit', 'true');\n params.set('include_conversation_info', 'true');\n params.set(\n 'ext',\n 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n );\n\n // By default, passing no cursor means you get the latest results.\n // `max_id` does backwards pagination using min_entry_id as the maxId to get older messages.\n // `min_id` does forward pagination using max_entry_id as the minId to get newer messages.\n // To know when there are no more pages, the response's \"status\" will return \"AT_END\".\n if (cursor) {\n if (cursor.maxId) {\n params.set('max_id', cursor.maxId);\n }\n if (cursor.minId) {\n params.set('min_id', cursor.minId);\n }\n }\n\n const url = `https://x.com/i/api/1.1/dm/conversation/${conversationId}.json?${params.toString()}`;\n\n const res = await requestApi<DmConversationResponse>(url, auth);\n\n if (!res.success) {\n throw res.err;\n }\n\n return parseDmConversation(res.value);\n}\n\nexport async function parseDmConversation(\n conversation: DmConversationResponse,\n) {\n return conversation.conversation_timeline;\n}\n\nexport async function getDmConversation(\n conversationId: string,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n) {\n return await fetchDmConversation(conversationId, cursor, auth);\n}\n\nexport function getDmMessages(\n conversationId: string,\n maxMessages: number,\n cursor: DmCursorOptions | undefined,\n auth: TwitterAuth,\n): AsyncGenerator<DmMessageEntry, void> {\n return getDmConversationMessagesGenerator(\n conversationId,\n maxMessages,\n cursor,\n async (id, _max, cursor) => {\n const conversation = await fetchDmConversation(id, cursor, auth);\n\n let next: DmCursorOptions | undefined = undefined;\n\n if (cursor?.minId && conversation.max_entry_id) {\n next = { minId: conversation.max_entry_id };\n } else if (conversation.min_entry_id) {\n next = { maxId: conversation.min_entry_id };\n }\n\n return {\n conversation,\n next,\n };\n },\n );\n}\n\nexport function findDmConversationsByUserId(\n inbox: DmInbox,\n userId: string,\n): DmConversation[] {\n const conversations: DmConversation[] = [];\n\n for (const conversationId in inbox.conversations) {\n const conversation = inbox.conversations[conversationId];\n const hasUser = conversation.participants.some(\n (participant) => participant.user_id === userId,\n );\n\n if (hasUser) {\n conversations.push(conversation);\n }\n }\n\n return conversations;\n}\n","import { Cookie } from 'tough-cookie';\nimport {\n bearerToken,\n bearerToken2,\n FetchTransformOptions,\n RequestApiResult,\n} from './api';\nimport { TwitterAuth, TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { FlowSubtaskHandler, TwitterUserAuth } from './auth-user';\nimport type { BrowserProfile } from './castle';\nimport { getProfile, getUserIdByScreenName, Profile } from './profile';\nimport {\n fetchSearchProfiles,\n fetchSearchTweets,\n SearchMode,\n searchProfiles,\n searchTweets,\n} from './search';\nimport {\n fetchProfileFollowing,\n fetchProfileFollowers,\n getFollowing,\n getFollowers,\n} from './relationships';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTrends } from './trends';\nimport {\n Tweet,\n getTweetAnonymous,\n getTweets,\n getLatestTweet,\n getLikedTweets,\n getTweetWhere,\n getTweetsWhere,\n getTweetsByUserId,\n TweetQuery,\n getTweet,\n fetchListTweets,\n getTweetsAndRepliesByUserId,\n getTweetsAndReplies,\n fetchLikedTweets,\n} from './tweets';\nimport fetch from 'cross-fetch';\nimport debug from 'debug';\nimport { RateLimitStrategy } from './rate-limit';\nimport {\n DmConversationTimeline,\n DmInbox,\n DmMessageEntry,\n DmCursorOptions,\n getDmConversation,\n getDmMessages,\n getDmInbox,\n findDmConversationsByUserId,\n DmConversation,\n} from './direct-messages';\n\nconst log = debug('twitter-scraper:scraper');\nconst twUrl = 'https://x.com';\n\nexport interface ScraperOptions {\n /**\n * An alternative fetch function to use instead of the default fetch function. This may be useful\n * in nonstandard runtime environments, such as edge workers.\n */\n fetch: typeof fetch;\n\n /**\n * Additional options that control how requests and responses are processed. This can be used to\n * proxy requests through other hosts, for example.\n */\n transform: Partial<FetchTransformOptions>;\n\n /**\n * A handling strategy for rate limits (HTTP 429).\n */\n rateLimitStrategy: RateLimitStrategy;\n\n /**\n * Experimental features that may be added, changed, or removed at any time. Use with caution.\n */\n experimental: {\n /**\n * Enables the generation of the `x-client-transaction-id` header on requests. This may resolve some errors.\n */\n xClientTransactionId: boolean;\n /**\n * Enables the generation of the `x-xp-forwarded-for` header on requests. This may resolve some errors.\n */\n xpff: boolean;\n /**\n * Delay in milliseconds between login flow steps, to mimic human-like timing.\n * Without a delay, Twitter may flag rapid-fire requests as bot activity (error 399).\n * Set to 0 to disable. Default is 1-3 seconds (average ~2s) with random jitter.\n */\n flowStepDelay?: number;\n /**\n * Override the browser profile used for Castle.io fingerprint token generation.\n * Unspecified fields are randomized from realistic value pools.\n * Set this if you want a consistent fingerprint or need to match specific hardware.\n */\n browserProfile?: Partial<BrowserProfile>;\n };\n}\n\n/**\n * An interface to Twitter's undocumented API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\nexport class Scraper {\n private auth!: TwitterAuth;\n private authTrends!: TwitterAuth;\n private token: string;\n private readonly subtaskHandlers: Map<string, FlowSubtaskHandler> = new Map();\n\n /**\n * Creates a new Scraper object.\n * - Scrapers maintain their own guest tokens for Twitter's internal API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\n constructor(private readonly options?: Partial<ScraperOptions>) {\n this.token = bearerToken;\n this.useGuestAuth();\n }\n\n /**\n * Registers a subtask handler for the given subtask ID. This\n * will override any existing handler for the same subtask.\n * @param subtaskId The ID of the subtask to register the handler for.\n * @param subtaskHandler The handler function to register.\n */\n public registerAuthSubtaskHandler(\n subtaskId: string,\n subtaskHandler: FlowSubtaskHandler,\n ): void {\n // Always store so handlers survive auth transitions (guest -> user)\n this.subtaskHandlers.set(subtaskId, subtaskHandler);\n\n if (this.auth instanceof TwitterUserAuth) {\n this.auth.registerSubtaskHandler(subtaskId, subtaskHandler);\n }\n\n if (this.authTrends instanceof TwitterUserAuth) {\n this.authTrends.registerSubtaskHandler(subtaskId, subtaskHandler);\n }\n }\n\n /**\n * Applies all stored subtask handlers to the given auth instance.\n * @internal\n */\n private applySubtaskHandlers(auth: TwitterUserAuth): void {\n for (const [subtaskId, handler] of this.subtaskHandlers) {\n auth.registerSubtaskHandler(subtaskId, handler);\n }\n }\n\n /**\n * Initializes auth properties using a guest token.\n * Used when creating a new instance of this class, and when logging out.\n * @internal\n */\n private useGuestAuth() {\n this.auth = new TwitterGuestAuth(this.token, this.getAuthOptions());\n this.authTrends = new TwitterGuestAuth(this.token, this.getAuthOptions());\n }\n\n /**\n * Fetches a Twitter profile.\n * @param username The Twitter username of the profile to fetch, without an `@` at the beginning.\n * @returns The requested {@link Profile}.\n */\n public async getProfile(username: string): Promise<Profile> {\n const res = await getProfile(username, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n * Fetches the user ID corresponding to the provided screen name.\n * @param screenName The Twitter screen name of the profile to fetch.\n * @returns The ID of the corresponding account.\n */\n public async getUserIdByScreenName(screenName: string): Promise<string> {\n const res = await getUserIdByScreenName(screenName, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n * Fetches tweets from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxTweets The maximum number of tweets to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @returns An {@link AsyncGenerator} of tweets matching the provided filters.\n */\n public searchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode = SearchMode.Top,\n ): AsyncGenerator<Tweet, void> {\n return searchTweets(query, maxTweets, searchMode, this.auth);\n }\n\n /**\n * Fetches profiles from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of tweets matching the provided filter(s).\n */\n public searchProfiles(\n query: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return searchProfiles(query, maxProfiles, this.auth);\n }\n\n /**\n * Fetches tweets from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxTweets The maximum number of tweets to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchSearchTweets(\n query: string,\n maxTweets: number,\n searchMode: SearchMode,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchSearchTweets(query, maxTweets, searchMode, this.auth, cursor);\n }\n\n /**\n * Fetches profiles from Twitter.\n * @param query The search query. Any Twitter-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchSearchProfiles(\n query: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchSearchProfiles(query, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches list tweets from Twitter.\n * @param listId The list id\n * @param maxTweets The maximum number of tweets to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchListTweets(\n listId: string,\n maxTweets: number,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchListTweets(listId, maxTweets, cursor, this.auth);\n }\n\n /**\n * Fetch the tweets a user has liked\n * @param userId The user whose liked tweets should be returned\n * @param maxTweets The maximum number of tweets to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchLikedTweets(\n userId: string,\n maxTweets: number,\n cursor?: string,\n ): Promise<QueryTweetsResponse> {\n return fetchLikedTweets(userId, maxTweets, cursor, this.auth);\n }\n\n /**\n * Fetch the profiles a user is following\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of following profiles for the provided user.\n */\n public getFollowing(\n userId: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return getFollowing(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetch the profiles that follow a user\n * @param userId The user whose followers should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of profiles following the provided user.\n */\n public getFollowers(\n userId: string,\n maxProfiles: number,\n ): AsyncGenerator<Profile, void> {\n return getFollowers(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetches following profiles from Twitter.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches profile followers from Twitter.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n cursor?: string,\n ): Promise<QueryProfilesResponse> {\n return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches the current trends from Twitter.\n * @returns The current list of trends.\n */\n public getTrends(): Promise<string[]> {\n return getTrends(this.authTrends);\n }\n\n /**\n * Fetches tweets from a Twitter user.\n * @param user The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n return getTweets(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches liked tweets from a Twitter user. Requires authentication.\n * @param user The user whose likes should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of liked tweets from the provided user.\n */\n public getLikedTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n return getLikedTweets(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets from a Twitter user using their ID.\n * @param userId The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsByUserId(\n userId: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet, void> {\n return getTweetsByUserId(userId, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets and replies from a Twitter user.\n * @param user The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsAndReplies(\n user: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet> {\n return getTweetsAndReplies(user, maxTweets, this.auth);\n }\n\n /**\n * Fetches tweets and replies from a Twitter user using their ID.\n * @param userId The user whose tweets should be returned.\n * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of tweets from the provided user.\n */\n public getTweetsAndRepliesByUserId(\n userId: string,\n maxTweets = 200,\n ): AsyncGenerator<Tweet, void> {\n return getTweetsAndRepliesByUserId(userId, maxTweets, this.auth);\n }\n\n /**\n * Fetches the first tweet matching the given query.\n *\n * Example:\n * ```js\n * const timeline = scraper.getTweets('user', 200);\n * const retweet = await scraper.getTweetWhere(timeline, { isRetweet: true });\n * ```\n * @param tweets The {@link AsyncIterable} of tweets to search through.\n * @param query A query to test **all** tweets against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Tweet}.\n */\n public getTweetWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n ): Promise<Tweet | null> {\n return getTweetWhere(tweets, query);\n }\n\n /**\n * Fetches all tweets matching the given query.\n *\n * Example:\n * ```js\n * const timeline = scraper.getTweets('user', 200);\n * const retweets = await scraper.getTweetsWhere(timeline, { isRetweet: true });\n * ```\n * @param tweets The {@link AsyncIterable} of tweets to search through.\n * @param query A query to test **all** tweets against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Tweet}.\n */\n public getTweetsWhere(\n tweets: AsyncIterable<Tweet>,\n query: TweetQuery,\n ): Promise<Tweet[]> {\n return getTweetsWhere(tweets, query);\n }\n\n /**\n * Fetches the most recent tweet from a Twitter user.\n * @param user The user whose latest tweet should be returned.\n * @param includeRetweets Whether or not to include retweets. Defaults to `false`.\n * @returns The {@link Tweet} object or `null`/`undefined` if it couldn't be fetched.\n */\n public getLatestTweet(\n user: string,\n includeRetweets = false,\n max = 200,\n ): Promise<Tweet | null | void> {\n return getLatestTweet(user, includeRetweets, max, this.auth);\n }\n\n /**\n * Fetches a single tweet.\n * @param id The ID of the tweet to fetch.\n * @returns The {@link Tweet} object, or `null` if it couldn't be fetched.\n */\n public getTweet(id: string): Promise<Tweet | null> {\n if (this.auth instanceof TwitterUserAuth) {\n return getTweet(id, this.auth);\n } else {\n return getTweetAnonymous(id, this.auth);\n }\n }\n\n /**\n * Retrieves the direct message inbox for the authenticated user.\n *\n * @return A promise that resolves to an object representing the direct message inbox.\n */\n public getDmInbox(): Promise<DmInbox> {\n return getDmInbox(this.auth);\n }\n\n /**\n * Retrieves the direct message conversation for the specified conversation ID.\n *\n * @param conversationId - The unique identifier of the DM conversation to retrieve.\n * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n * @return A promise that resolves to the timeline of the DM conversation.\n */\n public getDmConversation(\n conversationId: string,\n cursor?: DmCursorOptions,\n ): Promise<DmConversationTimeline> {\n return getDmConversation(conversationId, cursor, this.auth);\n }\n\n /**\n * Retrieves direct messages from a specific conversation.\n *\n * @param conversationId - The unique identifier of the conversation to fetch messages from.\n * @param [maxMessages=20] - The maximum number of messages to retrieve per request.\n * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n * @returns An {@link AsyncGenerator} of messages from the provided conversation.\n */\n public getDmMessages(\n conversationId: string,\n maxMessages = 20,\n cursor?: DmCursorOptions,\n ): AsyncGenerator<DmMessageEntry, void> {\n return getDmMessages(conversationId, maxMessages, cursor, this.auth);\n }\n\n /**\n * Retrieves a list of direct message conversations for a specific user based on their user ID.\n *\n * @param inbox - The DM inbox containing all available conversations.\n * @param userId - The unique identifier of the user whose DM conversations are to be retrieved.\n * @return An array of DM conversations associated with the specified user ID.\n */\n public findDmConversationsByUserId(\n inbox: DmInbox,\n userId: string,\n ): DmConversation[] {\n return findDmConversationsByUserId(inbox, userId);\n }\n\n /**\n * Returns if the scraper has a guest token. The token may not be valid.\n * @returns `true` if the scraper has a guest token; otherwise `false`.\n */\n public hasGuestToken(): boolean {\n return this.auth.hasToken() || this.authTrends.hasToken();\n }\n\n /**\n * Returns if the scraper is logged in as a real user.\n * @returns `true` if the scraper is logged in with a real user account; otherwise `false`.\n */\n public async isLoggedIn(): Promise<boolean> {\n return (\n (await this.auth.isLoggedIn()) && (await this.authTrends.isLoggedIn())\n );\n }\n\n /**\n * Login to Twitter as a real Twitter account. This enables running\n * searches.\n * @param username The username of the Twitter account to login with.\n * @param password The password of the Twitter account to login with.\n * @param email The email to log in with, if you have email confirmation enabled.\n * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n */\n public async login(\n username: string,\n password: string,\n email?: string,\n twoFactorSecret?: string,\n ): Promise<void> {\n // Swap in a real authorizer for all requests\n // Use bearerToken2 for the login flow - this is the same token the Twitter frontend uses.\n // Guest activation and the onboarding/task.json endpoint both require this token.\n const userAuth = new TwitterUserAuth(bearerToken2, this.getAuthOptions());\n this.applySubtaskHandlers(userAuth);\n await userAuth.login(username, password, email, twoFactorSecret);\n this.auth = userAuth;\n this.authTrends = userAuth;\n }\n\n /**\n * Log out of Twitter.\n */\n public async logout(): Promise<void> {\n await this.auth.logout();\n await this.authTrends.logout();\n\n // Swap in guest authorizers for all requests\n this.useGuestAuth();\n }\n\n /**\n * Retrieves all cookies for the current session.\n * @returns All cookies for the current session.\n */\n public async getCookies(): Promise<Cookie[]> {\n return await this.authTrends\n .cookieJar()\n .getCookies(\n typeof document !== 'undefined' ? document.location.toString() : twUrl,\n );\n }\n\n /**\n * Set cookies for the current session.\n * @param cookies The cookies to set for the current session.\n */\n public async setCookies(cookies: (string | Cookie)[]): Promise<void> {\n // Use bearerToken2 for authenticated user requests\n const userAuth = new TwitterUserAuth(bearerToken2, this.getAuthOptions());\n this.applySubtaskHandlers(userAuth);\n for (const cookie of cookies) {\n if (cookie == null) continue;\n\n if (typeof cookie === 'string') {\n // String cookies are parsed by tough-cookie, which normalizes domains correctly\n try {\n await userAuth.cookieJar().setCookie(cookie, 'https://x.com');\n } catch (err) {\n log(`Failed to parse cookie string: ${(err as Error).message}`);\n }\n } else {\n // Cookie objects from Cookie.fromJSON() preserve the domain literally.\n // tough-cookie's getCookies() won't match \".x.com\" against \"https://x.com\",\n // so we must strip the leading dot and set hostOnly=false to allow\n // subdomain matching (matching how tough-cookie normalizes string cookies).\n if (cookie.domain && cookie.domain.startsWith('.')) {\n cookie.domain = cookie.domain.substring(1);\n cookie.hostOnly = false;\n }\n\n const cookieDomain = cookie.domain || 'x.com';\n const cookieUrl = `https://${cookieDomain}`;\n await userAuth.cookieJar().setCookie(cookie, cookieUrl);\n }\n }\n\n this.auth = userAuth;\n this.authTrends = userAuth;\n\n // Warn if auth_token is missing - this is the most common cause of 401 errors.\n // auth_token is an HttpOnly cookie that cannot be accessed via document.cookie;\n // it must be exported using a browser extension or DevTools.\n const isLoggedIn = await userAuth.isLoggedIn();\n if (!isLoggedIn) {\n const cookieString = await userAuth\n .cookieJar()\n .getCookies(twUrl)\n .then((c) => c.map((cookie) => cookie.key));\n if (\n cookieString.includes('ct0') &&\n !cookieString.includes('auth_token')\n ) {\n log(\n 'auth_token cookie is missing. This is required for authenticated API access. ' +\n 'The auth_token is an HttpOnly cookie that cannot be accessed via document.cookie. ' +\n 'Export it using a browser extension (e.g., EditThisCookie) or DevTools Application tab.',\n );\n }\n }\n }\n\n /**\n * Clear all cookies for the current session.\n */\n public async clearCookies(): Promise<void> {\n await this.auth.cookieJar().removeAllCookies();\n await this.authTrends.cookieJar().removeAllCookies();\n }\n\n /**\n * Sets the optional cookie to be used in requests.\n * @param _cookie The cookie to be used in requests.\n * @deprecated This function no longer represents any part of Twitter's auth flow.\n * @returns This scraper instance.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public withCookie(_cookie: string): Scraper {\n console.warn(\n 'Warning: Scraper#withCookie is deprecated and will be removed in a later version. Use Scraper#login or Scraper#setCookies instead.',\n );\n return this;\n }\n\n /**\n * Sets the optional CSRF token to be used in requests.\n * @param _token The CSRF token to be used in requests.\n * @deprecated This function no longer represents any part of Twitter's auth flow.\n * @returns This scraper instance.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public withXCsrfToken(_token: string): Scraper {\n console.warn(\n 'Warning: Scraper#withXCsrfToken is deprecated and will be removed in a later version.',\n );\n return this;\n }\n\n private getAuthOptions(): Partial<TwitterAuthOptions> {\n return {\n fetch: this.options?.fetch,\n transform: this.options?.transform,\n rateLimitStrategy: this.options?.rateLimitStrategy,\n experimental: {\n xClientTransactionId: this.options?.experimental?.xClientTransactionId,\n xpff: this.options?.experimental?.xpff,\n flowStepDelay: this.options?.experimental?.flowStepDelay,\n browserProfile: this.options?.experimental?.browserProfile,\n },\n };\n }\n\n private handleResponse<T>(res: RequestApiResult<T>): T {\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n }\n}\n"],"names":["log","FieldEncoding","mx","crypto","DOMParser","jitter","endpoints","SearchMode","cursor"],"mappings":"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"}