@the-convocation/twitter-scraper 0.1.5 → 0.3.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/dist/_module.d.ts +1 -1
- package/dist/_module.d.ts.map +1 -1
- package/dist/api.d.ts +19 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +61 -45
- package/dist/api.js.map +1 -1
- package/dist/auth-user.d.ts +2 -3
- package/dist/auth-user.d.ts.map +1 -1
- package/dist/auth-user.js +176 -176
- package/dist/auth-user.js.map +1 -1
- package/dist/auth.d.ts +4 -7
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +44 -48
- package/dist/auth.js.map +1 -1
- package/dist/errors.d.ts +3 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +56 -67
- package/dist/profile.js.map +1 -1
- package/dist/requests.d.ts +9 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +26 -0
- package/dist/requests.js.map +1 -0
- package/dist/scraper.d.ts +13 -13
- package/dist/scraper.d.ts.map +1 -1
- package/dist/scraper.js +49 -69
- package/dist/scraper.js.map +1 -1
- package/dist/search.d.ts +4 -4
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +62 -62
- package/dist/search.js.map +1 -1
- package/dist/timeline-async.d.ts +2 -2
- package/dist/timeline-async.d.ts.map +1 -1
- package/dist/timeline-async.js +34 -50
- package/dist/timeline-async.js.map +1 -1
- package/dist/timeline-search.d.ts +20 -0
- package/dist/timeline-search.d.ts.map +1 -0
- package/dist/timeline-search.js +75 -0
- package/dist/timeline-search.js.map +1 -0
- package/dist/timeline-tweet-util.d.ts +9 -0
- package/dist/timeline-tweet-util.d.ts.map +1 -0
- package/dist/timeline-tweet-util.js +102 -0
- package/dist/timeline-tweet-util.js.map +1 -0
- package/dist/{timeline.d.ts → timeline-v1.d.ts} +36 -9
- package/dist/timeline-v1.d.ts.map +1 -0
- package/dist/timeline-v1.js +181 -0
- package/dist/timeline-v1.js.map +1 -0
- package/dist/timeline-v2.d.ts +61 -0
- package/dist/timeline-v2.d.ts.map +1 -0
- package/dist/timeline-v2.js +194 -0
- package/dist/timeline-v2.js.map +1 -0
- package/dist/trends.js +31 -42
- package/dist/trends.js.map +1 -1
- package/dist/tweets.d.ts +12 -6
- package/dist/tweets.d.ts.map +1 -1
- package/dist/tweets.js +79 -86
- package/dist/tweets.js.map +1 -1
- package/dist/type-util.d.ts +6 -0
- package/dist/type-util.d.ts.map +1 -0
- package/dist/type-util.js +14 -0
- package/dist/type-util.js.map +1 -0
- package/package.json +11 -2
- package/dist/timeline.d.ts.map +0 -1
- package/dist/timeline.js +0 -280
- package/dist/timeline.js.map +0 -1
package/dist/_module.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Profile } from './profile';
|
|
2
2
|
export { Scraper } from './scraper';
|
|
3
3
|
export { SearchMode } from './search';
|
|
4
|
-
export { QueryProfilesResponse, QueryTweetsResponse } from './timeline';
|
|
4
|
+
export { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';
|
|
5
5
|
export { Tweet } from './tweets';
|
|
6
6
|
//# sourceMappingURL=_module.d.ts.map
|
package/dist/_module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_module.d.ts","sourceRoot":"","sources":["../src/_module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_module.d.ts","sourceRoot":"","sources":["../src/_module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/api.d.ts
CHANGED
|
@@ -11,8 +11,24 @@ export type RequestApiResult<T> = {
|
|
|
11
11
|
success: false;
|
|
12
12
|
err: Error;
|
|
13
13
|
};
|
|
14
|
-
|
|
15
|
-
export declare function
|
|
14
|
+
export declare function requestApi<T>(url: string, auth: TwitterAuth, method?: 'GET' | 'POST'): Promise<RequestApiResult<T>>;
|
|
15
|
+
export declare function addApiFeatures(o: object): {
|
|
16
|
+
rweb_lists_timeline_redesign_enabled: boolean;
|
|
17
|
+
responsive_web_graphql_exclude_directive_enabled: boolean;
|
|
18
|
+
verified_phone_label_enabled: boolean;
|
|
19
|
+
creator_subscriptions_tweet_preview_api_enabled: boolean;
|
|
20
|
+
responsive_web_graphql_timeline_navigation_enabled: boolean;
|
|
21
|
+
responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean;
|
|
22
|
+
tweetypie_unmention_optimization_enabled: boolean;
|
|
23
|
+
responsive_web_edit_tweet_api_enabled: boolean;
|
|
24
|
+
graphql_is_translatable_rweb_tweet_is_translatable_enabled: boolean;
|
|
25
|
+
view_counts_everywhere_api_enabled: boolean;
|
|
26
|
+
longform_notetweets_consumption_enabled: boolean;
|
|
27
|
+
tweet_awards_web_tipping_enabled: boolean;
|
|
28
|
+
freedom_of_speech_not_reach_fetch_enabled: boolean;
|
|
29
|
+
standardized_nudges_misinfo: boolean;
|
|
30
|
+
longform_notetweets_rich_text_read_enabled: boolean;
|
|
31
|
+
responsive_web_enhance_cards_enabled: boolean;
|
|
32
|
+
};
|
|
16
33
|
export declare function addApiParams(params: URLSearchParams, includeTweetReplies: boolean): URLSearchParams;
|
|
17
|
-
export {};
|
|
18
34
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAMrC,eAAO,MAAM,WAAW,uHAC8F,CAAC;AACvH,eAAO,MAAM,YAAY,6GACmF,CAAC;AAE7G;;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;AAEnC,wBAAsB,UAAU,CAAC,CAAC,EAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,MAAM,GAAE,KAAK,GAAG,MAAc,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAqC9B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;EAoBvC;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,OAAO,GAC3B,eAAe,CAoCjB"}
|
package/dist/api.js
CHANGED
|
@@ -1,57 +1,73 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
4
|
};
|
|
11
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.addApiParams = exports.requestApi = exports.bearerToken2 = exports.bearerToken = void 0;
|
|
13
|
-
const got_scraping_1 = require("got-scraping");
|
|
6
|
+
exports.addApiParams = exports.addApiFeatures = exports.requestApi = exports.bearerToken2 = exports.bearerToken = void 0;
|
|
14
7
|
const errors_1 = require("./errors");
|
|
8
|
+
const requests_1 = require("./requests");
|
|
9
|
+
const headers_polyfill_1 = require("headers-polyfill");
|
|
10
|
+
const cross_fetch_1 = __importDefault(require("cross-fetch"));
|
|
15
11
|
exports.bearerToken = 'AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw';
|
|
16
12
|
exports.bearerToken2 = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
|
|
17
|
-
function requestApi(url, auth, method = '
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
async function requestApi(url, auth, method = 'GET') {
|
|
14
|
+
const headers = new headers_polyfill_1.Headers();
|
|
15
|
+
await auth.installTo(headers, url);
|
|
16
|
+
let res;
|
|
17
|
+
try {
|
|
18
|
+
res = await (0, cross_fetch_1.default)(url, {
|
|
19
|
+
method,
|
|
20
|
+
headers,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (!(err instanceof Error)) {
|
|
25
|
+
throw err;
|
|
28
26
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
else {
|
|
50
|
-
return { success: true, value };
|
|
51
|
-
}
|
|
52
|
-
});
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
err: new Error('Failed to perform request.'),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
await (0, requests_1.updateCookieJar)(auth.cookieJar(), res.headers);
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
err: new errors_1.ApiError(res, `Response status: ${res.status}`),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const value = await res.json();
|
|
40
|
+
if (res.headers.get('x-rate-limit-incoming') == '0') {
|
|
41
|
+
auth.deleteToken();
|
|
42
|
+
return { success: true, value };
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return { success: true, value };
|
|
46
|
+
}
|
|
53
47
|
}
|
|
54
48
|
exports.requestApi = requestApi;
|
|
49
|
+
function addApiFeatures(o) {
|
|
50
|
+
return {
|
|
51
|
+
...o,
|
|
52
|
+
rweb_lists_timeline_redesign_enabled: true,
|
|
53
|
+
responsive_web_graphql_exclude_directive_enabled: true,
|
|
54
|
+
verified_phone_label_enabled: false,
|
|
55
|
+
creator_subscriptions_tweet_preview_api_enabled: true,
|
|
56
|
+
responsive_web_graphql_timeline_navigation_enabled: true,
|
|
57
|
+
responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,
|
|
58
|
+
tweetypie_unmention_optimization_enabled: true,
|
|
59
|
+
responsive_web_edit_tweet_api_enabled: true,
|
|
60
|
+
graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,
|
|
61
|
+
view_counts_everywhere_api_enabled: true,
|
|
62
|
+
longform_notetweets_consumption_enabled: true,
|
|
63
|
+
tweet_awards_web_tipping_enabled: false,
|
|
64
|
+
freedom_of_speech_not_reach_fetch_enabled: true,
|
|
65
|
+
standardized_nudges_misinfo: true,
|
|
66
|
+
longform_notetweets_rich_text_read_enabled: true,
|
|
67
|
+
responsive_web_enhance_cards_enabled: false,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
exports.addApiFeatures = addApiFeatures;
|
|
55
71
|
function addApiParams(params, includeTweetReplies) {
|
|
56
72
|
params.set('include_profile_interstitial_type', '1');
|
|
57
73
|
params.set('include_blocking', '1');
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth-user.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TwitterGuestAuth } from './auth';
|
|
2
|
+
import { Headers } from 'headers-polyfill';
|
|
2
3
|
/**
|
|
3
4
|
* A user authentication token manager.
|
|
4
5
|
*/
|
|
@@ -7,9 +8,7 @@ export declare class TwitterUserAuth extends TwitterGuestAuth {
|
|
|
7
8
|
isLoggedIn(): Promise<boolean>;
|
|
8
9
|
login(username: string, password: string, email?: string): Promise<void>;
|
|
9
10
|
logout(): Promise<void>;
|
|
10
|
-
installTo(headers:
|
|
11
|
-
[key: string]: unknown;
|
|
12
|
-
}, url: string): Promise<void>;
|
|
11
|
+
installTo(headers: Headers, url: string): Promise<void>;
|
|
13
12
|
private executeFlowTask;
|
|
14
13
|
}
|
|
15
14
|
//# sourceMappingURL=auth-user.d.ts.map
|
package/dist/auth-user.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-user.d.ts","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-user.d.ts","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAI1C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AA2C3C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,WAAW,EAAE,MAAM;IAIzB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAa9B,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAgHV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAcvB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW/C,eAAe;CA2F9B"}
|
package/dist/auth-user.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
4
|
};
|
|
11
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
6
|
exports.TwitterUserAuth = void 0;
|
|
13
|
-
const got_scraping_1 = require("got-scraping");
|
|
14
7
|
const auth_1 = require("./auth");
|
|
15
8
|
const api_1 = require("./api");
|
|
16
9
|
const tough_cookie_1 = require("tough-cookie");
|
|
10
|
+
const requests_1 = require("./requests");
|
|
11
|
+
const headers_polyfill_1 = require("headers-polyfill");
|
|
12
|
+
const cross_fetch_1 = __importDefault(require("cross-fetch"));
|
|
17
13
|
/**
|
|
18
14
|
* A user authentication token manager.
|
|
19
15
|
*/
|
|
@@ -21,195 +17,199 @@ class TwitterUserAuth extends auth_1.TwitterGuestAuth {
|
|
|
21
17
|
constructor(bearerToken) {
|
|
22
18
|
super(bearerToken);
|
|
23
19
|
}
|
|
24
|
-
isLoggedIn() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const { value: verify } = res;
|
|
32
|
-
return verify && !((_a = verify.errors) === null || _a === void 0 ? void 0 : _a.length);
|
|
33
|
-
});
|
|
20
|
+
async isLoggedIn() {
|
|
21
|
+
const res = await (0, api_1.requestApi)('https://api.twitter.com/1.1/account/verify_credentials.json', this);
|
|
22
|
+
if (!res.success) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const { value: verify } = res;
|
|
26
|
+
return verify && !verify.errors?.length;
|
|
34
27
|
}
|
|
35
|
-
login(username, password, email) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
link: 'next_link',
|
|
47
|
-
},
|
|
28
|
+
async login(username, password, email) {
|
|
29
|
+
await this.updateGuestToken();
|
|
30
|
+
// Executes the potential acid step in the login flow
|
|
31
|
+
const executeFlowAcid = (ft) => this.executeFlowTask({
|
|
32
|
+
flow_token: ft,
|
|
33
|
+
subtask_inputs: [
|
|
34
|
+
{
|
|
35
|
+
subtask_id: 'LoginAcid',
|
|
36
|
+
enter_text: {
|
|
37
|
+
text: email,
|
|
38
|
+
link: 'next_link',
|
|
48
39
|
},
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
// Handles the result of a flow task
|
|
44
|
+
const handleFlowTokenResult = async (p) => {
|
|
45
|
+
const result = await p;
|
|
46
|
+
const { status } = result;
|
|
47
|
+
if (status === 'error') {
|
|
48
|
+
throw result.err;
|
|
49
|
+
}
|
|
50
|
+
else if (status === 'acid') {
|
|
51
|
+
return await handleFlowTokenResult(executeFlowAcid(result.flowToken));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return result.flowToken;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
// Executes a flow subtask and handles the result
|
|
58
|
+
const executeFlowSubtask = (data) => handleFlowTokenResult(this.executeFlowTask(data));
|
|
59
|
+
await executeFlowSubtask({
|
|
60
|
+
flow_name: 'login',
|
|
61
|
+
input_flow_data: {
|
|
62
|
+
flow_context: {
|
|
63
|
+
debug_overrides: {},
|
|
64
|
+
start_location: {
|
|
65
|
+
location: 'splash_screen',
|
|
75
66
|
},
|
|
76
67
|
},
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
.then((ft) => executeFlowSubtask({
|
|
71
|
+
flow_token: ft,
|
|
72
|
+
subtask_inputs: [
|
|
73
|
+
{
|
|
74
|
+
subtask_id: 'LoginJsInstrumentationSubtask',
|
|
75
|
+
js_instrumentation: {
|
|
76
|
+
response: '{}',
|
|
77
|
+
link: 'next_link',
|
|
87
78
|
},
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
},
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
}))
|
|
82
|
+
.then((ft) => executeFlowSubtask({
|
|
83
|
+
flow_token: ft,
|
|
84
|
+
subtask_inputs: [
|
|
85
|
+
{
|
|
86
|
+
subtask_id: 'LoginEnterUserIdentifierSSO',
|
|
87
|
+
settings_list: {
|
|
88
|
+
setting_responses: [
|
|
89
|
+
{
|
|
90
|
+
key: 'user_identifier',
|
|
91
|
+
response_data: {
|
|
92
|
+
text_data: { result: username },
|
|
102
93
|
},
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
link: 'next_link',
|
|
106
97
|
},
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
}))
|
|
101
|
+
.then((ft) => executeFlowSubtask({
|
|
102
|
+
flow_token: ft,
|
|
103
|
+
subtask_inputs: [
|
|
104
|
+
{
|
|
105
|
+
subtask_id: 'LoginEnterPassword',
|
|
106
|
+
enter_password: {
|
|
107
|
+
password,
|
|
108
|
+
link: 'next_link',
|
|
118
109
|
},
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
}))
|
|
113
|
+
.then((ft) => executeFlowSubtask({
|
|
114
|
+
flow_token: ft,
|
|
115
|
+
subtask_inputs: [
|
|
116
|
+
{
|
|
117
|
+
subtask_id: 'AccountDuplicationCheck',
|
|
118
|
+
check_logged_in_account: {
|
|
119
|
+
link: 'AccountDuplicationCheck_false',
|
|
129
120
|
},
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
});
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
}));
|
|
133
124
|
}
|
|
134
|
-
logout() {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
this.jar = new tough_cookie_1.CookieJar();
|
|
142
|
-
});
|
|
125
|
+
async logout() {
|
|
126
|
+
if (!this.isLoggedIn()) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
await (0, api_1.requestApi)('https://api.twitter.com/1.1/account/logout.json', this, 'POST');
|
|
130
|
+
this.deleteToken();
|
|
131
|
+
this.jar = new tough_cookie_1.CookieJar();
|
|
143
132
|
}
|
|
144
|
-
installTo(headers, url) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
});
|
|
133
|
+
async installTo(headers, url) {
|
|
134
|
+
headers.set('authorization', `Bearer ${this.bearerToken}`);
|
|
135
|
+
headers.set('cookie', await this.jar.getCookieString(url));
|
|
136
|
+
const cookies = await this.jar.getCookies(url);
|
|
137
|
+
const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');
|
|
138
|
+
if (xCsrfToken) {
|
|
139
|
+
headers.set('x-csrf-token', xCsrfToken.value);
|
|
140
|
+
}
|
|
153
141
|
}
|
|
154
|
-
executeFlowTask(data) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
142
|
+
async executeFlowTask(data) {
|
|
143
|
+
const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';
|
|
144
|
+
const token = this.guestToken;
|
|
145
|
+
if (token == null) {
|
|
146
|
+
throw new Error('Authentication token is null or undefined.');
|
|
147
|
+
}
|
|
148
|
+
const headers = new headers_polyfill_1.Headers({
|
|
149
|
+
authorization: `Bearer ${this.bearerToken}`,
|
|
150
|
+
cookie: await this.jar.getCookieString(onboardingTaskUrl),
|
|
151
|
+
'content-type': 'application/json',
|
|
152
|
+
'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',
|
|
153
|
+
'x-guest-token': token,
|
|
154
|
+
'x-twitter-auth-type': 'OAuth2Client',
|
|
155
|
+
'x-twitter-active-user': 'yes',
|
|
156
|
+
'x-twitter-client-language': 'en',
|
|
157
|
+
});
|
|
158
|
+
const res = await (0, cross_fetch_1.default)(onboardingTaskUrl, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: headers,
|
|
161
|
+
body: JSON.stringify(data),
|
|
162
|
+
});
|
|
163
|
+
await (0, requests_1.updateCookieJar)(this.jar, res.headers);
|
|
164
|
+
if (!res.ok) {
|
|
165
|
+
return { status: 'error', err: new Error(await res.text()) };
|
|
166
|
+
}
|
|
167
|
+
const flow = await res.json();
|
|
168
|
+
if (flow?.flow_token == null) {
|
|
169
|
+
return { status: 'error', err: new Error('flow_token not found.') };
|
|
170
|
+
}
|
|
171
|
+
if (flow.errors?.length) {
|
|
172
|
+
return {
|
|
173
|
+
status: 'error',
|
|
174
|
+
err: new Error(`Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (typeof flow.flow_token !== 'string') {
|
|
178
|
+
return {
|
|
179
|
+
status: 'error',
|
|
180
|
+
err: new Error('flow_token was not a string.'),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (flow.subtasks?.length) {
|
|
184
|
+
if (flow.subtasks[0].subtask_id === 'LoginEnterAlternateIdentifierSubtask') {
|
|
185
|
+
return {
|
|
186
|
+
status: 'error',
|
|
187
|
+
err: new Error('Authentication error: LoginEnterAlternateIdentifierSubtask'),
|
|
188
|
+
};
|
|
177
189
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
190
|
+
else if (flow.subtasks[0].subtask_id === 'LoginAcid') {
|
|
191
|
+
return {
|
|
192
|
+
status: 'acid',
|
|
193
|
+
flowToken: flow.flow_token,
|
|
194
|
+
};
|
|
181
195
|
}
|
|
182
|
-
if (
|
|
196
|
+
else if (flow.subtasks[0].subtask_id === 'LoginTwoFactorAuthChallenge') {
|
|
183
197
|
return {
|
|
184
198
|
status: 'error',
|
|
185
|
-
err: new Error(
|
|
199
|
+
err: new Error('Authentication error: LoginTwoFactorAuthChallenge'),
|
|
186
200
|
};
|
|
187
201
|
}
|
|
188
|
-
if (
|
|
202
|
+
else if (flow.subtasks[0].subtask_id === 'DenyLoginSubtask') {
|
|
189
203
|
return {
|
|
190
204
|
status: 'error',
|
|
191
|
-
err: new Error('
|
|
205
|
+
err: new Error('Authentication error: DenyLoginSubtask'),
|
|
192
206
|
};
|
|
193
207
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
else if (flow.subtasks[0].subtask_id === 'LoginAcid') {
|
|
202
|
-
return {
|
|
203
|
-
status: 'acid',
|
|
204
|
-
flowToken: flow.flow_token,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return {
|
|
209
|
-
status: 'success',
|
|
210
|
-
flowToken: flow.flow_token,
|
|
211
|
-
};
|
|
212
|
-
});
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
status: 'success',
|
|
211
|
+
flowToken: flow.flow_token,
|
|
212
|
+
};
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
exports.TwitterUserAuth = TwitterUserAuth;
|