@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.
Files changed (66) hide show
  1. package/dist/_module.d.ts +1 -1
  2. package/dist/_module.d.ts.map +1 -1
  3. package/dist/api.d.ts +19 -3
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +61 -45
  6. package/dist/api.js.map +1 -1
  7. package/dist/auth-user.d.ts +2 -3
  8. package/dist/auth-user.d.ts.map +1 -1
  9. package/dist/auth-user.js +176 -176
  10. package/dist/auth-user.js.map +1 -1
  11. package/dist/auth.d.ts +4 -7
  12. package/dist/auth.d.ts.map +1 -1
  13. package/dist/auth.js +44 -48
  14. package/dist/auth.js.map +1 -1
  15. package/dist/errors.d.ts +3 -4
  16. package/dist/errors.d.ts.map +1 -1
  17. package/dist/errors.js.map +1 -1
  18. package/dist/profile.d.ts.map +1 -1
  19. package/dist/profile.js +56 -67
  20. package/dist/profile.js.map +1 -1
  21. package/dist/requests.d.ts +9 -0
  22. package/dist/requests.d.ts.map +1 -0
  23. package/dist/requests.js +26 -0
  24. package/dist/requests.js.map +1 -0
  25. package/dist/scraper.d.ts +13 -13
  26. package/dist/scraper.d.ts.map +1 -1
  27. package/dist/scraper.js +49 -69
  28. package/dist/scraper.js.map +1 -1
  29. package/dist/search.d.ts +4 -4
  30. package/dist/search.d.ts.map +1 -1
  31. package/dist/search.js +62 -62
  32. package/dist/search.js.map +1 -1
  33. package/dist/timeline-async.d.ts +2 -2
  34. package/dist/timeline-async.d.ts.map +1 -1
  35. package/dist/timeline-async.js +34 -50
  36. package/dist/timeline-async.js.map +1 -1
  37. package/dist/timeline-search.d.ts +20 -0
  38. package/dist/timeline-search.d.ts.map +1 -0
  39. package/dist/timeline-search.js +75 -0
  40. package/dist/timeline-search.js.map +1 -0
  41. package/dist/timeline-tweet-util.d.ts +9 -0
  42. package/dist/timeline-tweet-util.d.ts.map +1 -0
  43. package/dist/timeline-tweet-util.js +102 -0
  44. package/dist/timeline-tweet-util.js.map +1 -0
  45. package/dist/{timeline.d.ts → timeline-v1.d.ts} +36 -9
  46. package/dist/timeline-v1.d.ts.map +1 -0
  47. package/dist/timeline-v1.js +181 -0
  48. package/dist/timeline-v1.js.map +1 -0
  49. package/dist/timeline-v2.d.ts +61 -0
  50. package/dist/timeline-v2.d.ts.map +1 -0
  51. package/dist/timeline-v2.js +194 -0
  52. package/dist/timeline-v2.js.map +1 -0
  53. package/dist/trends.js +31 -42
  54. package/dist/trends.js.map +1 -1
  55. package/dist/tweets.d.ts +12 -6
  56. package/dist/tweets.d.ts.map +1 -1
  57. package/dist/tweets.js +79 -86
  58. package/dist/tweets.js.map +1 -1
  59. package/dist/type-util.d.ts +6 -0
  60. package/dist/type-util.d.ts.map +1 -0
  61. package/dist/type-util.js +14 -0
  62. package/dist/type-util.js.map +1 -0
  63. package/package.json +11 -2
  64. package/dist/timeline.d.ts.map +0 -1
  65. package/dist/timeline.js +0 -280
  66. 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
@@ -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,YAAY,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC"}
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
- type GotRequestMethod = 'get' | 'post';
15
- export declare function requestApi<T>(url: string, auth: TwitterAuth, method?: GotRequestMethod): Promise<RequestApiResult<T>>;
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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,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,KAAK,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,wBAAsB,UAAU,CAAC,CAAC,EAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,MAAM,GAAE,gBAAwB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAoC9B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,OAAO,GAC3B,eAAe,CAoCjB"}
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
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 = 'get') {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- const headers = {};
20
- yield auth.installTo(headers, url);
21
- let res;
22
- try {
23
- res = yield got_scraping_1.gotScraping[method]({
24
- url,
25
- headers,
26
- cookieJar: auth.cookieJar(),
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
- catch (err) {
30
- if (!(err instanceof Error)) {
31
- throw err;
32
- }
33
- return {
34
- success: false,
35
- err: new Error('Failed to perform request.'),
36
- };
37
- }
38
- if (res.statusCode != 200) {
39
- return {
40
- success: false,
41
- err: new errors_1.ApiError(res, `Response status: ${res.statusCode}`),
42
- };
43
- }
44
- const value = JSON.parse(res.body);
45
- if (res.headers['x-rate-limit-incoming'] == '0') {
46
- auth.deleteToken();
47
- return { success: true, value };
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":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"auth-user.d.ts","sourceRoot":"","sources":["../src/auth-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AA4C1C;;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,CACb,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EACnC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;YAUF,eAAe;CAwE9B"}
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
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
- var _a;
26
- return __awaiter(this, void 0, void 0, function* () {
27
- const res = yield (0, api_1.requestApi)('https://api.twitter.com/1.1/account/verify_credentials.json', this);
28
- if (!res.success) {
29
- return false;
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
- return __awaiter(this, void 0, void 0, function* () {
37
- yield this.updateGuestToken();
38
- // Executes the potential acid step in the login flow
39
- const executeFlowAcid = (ft) => this.executeFlowTask({
40
- flow_token: ft,
41
- subtask_inputs: [
42
- {
43
- subtask_id: 'LoginAcid',
44
- enter_text: {
45
- text: email,
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
- // Handles the result of a flow task
52
- const handleFlowTokenResult = (p) => __awaiter(this, void 0, void 0, function* () {
53
- const result = yield p;
54
- const { status } = result;
55
- if (status === 'error') {
56
- throw result.err;
57
- }
58
- else if (status === 'acid') {
59
- return yield handleFlowTokenResult(executeFlowAcid(result.flowToken));
60
- }
61
- else {
62
- return result.flowToken;
63
- }
64
- });
65
- // Executes a flow subtask and handles the result
66
- const executeFlowSubtask = (data) => handleFlowTokenResult(this.executeFlowTask(data));
67
- yield executeFlowSubtask({
68
- flow_name: 'login',
69
- input_flow_data: {
70
- flow_context: {
71
- debug_overrides: {},
72
- start_location: {
73
- location: 'splash_screen',
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
- .then((ft) => executeFlowSubtask({
79
- flow_token: ft,
80
- subtask_inputs: [
81
- {
82
- subtask_id: 'LoginJsInstrumentationSubtask',
83
- js_instrumentation: {
84
- response: '{}',
85
- link: 'next_link',
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
- .then((ft) => executeFlowSubtask({
91
- flow_token: ft,
92
- subtask_inputs: [
93
- {
94
- subtask_id: 'LoginEnterUserIdentifierSSO',
95
- settings_list: {
96
- setting_responses: [
97
- {
98
- key: 'user_identifier',
99
- response_data: {
100
- text_data: { result: username },
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
- link: 'next_link',
105
- },
94
+ },
95
+ ],
96
+ link: 'next_link',
106
97
  },
107
- ],
108
- }))
109
- .then((ft) => executeFlowSubtask({
110
- flow_token: ft,
111
- subtask_inputs: [
112
- {
113
- subtask_id: 'LoginEnterPassword',
114
- enter_password: {
115
- password,
116
- link: 'next_link',
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
- .then((ft) => executeFlowSubtask({
122
- flow_token: ft,
123
- subtask_inputs: [
124
- {
125
- subtask_id: 'AccountDuplicationCheck',
126
- check_logged_in_account: {
127
- link: 'AccountDuplicationCheck_false',
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
- return __awaiter(this, void 0, void 0, function* () {
136
- if (!this.isLoggedIn()) {
137
- return;
138
- }
139
- yield (0, api_1.requestApi)('https://api.twitter.com/1.1/account/logout.json', this, 'post');
140
- this.deleteToken();
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
- return __awaiter(this, void 0, void 0, function* () {
146
- headers['authorization'] = `Bearer ${this.bearerToken}`;
147
- const cookies = yield this.jar.getCookies(url);
148
- const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');
149
- if (xCsrfToken) {
150
- headers['x-csrf-token'] = xCsrfToken.value;
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
- var _a, _b;
156
- return __awaiter(this, void 0, void 0, function* () {
157
- const token = this.guestToken;
158
- if (token == null) {
159
- throw new Error('Authentication token is null or undefined.');
160
- }
161
- const res = yield got_scraping_1.gotScraping.post({
162
- url: 'https://api.twitter.com/1.1/onboarding/task.json',
163
- headers: {
164
- authorization: `Bearer ${this.bearerToken}`,
165
- 'content-type': 'application/json',
166
- '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',
167
- 'x-guest-token': token,
168
- 'x-twitter-auth-type': 'OAuth2Client',
169
- 'x-twitter-active-user': 'yes',
170
- 'x-twitter-client-language': 'en',
171
- },
172
- cookieJar: this.jar,
173
- json: data,
174
- });
175
- if (res.statusCode != 200) {
176
- return { status: 'error', err: new Error(res.body) };
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
- const flow = JSON.parse(res.body);
179
- if ((flow === null || flow === void 0 ? void 0 : flow.flow_token) == null) {
180
- return { status: 'error', err: new Error('flow_token not found.') };
190
+ else if (flow.subtasks[0].subtask_id === 'LoginAcid') {
191
+ return {
192
+ status: 'acid',
193
+ flowToken: flow.flow_token,
194
+ };
181
195
  }
182
- if ((_a = flow.errors) === null || _a === void 0 ? void 0 : _a.length) {
196
+ else if (flow.subtasks[0].subtask_id === 'LoginTwoFactorAuthChallenge') {
183
197
  return {
184
198
  status: 'error',
185
- err: new Error(`Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`),
199
+ err: new Error('Authentication error: LoginTwoFactorAuthChallenge'),
186
200
  };
187
201
  }
188
- if (typeof flow.flow_token !== 'string') {
202
+ else if (flow.subtasks[0].subtask_id === 'DenyLoginSubtask') {
189
203
  return {
190
204
  status: 'error',
191
- err: new Error('flow_token was not a string.'),
205
+ err: new Error('Authentication error: DenyLoginSubtask'),
192
206
  };
193
207
  }
194
- if ((_b = flow.subtasks) === null || _b === void 0 ? void 0 : _b.length) {
195
- if (flow.subtasks[0].subtask_id === 'LoginEnterAlternateIdentifierSubtask') {
196
- return {
197
- status: 'error',
198
- err: new Error('Authentication error: LoginEnterAlternateIdentifierSubtask'),
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;