@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.
- package/README.md +71 -38
- package/dist/default/cjs/index.js +2126 -0
- package/dist/default/cjs/index.js.map +1 -0
- package/dist/default/esm/index.mjs +2104 -0
- package/dist/default/esm/index.mjs.map +1 -0
- package/dist/node/cjs/index.cjs +2156 -0
- package/dist/node/cjs/index.cjs.map +1 -0
- package/dist/node/esm/index.mjs +2134 -0
- package/dist/node/esm/index.mjs.map +1 -0
- package/dist/{scraper.d.ts → types/index.d.ts} +284 -8
- package/examples/cors-proxy/package.json +18 -0
- package/examples/node-integration/package.json +12 -0
- package/examples/react-integration/README.md +30 -0
- package/examples/react-integration/index.html +13 -0
- package/examples/react-integration/package.json +29 -0
- package/examples/react-integration/public/vite.svg +1 -0
- package/examples/react-integration/tsconfig.node.json +11 -0
- package/examples/react-integration/vite.config.ts +7 -0
- package/package.json +20 -3
- package/rollup.config.mjs +61 -0
- package/test-setup.js +2 -0
- package/dist/_module.d.ts +0 -6
- package/dist/_module.d.ts.map +0 -1
- package/dist/_module.js +0 -8
- package/dist/_module.js.map +0 -1
- package/dist/api-data.d.ts +0 -47
- package/dist/api-data.d.ts.map +0 -1
- package/dist/api-data.js +0 -84
- package/dist/api-data.js.map +0 -1
- package/dist/api.d.ts +0 -32
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -138
- package/dist/api.js.map +0 -1
- package/dist/auth-user.d.ts +0 -23
- package/dist/auth-user.d.ts.map +0 -1
- package/dist/auth-user.js +0 -290
- package/dist/auth-user.js.map +0 -1
- package/dist/auth.d.ts +0 -82
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -122
- package/dist/auth.js.map +0 -1
- package/dist/errors.d.ts +0 -28
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -26
- package/dist/errors.js.map +0 -1
- package/dist/profile.d.ts +0 -80
- package/dist/profile.d.ts.map +0 -1
- package/dist/profile.js +0 -127
- package/dist/profile.js.map +0 -1
- package/dist/relationships.d.ts +0 -8
- package/dist/relationships.d.ts.map +0 -1
- package/dist/relationships.js +0 -93
- package/dist/relationships.js.map +0 -1
- package/dist/requests.d.ts +0 -9
- package/dist/requests.d.ts.map +0 -1
- package/dist/requests.js +0 -26
- package/dist/requests.js.map +0 -1
- package/dist/scraper.d.ts.map +0 -1
- package/dist/scraper.js +0 -357
- package/dist/scraper.js.map +0 -1
- package/dist/search.d.ts +0 -19
- package/dist/search.d.ts.map +0 -1
- package/dist/search.js +0 -99
- package/dist/search.js.map +0 -1
- package/dist/timeline-async.d.ts +0 -15
- package/dist/timeline-async.d.ts.map +0 -1
- package/dist/timeline-async.js +0 -53
- package/dist/timeline-async.js.map +0 -1
- package/dist/timeline-list.d.ts +0 -19
- package/dist/timeline-list.d.ts.map +0 -1
- package/dist/timeline-list.js +0 -46
- package/dist/timeline-list.js.map +0 -1
- package/dist/timeline-relationship.d.ts +0 -39
- package/dist/timeline-relationship.d.ts.map +0 -1
- package/dist/timeline-relationship.js +0 -46
- package/dist/timeline-relationship.js.map +0 -1
- package/dist/timeline-search.d.ts +0 -20
- package/dist/timeline-search.d.ts.map +0 -1
- package/dist/timeline-search.js +0 -93
- package/dist/timeline-search.js.map +0 -1
- package/dist/timeline-tweet-util.d.ts +0 -9
- package/dist/timeline-tweet-util.d.ts.map +0 -1
- package/dist/timeline-tweet-util.js +0 -108
- package/dist/timeline-tweet-util.js.map +0 -1
- package/dist/timeline-v1.d.ts +0 -233
- package/dist/timeline-v1.d.ts.map +0 -1
- package/dist/timeline-v1.js +0 -197
- package/dist/timeline-v1.js.map +0 -1
- package/dist/timeline-v2.d.ts +0 -94
- package/dist/timeline-v2.d.ts.map +0 -1
- package/dist/timeline-v2.js +0 -253
- package/dist/timeline-v2.js.map +0 -1
- package/dist/trends.d.ts +0 -3
- package/dist/trends.d.ts.map +0 -1
- package/dist/trends.js +0 -39
- package/dist/trends.js.map +0 -1
- package/dist/tweets.d.ts +0 -117
- package/dist/tweets.d.ts.map +0 -1
- package/dist/tweets.js +0 -202
- package/dist/tweets.js.map +0 -1
- package/dist/type-util.d.ts +0 -6
- package/dist/type-util.d.ts.map +0 -1
- package/dist/type-util.js +0 -14
- 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
|
package/dist/api-data.js.map
DELETED
|
@@ -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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"}
|
package/dist/auth-user.d.ts
DELETED
|
@@ -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
|
package/dist/auth-user.d.ts.map
DELETED
|
@@ -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
|
package/dist/auth-user.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-user.js","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"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"}
|