@the-convocation/twitter-scraper 0.18.2 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/default/cjs/index.js +5 -8
- package/dist/default/cjs/index.js.map +1 -1
- package/dist/default/esm/index.mjs +5 -8
- package/dist/default/esm/index.mjs.map +1 -1
- package/dist/node/cjs/index.cjs +5 -8
- package/dist/node/cjs/index.cjs.map +1 -1
- package/dist/node/esm/index.mjs +5 -8
- package/dist/node/esm/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/errors.ts","../../../src/rate-limit.ts","../../../src/platform/platform-interface.ts","../../../src/platform/index.ts","../../../src/requests.ts","../../../src/api.ts","../../../src/auth.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","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;\ndeclare const PLATFORM_NODE_JEST: 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 } else if (PLATFORM_NODE_JEST) {\n // Jest gets unhappy when using an await import here, so we just use require instead.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { platform } = require('./node');\n return platform as PlatformExtensions;\n }\n\n return genericPlatform;\n }\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\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 const setCookieHeader = headers.get('set-cookie');\n if (setCookieHeader) {\n const cookies = setCookie.splitCookiesString(setCookieHeader);\n for (const cookie of cookies.map((c) => Cookie.parse(c))) {\n if (!cookie) continue;\n await cookieJar.setCookie(\n cookie,\n `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${cookie.path}`,\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 { FetchParameters } from './api-types';\nimport { TwitterAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport debug from 'debug';\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 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 */\nexport async function requestApi<T>(\n url: string,\n auth: TwitterAuth,\n method: 'GET' | 'POST' = 'GET',\n platform: PlatformExtensions = new Platform(),\n): Promise<RequestApiResult<T>> {\n log(`Making ${method} request to ${url}`);\n\n const headers = new Headers();\n await auth.installTo(headers, url);\n await platform.randomizeCiphers();\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 res.json();\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\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 { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport fetch from 'cross-fetch';\nimport { FetchTransformOptions } from './api';\nimport {\n RateLimitEvent,\n RateLimitStrategy,\n WaitingRateLimitStrategy,\n} from './rate-limit';\nimport { AuthenticationError } from './errors';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:auth');\n\nexport interface TwitterAuthOptions {\n fetch: typeof fetch;\n transform: Partial<FetchTransformOptions>;\n rateLimitStrategy: RateLimitStrategy;\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 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 */\n installTo(headers: Headers, url: string): 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 protected 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(headers: Headers): Promise<void> {\n if (this.shouldUpdate()) {\n await this.updateGuestToken();\n }\n\n const token = this.guestToken;\n if (token == null) {\n throw new AuthenticationError(\n 'Authentication token is null or undefined.',\n );\n }\n\n headers.set('authorization', `Bearer ${this.bearerToken}`);\n headers.set('x-guest-token', token);\n\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 headers.set('cookie', await this.getCookieString());\n }\n\n protected 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 /**\n * Updates the authentication state with a new guest token from the Twitter API.\n */\n protected async updateGuestToken() {\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 res.json();\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\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","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { 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';\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 res = await requestApi<TwitterUserAuthVerifyCredentials>(\n 'https://api.x.com/1.1/account/verify_credentials.json',\n this,\n );\n if (!res.success) {\n return false;\n }\n\n const { value: verify } = res;\n return verify && !verify.errors?.length;\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 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 async installTo(headers: Headers): Promise<void> {\n headers.set('authorization', `Bearer ${this.bearerToken}`);\n headers.set('cookie', await this.getCookieString());\n await this.installCsrfToken(headers);\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(\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 }\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\n const token = this.guestToken;\n if (token == null) {\n throw new AuthenticationError(\n 'Authentication token is null or undefined.',\n );\n }\n\n const headers = new Headers({\n authorization: `Bearer ${this.bearerToken}`,\n cookie: await this.getCookieString(),\n 'content-type': 'application/json',\n 'User-Agent':\n 'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n 'x-guest-token': token,\n 'x-twitter-auth-type': 'OAuth2Client',\n 'x-twitter-active-user': 'yes',\n 'x-twitter-client-language': 'en',\n });\n await this.installCsrfToken(headers);\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 res.json();\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 // TODO: Migrate other endpoint URLs here\n UserTweets:\n 'https://x.com/i/api/graphql/Li2XXGESVev94TzFtntrgA/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%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 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://x.com/i/api/graphql/xWw45l6nX7DP2FKRyePXSw/UserByScreenName?variables=%7B%22screen_name%22%3A%22geminiapp%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%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%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%22withAuxiliaryUserLabels%22%3Atrue%7D',\n TweetDetail:\n 'https://x.com/i/api/graphql/u5Tij6ERlSH2LZvCUqallw/TweetDetail?variables=%7B%22focalTweetId%22%3A%221924893675529900467%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%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%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n TweetResultByRestId:\n 'https://api.x.com/graphql/Opujkru5iJSDWj4DuJISOw/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221924893675529900467%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%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%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%22responsive_web_grok_image_annotation_enabled%22%3Atrue%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} 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 } 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 request.variables.withSafetyModeUserFields = true;\n request.features.hidden_profile_subscriptions_enabled = false; // Auth-restricted\n request.fieldToggles.withAuxiliaryUserLabels = false;\n\n const res = await requestApi<UserRaw>(request.toRequestUrl(), auth);\n if (!res.success) {\n return res;\n }\n\n const { value } = res;\n const { errors } = value;\n if (errors != null && errors.length > 0) {\n return {\n success: false,\n err: new Error(errors[0].message),\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 { addApiFeatures, 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 stringify from 'json-stable-stringify';\nimport { AuthenticationError } from './errors';\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 variables: Record<string, any> = {\n rawQuery: query,\n count: maxItems,\n querySource: 'typed_query',\n product: 'Top',\n };\n\n const features = addApiFeatures({\n longform_notetweets_inline_media_enabled: true,\n responsive_web_enhance_cards_enabled: false,\n responsive_web_media_download_video_enabled: false,\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n interactive_text_enabled: false,\n responsive_web_text_conversations_enabled: false,\n vibe_api_enabled: false,\n });\n\n const fieldToggles: Record<string, any> = {\n withArticleRichContentState: false,\n };\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n switch (searchMode) {\n case SearchMode.Latest:\n variables.product = 'Latest';\n break;\n case SearchMode.Photos:\n variables.product = 'Photos';\n break;\n case SearchMode.Videos:\n variables.product = 'Videos';\n break;\n case SearchMode.Users:\n variables.product = 'People';\n break;\n default:\n break;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const fieldTogglesStr = stringify(fieldToggles);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<SearchTimeline>(\n `https://api.x.com/graphql/gkjsKepM6gl_HmFWoWKfgg/SearchTimeline?${params.toString()}`,\n auth,\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 { addApiFeatures, 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 stringify from 'json-stable-stringify';\nimport { AuthenticationError } from './errors';\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 variables: Record<string, any> = {\n userId,\n count: maxItems,\n includePromotedContent: false,\n };\n\n const features = addApiFeatures({\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n longform_notetweets_inline_media_enabled: true,\n responsive_web_media_download_video_enabled: false,\n });\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<RelationshipTimeline>(\n `https://x.com/i/api/graphql/iSicc7LrzWGBgDPL0tM_TQ/Following?${params.toString()}`,\n auth,\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 variables: Record<string, any> = {\n userId,\n count: maxItems,\n includePromotedContent: false,\n };\n\n const features = addApiFeatures({\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n longform_notetweets_inline_media_enabled: true,\n responsive_web_media_download_video_enabled: false,\n });\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<RelationshipTimeline>(\n `https://x.com/i/api/graphql/rRXFSG5vR6drKr5M37YOTw/Followers?${params.toString()}`,\n auth,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { addApiParams, requestApi } 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 const res = await requestApi<TimelineV1>(\n `https://api.x.com/2/guide.json?${params.toString()}`,\n auth,\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 } 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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<ListTimeline>(\n listTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<ThreadedConversation>(\n tweetDetailRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TweetResultByRestId>(\n tweetResultByRestIdRequest.toRequestUrl(),\n auth,\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/**\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 };\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","jitter","endpoints","SearchMode","cursor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/errors.ts","../../../src/rate-limit.ts","../../../src/platform/platform-interface.ts","../../../src/platform/index.ts","../../../src/requests.ts","../../../src/api.ts","../../../src/auth.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","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;\ndeclare const PLATFORM_NODE_JEST: 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 } else if (PLATFORM_NODE_JEST) {\n // Jest gets unhappy when using an await import here, so we just use require instead.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { platform } = require('./node');\n return platform as PlatformExtensions;\n }\n\n return genericPlatform;\n }\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\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 const setCookieHeader = headers.get('set-cookie');\n if (setCookieHeader) {\n const cookies = setCookie.splitCookiesString(setCookieHeader);\n for (const cookie of cookies.map((c) => Cookie.parse(c))) {\n if (!cookie) continue;\n await cookieJar.setCookie(\n cookie,\n `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${cookie.path}`,\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 { FetchParameters } from './api-types';\nimport { TwitterAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport debug from 'debug';\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 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 */\nexport async function requestApi<T>(\n url: string,\n auth: TwitterAuth,\n method: 'GET' | 'POST' = 'GET',\n platform: PlatformExtensions = new Platform(),\n): Promise<RequestApiResult<T>> {\n log(`Making ${method} request to ${url}`);\n\n const headers = new Headers();\n await auth.installTo(headers, url);\n await platform.randomizeCiphers();\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 res.json();\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\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 { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport fetch from 'cross-fetch';\nimport { FetchTransformOptions } from './api';\nimport {\n RateLimitEvent,\n RateLimitStrategy,\n WaitingRateLimitStrategy,\n} from './rate-limit';\nimport { AuthenticationError } from './errors';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:auth');\n\nexport interface TwitterAuthOptions {\n fetch: typeof fetch;\n transform: Partial<FetchTransformOptions>;\n rateLimitStrategy: RateLimitStrategy;\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 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 */\n installTo(headers: Headers, url: string): 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 protected 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(headers: Headers): Promise<void> {\n if (this.shouldUpdate()) {\n await this.updateGuestToken();\n }\n\n const token = this.guestToken;\n if (token == null) {\n throw new AuthenticationError(\n 'Authentication token is null or undefined.',\n );\n }\n\n headers.set('authorization', `Bearer ${this.bearerToken}`);\n headers.set('x-guest-token', token);\n\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 headers.set('cookie', await this.getCookieString());\n }\n\n protected 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 /**\n * Updates the authentication state with a new guest token from the Twitter API.\n */\n protected async updateGuestToken() {\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 res.json();\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\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","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { 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';\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 res = await requestApi<TwitterUserAuthVerifyCredentials>(\n 'https://api.x.com/1.1/account/verify_credentials.json',\n this,\n );\n if (!res.success) {\n return false;\n }\n\n const { value: verify } = res;\n return verify && !verify.errors?.length;\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 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 async installTo(headers: Headers): Promise<void> {\n headers.set('authorization', `Bearer ${this.bearerToken}`);\n headers.set('cookie', await this.getCookieString());\n await this.installCsrfToken(headers);\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(\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 }\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\n const token = this.guestToken;\n if (token == null) {\n throw new AuthenticationError(\n 'Authentication token is null or undefined.',\n );\n }\n\n const headers = new Headers({\n authorization: `Bearer ${this.bearerToken}`,\n cookie: await this.getCookieString(),\n 'content-type': 'application/json',\n 'User-Agent':\n 'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n 'x-guest-token': token,\n 'x-twitter-auth-type': 'OAuth2Client',\n 'x-twitter-active-user': 'yes',\n 'x-twitter-client-language': 'en',\n });\n await this.installCsrfToken(headers);\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 res.json();\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 // TODO: Migrate other endpoint URLs here\n UserTweets:\n 'https://api.x.com/graphql/VfoNveT-zJPGVZMPydZUfQ/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%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%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%3Afalse%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/96tVxbPqMZDoYB5pmzezKA/UserByScreenName?variables=%7B%22screen_name%22%3A%22geminiapp%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22payments_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%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%22withAuxiliaryUserLabels%22%3Atrue%7D',\n TweetDetail:\n 'https://x.com/i/api/graphql/u5Tij6ERlSH2LZvCUqallw/TweetDetail?variables=%7B%22focalTweetId%22%3A%221924893675529900467%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%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%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n TweetResultByRestId:\n 'https://api.x.com/graphql/wqi5M7wZ7tW-X9S2t-Mqcg/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221924893675529900467%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%3Afalse%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%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} 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 } 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 const res = await requestApi<UserRaw>(request.toRequestUrl(), auth);\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 { addApiFeatures, 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 stringify from 'json-stable-stringify';\nimport { AuthenticationError } from './errors';\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 variables: Record<string, any> = {\n rawQuery: query,\n count: maxItems,\n querySource: 'typed_query',\n product: 'Top',\n };\n\n const features = addApiFeatures({\n longform_notetweets_inline_media_enabled: true,\n responsive_web_enhance_cards_enabled: false,\n responsive_web_media_download_video_enabled: false,\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n interactive_text_enabled: false,\n responsive_web_text_conversations_enabled: false,\n vibe_api_enabled: false,\n });\n\n const fieldToggles: Record<string, any> = {\n withArticleRichContentState: false,\n };\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n switch (searchMode) {\n case SearchMode.Latest:\n variables.product = 'Latest';\n break;\n case SearchMode.Photos:\n variables.product = 'Photos';\n break;\n case SearchMode.Videos:\n variables.product = 'Videos';\n break;\n case SearchMode.Users:\n variables.product = 'People';\n break;\n default:\n break;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const fieldTogglesStr = stringify(fieldToggles);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<SearchTimeline>(\n `https://api.x.com/graphql/gkjsKepM6gl_HmFWoWKfgg/SearchTimeline?${params.toString()}`,\n auth,\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 { addApiFeatures, 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 stringify from 'json-stable-stringify';\nimport { AuthenticationError } from './errors';\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 variables: Record<string, any> = {\n userId,\n count: maxItems,\n includePromotedContent: false,\n };\n\n const features = addApiFeatures({\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n longform_notetweets_inline_media_enabled: true,\n responsive_web_media_download_video_enabled: false,\n });\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<RelationshipTimeline>(\n `https://x.com/i/api/graphql/iSicc7LrzWGBgDPL0tM_TQ/Following?${params.toString()}`,\n auth,\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 variables: Record<string, any> = {\n userId,\n count: maxItems,\n includePromotedContent: false,\n };\n\n const features = addApiFeatures({\n responsive_web_twitter_article_tweet_consumption_enabled: false,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n true,\n longform_notetweets_inline_media_enabled: true,\n responsive_web_media_download_video_enabled: false,\n });\n\n if (cursor != null && cursor != '') {\n variables['cursor'] = cursor;\n }\n\n const params = new URLSearchParams();\n const featuresStr = stringify(features);\n const variablesStr = stringify(variables);\n if (featuresStr) params.set('features', featuresStr);\n if (variablesStr) params.set('variables', variablesStr);\n\n const res = await requestApi<RelationshipTimeline>(\n `https://x.com/i/api/graphql/rRXFSG5vR6drKr5M37YOTw/Followers?${params.toString()}`,\n auth,\n );\n\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n}\n","import { addApiParams, requestApi } 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 const res = await requestApi<TimelineV1>(\n `https://api.x.com/2/guide.json?${params.toString()}`,\n auth,\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 } 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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<ListTimeline>(\n listTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TimelineV2>(\n userTweetsRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<ThreadedConversation>(\n tweetDetailRequest.toRequestUrl(),\n auth,\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 const res = await requestApi<TweetResultByRestId>(\n tweetResultByRestIdRequest.toRequestUrl(),\n auth,\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/**\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 };\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","jitter","endpoints","SearchMode","cursor"],"mappings":"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"}
|