@the-convocation/twitter-scraper 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +71 -38
  2. package/dist/default/cjs/index.js +2126 -0
  3. package/dist/default/cjs/index.js.map +1 -0
  4. package/dist/default/esm/index.mjs +2104 -0
  5. package/dist/default/esm/index.mjs.map +1 -0
  6. package/dist/node/cjs/index.cjs +2156 -0
  7. package/dist/node/cjs/index.cjs.map +1 -0
  8. package/dist/node/esm/index.mjs +2134 -0
  9. package/dist/node/esm/index.mjs.map +1 -0
  10. package/dist/{scraper.d.ts → types/index.d.ts} +284 -8
  11. package/examples/cors-proxy/package.json +18 -0
  12. package/examples/node-integration/package.json +12 -0
  13. package/examples/react-integration/README.md +30 -0
  14. package/examples/react-integration/index.html +13 -0
  15. package/examples/react-integration/package.json +29 -0
  16. package/examples/react-integration/public/vite.svg +1 -0
  17. package/examples/react-integration/tsconfig.node.json +11 -0
  18. package/examples/react-integration/vite.config.ts +7 -0
  19. package/package.json +20 -3
  20. package/rollup.config.mjs +61 -0
  21. package/test-setup.js +2 -0
  22. package/dist/_module.d.ts +0 -6
  23. package/dist/_module.d.ts.map +0 -1
  24. package/dist/_module.js +0 -8
  25. package/dist/_module.js.map +0 -1
  26. package/dist/api-data.d.ts +0 -47
  27. package/dist/api-data.d.ts.map +0 -1
  28. package/dist/api-data.js +0 -84
  29. package/dist/api-data.js.map +0 -1
  30. package/dist/api.d.ts +0 -32
  31. package/dist/api.d.ts.map +0 -1
  32. package/dist/api.js +0 -138
  33. package/dist/api.js.map +0 -1
  34. package/dist/auth-user.d.ts +0 -23
  35. package/dist/auth-user.d.ts.map +0 -1
  36. package/dist/auth-user.js +0 -290
  37. package/dist/auth-user.js.map +0 -1
  38. package/dist/auth.d.ts +0 -82
  39. package/dist/auth.d.ts.map +0 -1
  40. package/dist/auth.js +0 -122
  41. package/dist/auth.js.map +0 -1
  42. package/dist/errors.d.ts +0 -28
  43. package/dist/errors.d.ts.map +0 -1
  44. package/dist/errors.js +0 -26
  45. package/dist/errors.js.map +0 -1
  46. package/dist/profile.d.ts +0 -80
  47. package/dist/profile.d.ts.map +0 -1
  48. package/dist/profile.js +0 -127
  49. package/dist/profile.js.map +0 -1
  50. package/dist/relationships.d.ts +0 -8
  51. package/dist/relationships.d.ts.map +0 -1
  52. package/dist/relationships.js +0 -93
  53. package/dist/relationships.js.map +0 -1
  54. package/dist/requests.d.ts +0 -9
  55. package/dist/requests.d.ts.map +0 -1
  56. package/dist/requests.js +0 -26
  57. package/dist/requests.js.map +0 -1
  58. package/dist/scraper.d.ts.map +0 -1
  59. package/dist/scraper.js +0 -357
  60. package/dist/scraper.js.map +0 -1
  61. package/dist/search.d.ts +0 -19
  62. package/dist/search.d.ts.map +0 -1
  63. package/dist/search.js +0 -99
  64. package/dist/search.js.map +0 -1
  65. package/dist/timeline-async.d.ts +0 -15
  66. package/dist/timeline-async.d.ts.map +0 -1
  67. package/dist/timeline-async.js +0 -53
  68. package/dist/timeline-async.js.map +0 -1
  69. package/dist/timeline-list.d.ts +0 -19
  70. package/dist/timeline-list.d.ts.map +0 -1
  71. package/dist/timeline-list.js +0 -46
  72. package/dist/timeline-list.js.map +0 -1
  73. package/dist/timeline-relationship.d.ts +0 -39
  74. package/dist/timeline-relationship.d.ts.map +0 -1
  75. package/dist/timeline-relationship.js +0 -46
  76. package/dist/timeline-relationship.js.map +0 -1
  77. package/dist/timeline-search.d.ts +0 -20
  78. package/dist/timeline-search.d.ts.map +0 -1
  79. package/dist/timeline-search.js +0 -93
  80. package/dist/timeline-search.js.map +0 -1
  81. package/dist/timeline-tweet-util.d.ts +0 -9
  82. package/dist/timeline-tweet-util.d.ts.map +0 -1
  83. package/dist/timeline-tweet-util.js +0 -108
  84. package/dist/timeline-tweet-util.js.map +0 -1
  85. package/dist/timeline-v1.d.ts +0 -233
  86. package/dist/timeline-v1.d.ts.map +0 -1
  87. package/dist/timeline-v1.js +0 -197
  88. package/dist/timeline-v1.js.map +0 -1
  89. package/dist/timeline-v2.d.ts +0 -94
  90. package/dist/timeline-v2.d.ts.map +0 -1
  91. package/dist/timeline-v2.js +0 -253
  92. package/dist/timeline-v2.js.map +0 -1
  93. package/dist/trends.d.ts +0 -3
  94. package/dist/trends.d.ts.map +0 -1
  95. package/dist/trends.js +0 -39
  96. package/dist/trends.js.map +0 -1
  97. package/dist/tweets.d.ts +0 -117
  98. package/dist/tweets.d.ts.map +0 -1
  99. package/dist/tweets.js +0 -202
  100. package/dist/tweets.js.map +0 -1
  101. package/dist/type-util.d.ts +0 -6
  102. package/dist/type-util.d.ts.map +0 -1
  103. package/dist/type-util.js +0 -14
  104. package/dist/type-util.js.map +0 -1
package/dist/api-data.js DELETED
@@ -1,84 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.apiRequestFactory = void 0;
7
- const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
8
- /**
9
- * Examples of requests to API endpoints. These are parsed at runtime and used
10
- * as templates for requests to a particular endpoint. Please ensure these do
11
- * not contain any information that you do not want published to NPM.
12
- */
13
- const endpoints = {
14
- // TODO: Migrate other endpoint URLs here
15
- UserTweets: 'https://twitter.com/i/api/graphql/V7H0Ap3_Hh2FyS75OCDO3Q/UserTweets?variables=%7B%22userId%22%3A%224020276615%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_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%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_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%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%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',
16
- UserTweetsAndReplies: 'https://twitter.com/i/api/graphql/E4wA5vo2sjVyvpliUffSCw/UserTweetsAndReplies?variables=%7B%22userId%22%3A%224020276615%22%2C%22count%22%3A40%2C%22cursor%22%3A%22DAABCgABGPWl-F-ATiIKAAIY9YfiF1rRAggAAwAAAAEAAA%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_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%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_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%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%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',
17
- UserLikedTweets: 'https://twitter.com/i/api/graphql/eSSNbhECHHWWALkkQq-YTA/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%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_graphql_exclude_directive_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%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_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%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%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',
18
- TweetDetail: 'https://twitter.com/i/api/graphql/xOhkmRac04YFZmOzU9PJHg/TweetDetail?variables=%7B%22focalTweetId%22%3A%221237110546383724547%22%2C%22with_rux_injections%22%3Afalse%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_graphql_exclude_directive_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%22tweetypie_unmention_optimization_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%3Afalse%2C%22tweet_awards_web_tipping_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_media_download_video_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Afalse%7D',
19
- TweetResultByRestId: 'https://twitter.com/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221237110546383724547%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%22tweetypie_unmention_optimization_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%3Afalse%2C%22tweet_awards_web_tipping_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_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_media_download_video_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',
20
- ListTweets: 'https://twitter.com/i/api/graphql/whF0_KH1fCkdLLoyNPMoEw/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22responsive_web_graphql_exclude_directive_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%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_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%3Afalse%2C%22tweet_awards_web_tipping_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%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',
21
- };
22
- /** Wrapper class for API request information. */
23
- class ApiRequest {
24
- constructor(info) {
25
- this.url = info.url;
26
- this.variables = info.variables;
27
- this.features = info.features;
28
- this.fieldToggles = info.fieldToggles;
29
- }
30
- toRequestUrl() {
31
- const params = new URLSearchParams();
32
- // Only include query parameters with values
33
- if (this.variables) {
34
- // Stringify with the query keys in sorted order like the Go package
35
- params.set('variables', (0, json_stable_stringify_1.default)(this.variables));
36
- }
37
- if (this.features) {
38
- params.set('features', (0, json_stable_stringify_1.default)(this.features));
39
- }
40
- if (this.fieldToggles) {
41
- params.set('fieldToggles', (0, json_stable_stringify_1.default)(this.fieldToggles));
42
- }
43
- return `${this.url}?${params.toString()}`;
44
- }
45
- }
46
- /**
47
- * Parses information from a Twitter API endpoint using an example request
48
- * URL against that endpoint. This can be used to extract GraphQL parameters
49
- * in order to easily reuse and/or override them later.
50
- * @param example An example of the endpoint to analyze.
51
- * @returns The parsed endpoint information.
52
- */
53
- function parseEndpointExample(example) {
54
- const { protocol, host, pathname, searchParams: query } = new URL(example);
55
- const base = `${protocol}//${host}${pathname}`;
56
- const variables = query.get('variables');
57
- const features = query.get('features');
58
- const fieldToggles = query.get('fieldToggles');
59
- return new ApiRequest({
60
- url: base,
61
- variables: variables ? JSON.parse(variables) : undefined,
62
- features: features ? JSON.parse(features) : undefined,
63
- fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined,
64
- });
65
- }
66
- function createApiRequestFactory(endpoints) {
67
- return Object.entries(endpoints)
68
- .map(([endpointName, endpointExample]) => {
69
- // Create a partial factory for only one endpoint
70
- return {
71
- [`create${endpointName}Request`]: () => {
72
- // Create a new instance on each invocation so that we can safely
73
- // mutate requests before sending them off
74
- return parseEndpointExample(endpointExample);
75
- },
76
- };
77
- })
78
- .reduce((agg, next) => {
79
- // Merge all of our factories into one that includes every endpoint
80
- return Object.assign(agg, next);
81
- });
82
- }
83
- exports.apiRequestFactory = createApiRequestFactory(endpoints);
84
- //# sourceMappingURL=api-data.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-data.js","sourceRoot":"","sources":["../src/api-data.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts DELETED
@@ -1,32 +0,0 @@
1
- type FetchParameters = [input: RequestInfo | URL, init?: RequestInit];
2
- export interface FetchTransformOptions {
3
- /**
4
- * Transforms the request options before a request is made. This executes after all of the default
5
- * parameters have been configured, and is stateless. It is safe to return new request options
6
- * objects.
7
- * @param args The request options.
8
- * @returns The transformed request options.
9
- */
10
- request: (...args: FetchParameters) => FetchParameters | Promise<FetchParameters>;
11
- /**
12
- * Transforms the response after a request completes. This executes immediately after the request
13
- * completes, and is stateless. It is safe to return a new response object.
14
- * @param response The response object.
15
- * @returns The transformed response object.
16
- */
17
- response: (response: Response) => Response | Promise<Response>;
18
- }
19
- export declare const bearerToken = "AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF";
20
- /**
21
- * An API result container.
22
- */
23
- export type RequestApiResult<T> = {
24
- success: true;
25
- value: T;
26
- } | {
27
- success: false;
28
- err: Error;
29
- };
30
- export declare function addApiParams(params: URLSearchParams, includeTweetReplies: boolean): URLSearchParams;
31
- export {};
32
- //# sourceMappingURL=api.d.ts.map
package/dist/api.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAOA,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,OAAO,EAAE,CACP,GAAG,IAAI,EAAE,eAAe,KACrB,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhD;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChE;AAED,eAAO,MAAM,WAAW,qHAC4F,CAAC;AAErH;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC3B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC;AA2GnC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,OAAO,GAC3B,eAAe,CAoCjB"}
package/dist/api.js DELETED
@@ -1,138 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addApiParams = exports.addApiFeatures = exports.requestApi = exports.bearerToken = void 0;
4
- const errors_1 = require("./errors");
5
- const requests_1 = require("./requests");
6
- const headers_polyfill_1 = require("headers-polyfill");
7
- exports.bearerToken = 'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF';
8
- /**
9
- * Used internally to send HTTP requests to the Twitter API.
10
- * @internal
11
- * @param url - The URL to send the request to.
12
- * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request.
13
- * @param method - The HTTP method used when sending this request.
14
- */
15
- async function requestApi(url, auth, method = 'GET') {
16
- const headers = new headers_polyfill_1.Headers();
17
- await auth.installTo(headers, url);
18
- let res;
19
- do {
20
- try {
21
- res = await auth.fetch(url, {
22
- method,
23
- headers,
24
- });
25
- }
26
- catch (err) {
27
- if (!(err instanceof Error)) {
28
- throw err;
29
- }
30
- return {
31
- success: false,
32
- err: new Error('Failed to perform request.'),
33
- };
34
- }
35
- await (0, requests_1.updateCookieJar)(auth.cookieJar(), res.headers);
36
- if (res.status === 429) {
37
- /*
38
- Known headers at this point:
39
- - x-rate-limit-limit: Maximum number of requests per time period?
40
- - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset.
41
- - x-rate-limit-remaining: Number of requests remaining in current time period?
42
- */
43
- const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining');
44
- const xRateLimitReset = res.headers.get('x-rate-limit-reset');
45
- if (xRateLimitRemaining == '0' && xRateLimitReset) {
46
- const currentTime = new Date().valueOf() / 1000;
47
- const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime);
48
- // I have seen this block for 800s (~13 *minutes*)
49
- await new Promise((resolve) => setTimeout(resolve, timeDeltaMs));
50
- }
51
- }
52
- } while (res.status === 429);
53
- if (!res.ok) {
54
- return {
55
- success: false,
56
- err: await errors_1.ApiError.fromResponse(res),
57
- };
58
- }
59
- const value = await res.json();
60
- if (res.headers.get('x-rate-limit-incoming') == '0') {
61
- auth.deleteToken();
62
- return { success: true, value };
63
- }
64
- else {
65
- return { success: true, value };
66
- }
67
- }
68
- exports.requestApi = requestApi;
69
- /** @internal */
70
- function addApiFeatures(o) {
71
- return {
72
- ...o,
73
- rweb_lists_timeline_redesign_enabled: true,
74
- responsive_web_graphql_exclude_directive_enabled: true,
75
- verified_phone_label_enabled: false,
76
- creator_subscriptions_tweet_preview_api_enabled: true,
77
- responsive_web_graphql_timeline_navigation_enabled: true,
78
- responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,
79
- tweetypie_unmention_optimization_enabled: true,
80
- responsive_web_edit_tweet_api_enabled: true,
81
- graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,
82
- view_counts_everywhere_api_enabled: true,
83
- longform_notetweets_consumption_enabled: true,
84
- tweet_awards_web_tipping_enabled: false,
85
- freedom_of_speech_not_reach_fetch_enabled: true,
86
- standardized_nudges_misinfo: true,
87
- longform_notetweets_rich_text_read_enabled: true,
88
- responsive_web_enhance_cards_enabled: false,
89
- subscriptions_verification_info_enabled: true,
90
- subscriptions_verification_info_reason_enabled: true,
91
- subscriptions_verification_info_verified_since_enabled: true,
92
- super_follow_badge_privacy_enabled: false,
93
- super_follow_exclusive_tweet_notifications_enabled: false,
94
- super_follow_tweet_api_enabled: false,
95
- super_follow_user_api_enabled: false,
96
- android_graphql_skip_api_media_color_palette: false,
97
- creator_subscriptions_subscription_count_enabled: false,
98
- blue_business_profile_image_shape_enabled: false,
99
- unified_cards_ad_metadata_container_dynamic_card_content_query_enabled: false,
100
- };
101
- }
102
- exports.addApiFeatures = addApiFeatures;
103
- function addApiParams(params, includeTweetReplies) {
104
- params.set('include_profile_interstitial_type', '1');
105
- params.set('include_blocking', '1');
106
- params.set('include_blocked_by', '1');
107
- params.set('include_followed_by', '1');
108
- params.set('include_want_retweets', '1');
109
- params.set('include_mute_edge', '1');
110
- params.set('include_can_dm', '1');
111
- params.set('include_can_media_tag', '1');
112
- params.set('include_ext_has_nft_avatar', '1');
113
- params.set('include_ext_is_blue_verified', '1');
114
- params.set('include_ext_verified_type', '1');
115
- params.set('skip_status', '1');
116
- params.set('cards_platform', 'Web-12');
117
- params.set('include_cards', '1');
118
- params.set('include_ext_alt_text', 'true');
119
- params.set('include_ext_limited_action_results', 'false');
120
- params.set('include_quote_count', 'true');
121
- params.set('include_reply_count', '1');
122
- params.set('tweet_mode', 'extended');
123
- params.set('include_ext_collab_control', 'true');
124
- params.set('include_ext_views', 'true');
125
- params.set('include_entities', 'true');
126
- params.set('include_user_entities', 'true');
127
- params.set('include_ext_media_color', 'true');
128
- params.set('include_ext_media_availability', 'true');
129
- params.set('include_ext_sensitive_media_warning', 'true');
130
- params.set('include_ext_trusted_friends_metadata', 'true');
131
- params.set('send_error_codes', 'true');
132
- params.set('simple_quoted_tweet', 'true');
133
- params.set('include_tweet_replies', `${includeTweetReplies}`);
134
- params.set('ext', 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe');
135
- return params;
136
- }
137
- exports.addApiParams = addApiParams;
138
- //# sourceMappingURL=api.js.map
package/dist/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import { TwitterAuthOptions, TwitterGuestAuth } from './auth';
2
- import { Headers } from 'headers-polyfill';
3
- /**
4
- * A user authentication token manager.
5
- */
6
- export declare class TwitterUserAuth extends TwitterGuestAuth {
7
- constructor(bearerToken: string, options?: Partial<TwitterAuthOptions>);
8
- isLoggedIn(): Promise<boolean>;
9
- login(username: string, password: string, email?: string, twoFactorSecret?: string): Promise<void>;
10
- logout(): Promise<void>;
11
- installCsrfToken(headers: Headers): Promise<void>;
12
- installTo(headers: Headers, url: string): Promise<void>;
13
- private initLogin;
14
- private handleJsInstrumentationSubtask;
15
- private handleEnterUserIdentifierSSO;
16
- private handleEnterPassword;
17
- private handleAccountDuplicationCheck;
18
- private handleTwoFactorAuthChallenge;
19
- private handleAcid;
20
- private handleSuccessSubtask;
21
- private executeFlowTask;
22
- }
23
- //# sourceMappingURL=auth-user.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-user.d.ts","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAI9D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AA+C3C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAIhE,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAa9B,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAkCV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAcvB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAM/C,SAAS;YAcT,8BAA8B;YAe9B,4BAA4B;YAyB5B,mBAAmB;YAkBnB,6BAA6B;YAc7B,4BAA4B;YA4B5B,UAAU;YAkBV,oBAAoB;YAOpB,eAAe;CAyE9B"}
package/dist/auth-user.js DELETED
@@ -1,290 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.TwitterUserAuth = void 0;
27
- const auth_1 = require("./auth");
28
- const api_1 = require("./api");
29
- const tough_cookie_1 = require("tough-cookie");
30
- const requests_1 = require("./requests");
31
- const headers_polyfill_1 = require("headers-polyfill");
32
- const typebox_1 = require("@sinclair/typebox");
33
- const value_1 = require("@sinclair/typebox/value");
34
- const OTPAuth = __importStar(require("otpauth"));
35
- const TwitterUserAuthSubtask = typebox_1.Type.Object({
36
- subtask_id: typebox_1.Type.String(),
37
- enter_text: typebox_1.Type.Optional(typebox_1.Type.Object({})),
38
- });
39
- /**
40
- * A user authentication token manager.
41
- */
42
- class TwitterUserAuth extends auth_1.TwitterGuestAuth {
43
- constructor(bearerToken, options) {
44
- super(bearerToken, options);
45
- }
46
- async isLoggedIn() {
47
- const res = await (0, api_1.requestApi)('https://api.twitter.com/1.1/account/verify_credentials.json', this);
48
- if (!res.success) {
49
- return false;
50
- }
51
- const { value: verify } = res;
52
- return verify && !verify.errors?.length;
53
- }
54
- async login(username, password, email, twoFactorSecret) {
55
- await this.updateGuestToken();
56
- let next = await this.initLogin();
57
- while ('subtask' in next && next.subtask) {
58
- if (next.subtask.subtask_id === 'LoginJsInstrumentationSubtask') {
59
- next = await this.handleJsInstrumentationSubtask(next);
60
- }
61
- else if (next.subtask.subtask_id === 'LoginEnterUserIdentifierSSO') {
62
- next = await this.handleEnterUserIdentifierSSO(next, username);
63
- }
64
- else if (next.subtask.subtask_id === 'LoginEnterPassword') {
65
- next = await this.handleEnterPassword(next, password);
66
- }
67
- else if (next.subtask.subtask_id === 'AccountDuplicationCheck') {
68
- next = await this.handleAccountDuplicationCheck(next);
69
- }
70
- else if (next.subtask.subtask_id === 'LoginTwoFactorAuthChallenge') {
71
- if (twoFactorSecret) {
72
- next = await this.handleTwoFactorAuthChallenge(next, twoFactorSecret);
73
- }
74
- else {
75
- throw new Error('Requested two factor authentication code but no secret provided');
76
- }
77
- }
78
- else if (next.subtask.subtask_id === 'LoginAcid') {
79
- next = await this.handleAcid(next, email);
80
- }
81
- else if (next.subtask.subtask_id === 'LoginSuccessSubtask') {
82
- next = await this.handleSuccessSubtask(next);
83
- }
84
- else {
85
- throw new Error(`Unknown subtask ${next.subtask.subtask_id}`);
86
- }
87
- }
88
- if ('err' in next) {
89
- throw next.err;
90
- }
91
- }
92
- async logout() {
93
- if (!this.isLoggedIn()) {
94
- return;
95
- }
96
- await (0, api_1.requestApi)('https://api.twitter.com/1.1/account/logout.json', this, 'POST');
97
- this.deleteToken();
98
- this.jar = new tough_cookie_1.CookieJar();
99
- }
100
- async installCsrfToken(headers) {
101
- const cookies = await this.jar.getCookies('https://twitter.com');
102
- const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');
103
- if (xCsrfToken) {
104
- headers.set('x-csrf-token', xCsrfToken.value);
105
- }
106
- }
107
- async installTo(headers, url) {
108
- headers.set('authorization', `Bearer ${this.bearerToken}`);
109
- headers.set('cookie', await this.jar.getCookieString(url));
110
- await this.installCsrfToken(headers);
111
- }
112
- async initLogin() {
113
- return await this.executeFlowTask({
114
- flow_name: 'login',
115
- input_flow_data: {
116
- flow_context: {
117
- debug_overrides: {},
118
- start_location: {
119
- location: 'splash_screen',
120
- },
121
- },
122
- },
123
- });
124
- }
125
- async handleJsInstrumentationSubtask(prev) {
126
- return await this.executeFlowTask({
127
- flow_token: prev.flowToken,
128
- subtask_inputs: [
129
- {
130
- subtask_id: 'LoginJsInstrumentationSubtask',
131
- js_instrumentation: {
132
- response: '{}',
133
- link: 'next_link',
134
- },
135
- },
136
- ],
137
- });
138
- }
139
- async handleEnterUserIdentifierSSO(prev, username) {
140
- return await this.executeFlowTask({
141
- flow_token: prev.flowToken,
142
- subtask_inputs: [
143
- {
144
- subtask_id: 'LoginEnterUserIdentifierSSO',
145
- settings_list: {
146
- setting_responses: [
147
- {
148
- key: 'user_identifier',
149
- response_data: {
150
- text_data: { result: username },
151
- },
152
- },
153
- ],
154
- link: 'next_link',
155
- },
156
- },
157
- ],
158
- });
159
- }
160
- async handleEnterPassword(prev, password) {
161
- return await this.executeFlowTask({
162
- flow_token: prev.flowToken,
163
- subtask_inputs: [
164
- {
165
- subtask_id: 'LoginEnterPassword',
166
- enter_password: {
167
- password,
168
- link: 'next_link',
169
- },
170
- },
171
- ],
172
- });
173
- }
174
- async handleAccountDuplicationCheck(prev) {
175
- return await this.executeFlowTask({
176
- flow_token: prev.flowToken,
177
- subtask_inputs: [
178
- {
179
- subtask_id: 'AccountDuplicationCheck',
180
- check_logged_in_account: {
181
- link: 'AccountDuplicationCheck_false',
182
- },
183
- },
184
- ],
185
- });
186
- }
187
- async handleTwoFactorAuthChallenge(prev, secret) {
188
- const totp = new OTPAuth.TOTP({ secret });
189
- let error;
190
- for (let attempts = 1; attempts < 4; attempts += 1) {
191
- try {
192
- return await this.executeFlowTask({
193
- flow_token: prev.flowToken,
194
- subtask_inputs: [
195
- {
196
- subtask_id: 'LoginTwoFactorAuthChallenge',
197
- enter_text: {
198
- link: 'next_link',
199
- text: totp.generate(),
200
- },
201
- },
202
- ],
203
- });
204
- }
205
- catch (err) {
206
- error = err;
207
- await new Promise((resolve) => setTimeout(resolve, 2000 * attempts));
208
- }
209
- }
210
- throw error;
211
- }
212
- async handleAcid(prev, email) {
213
- return await this.executeFlowTask({
214
- flow_token: prev.flowToken,
215
- subtask_inputs: [
216
- {
217
- subtask_id: 'LoginAcid',
218
- enter_text: {
219
- text: email,
220
- link: 'next_link',
221
- },
222
- },
223
- ],
224
- });
225
- }
226
- async handleSuccessSubtask(prev) {
227
- return await this.executeFlowTask({
228
- flow_token: prev.flowToken,
229
- subtask_inputs: [],
230
- });
231
- }
232
- async executeFlowTask(data) {
233
- const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';
234
- const token = this.guestToken;
235
- if (token == null) {
236
- throw new Error('Authentication token is null or undefined.');
237
- }
238
- const headers = new headers_polyfill_1.Headers({
239
- authorization: `Bearer ${this.bearerToken}`,
240
- cookie: await this.jar.getCookieString(onboardingTaskUrl),
241
- 'content-type': 'application/json',
242
- 'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',
243
- 'x-guest-token': token,
244
- 'x-twitter-auth-type': 'OAuth2Client',
245
- 'x-twitter-active-user': 'yes',
246
- 'x-twitter-client-language': 'en',
247
- });
248
- await this.installCsrfToken(headers);
249
- const res = await this.fetch(onboardingTaskUrl, {
250
- method: 'POST',
251
- headers: headers,
252
- body: JSON.stringify(data),
253
- });
254
- await (0, requests_1.updateCookieJar)(this.jar, res.headers);
255
- if (!res.ok) {
256
- return { status: 'error', err: new Error(await res.text()) };
257
- }
258
- const flow = await res.json();
259
- if (flow?.flow_token == null) {
260
- return { status: 'error', err: new Error('flow_token not found.') };
261
- }
262
- if (flow.errors?.length) {
263
- return {
264
- status: 'error',
265
- err: new Error(`Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`),
266
- };
267
- }
268
- if (typeof flow.flow_token !== 'string') {
269
- return {
270
- status: 'error',
271
- err: new Error('flow_token was not a string.'),
272
- };
273
- }
274
- const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined;
275
- (0, value_1.Check)(TwitterUserAuthSubtask, subtask);
276
- if (subtask && subtask.subtask_id === 'DenyLoginSubtask') {
277
- return {
278
- status: 'error',
279
- err: new Error('Authentication error: DenyLoginSubtask'),
280
- };
281
- }
282
- return {
283
- status: 'success',
284
- subtask,
285
- flowToken: flow.flow_token,
286
- };
287
- }
288
- }
289
- exports.TwitterUserAuth = TwitterUserAuth;
290
- //# sourceMappingURL=auth-user.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-user.js","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"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"}