twitter-openapi-typescript 0.0.16 → 0.0.18
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/src/api.d.ts +44 -14
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +125 -111
- package/dist/src/api.js.map +1 -1
- package/dist/src/apis/tweetApi.d.ts +1 -1
- package/dist/src/apis/tweetApi.js +1 -1
- package/package.json +1 -1
- package/src/api.ts +87 -87
- package/src/apis/tweetApi.ts +2 -2
- package/test/api/guest.test.ts +10 -0
- package/test/init.ts +10 -3
- package/tsconfig.build.json +2 -1
- package/tsconfig.json +2 -1
- package/dist/src/models/tweet.d.ts +0 -18
- package/dist/src/models/tweet.d.ts.map +0 -1
- package/dist/src/models/tweet.js +0 -3
- package/dist/src/models/tweet.js.map +0 -1
- package/dist/src/models/user.d.ts +0 -16
- package/dist/src/models/user.d.ts.map +0 -1
- package/dist/src/models/user.js +0 -3
- package/dist/src/models/user.js.map +0 -1
- package/dist/src/models/user_list.d.ts +0 -13
- package/dist/src/models/user_list.d.ts.map +0 -1
- package/dist/src/models/user_list.js +0 -3
- package/dist/src/models/user_list.js.map +0 -1
package/dist/src/api.d.ts
CHANGED
|
@@ -3,15 +3,7 @@ import { DefaultApiUtils, InitialStateApiUtils, PostApiUtils, TweetApiUtils, Use
|
|
|
3
3
|
import { DefaultFlag } from './models';
|
|
4
4
|
import { UsersApiUtils } from './apis/usersApi';
|
|
5
5
|
export type TwitterOpenApiParams = {
|
|
6
|
-
lang?: string;
|
|
7
6
|
fetchApi?: i.FetchAPI;
|
|
8
|
-
flag?: DefaultFlag;
|
|
9
|
-
accessToken?: string;
|
|
10
|
-
userAgent?: string;
|
|
11
|
-
};
|
|
12
|
-
export type TwitterOpenApiCookie = {
|
|
13
|
-
name: string;
|
|
14
|
-
value: string;
|
|
15
7
|
};
|
|
16
8
|
export declare class TwitterOpenApi {
|
|
17
9
|
static hash: string;
|
|
@@ -19,15 +11,53 @@ export declare class TwitterOpenApi {
|
|
|
19
11
|
static twitter: string;
|
|
20
12
|
static userAgent: string;
|
|
21
13
|
static bearer: string;
|
|
14
|
+
static browser_headers: {
|
|
15
|
+
accept: string;
|
|
16
|
+
'accept-encoding': string;
|
|
17
|
+
'accept-language': string;
|
|
18
|
+
'cache-control': string;
|
|
19
|
+
pragma: string;
|
|
20
|
+
'sec-ch-ua': string;
|
|
21
|
+
'sec-ch-ua-mobile': string;
|
|
22
|
+
'sec-ch-ua-platform': string;
|
|
23
|
+
'sec-fetch-dest': string;
|
|
24
|
+
'sec-fetch-mode': string;
|
|
25
|
+
'sec-fetch-site': string;
|
|
26
|
+
'user-agent': string;
|
|
27
|
+
};
|
|
28
|
+
static api_key: {
|
|
29
|
+
accept: string;
|
|
30
|
+
'accept-encoding': string;
|
|
31
|
+
'accept-language': string;
|
|
32
|
+
'cache-control': string;
|
|
33
|
+
pragma: string;
|
|
34
|
+
'sec-ch-ua': string;
|
|
35
|
+
'sec-ch-ua-mobile': string;
|
|
36
|
+
'sec-ch-ua-platform': string;
|
|
37
|
+
'sec-fetch-dest': string;
|
|
38
|
+
'sec-fetch-mode': string;
|
|
39
|
+
'sec-fetch-site': string;
|
|
40
|
+
'user-agent': string;
|
|
41
|
+
'x-twitter-client-language': string;
|
|
42
|
+
'x-twitter-active-user': string;
|
|
43
|
+
};
|
|
22
44
|
param: TwitterOpenApiParams;
|
|
23
45
|
constructor(param?: TwitterOpenApiParams);
|
|
24
46
|
get fetchApi(): i.FetchAPI;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
47
|
+
cookie_normalize(cookie: string[]): {
|
|
48
|
+
[key: string]: string;
|
|
49
|
+
};
|
|
50
|
+
cookieEncode(cookie: {
|
|
51
|
+
[key: string]: string;
|
|
52
|
+
}): string;
|
|
53
|
+
setCookies(context: i.RequestContext, cookies: {
|
|
54
|
+
[key: string]: string;
|
|
55
|
+
}): i.RequestContext;
|
|
56
|
+
getGuestClient(): Promise<TwitterOpenApiClient>;
|
|
57
|
+
getClientFromCookies(cookies: {
|
|
58
|
+
[key: string]: string;
|
|
59
|
+
}): Promise<TwitterOpenApiClient>;
|
|
60
|
+
getClient(api: i.Configuration): Promise<TwitterOpenApiClient>;
|
|
31
61
|
}
|
|
32
62
|
export declare class TwitterOpenApiClient {
|
|
33
63
|
private config;
|
package/dist/src/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,cAAc,EACf,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,cAAc,EACf,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;CACvB,CAAC;AAEF,qBAAa,cAAc;IACzB,MAAM,CAAC,IAAI,SAA8C;IACzD,MAAM,CAAC,GAAG,SAAuG;IACjH,MAAM,CAAC,OAAO,SAA8B;IAE5C,MAAM,CAAC,SAAS,SACoG;IACpH,MAAM,CAAC,MAAM,SACgG;IAE7G,MAAM,CAAC,eAAe;;;;;;;;;;;;;MAapB;IAEF,MAAM,CAAC,OAAO;;;;;;;;;;;;;;;MAIZ;IAEF,KAAK,EAAE,oBAAoB,CAAC;gBAEhB,KAAK,GAAE,oBAAyB;IAI5C,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAEzB;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;IAO7D,YAAY,CAAC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM;IAMvD,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,CAAC,CAAC,cAAc;IAQrF,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA2C/C,oBAAoB,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBvF,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAIrE;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IACzB,IAAI,EAAE,WAAW,CAAC;gBAEb,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW;IAKtD,aAAa,IAAI,eAAe;IAIhC,WAAW,IAAI,aAAa;IAI5B,UAAU,IAAI,YAAY;IAI1B,WAAW,IAAI,aAAa;IAI5B,cAAc,IAAI,gBAAgB;IAIlC,UAAU,IAAI,YAAY;IAI1B,YAAY,IAAI,cAAc;IAI9B,aAAa,IAAI,eAAe;IAIhC,YAAY,IAAI,cAAc;IAI9B,kBAAkB,IAAI,oBAAoB;CAG3C"}
|
package/dist/src/api.js
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
2
13
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
14
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
15
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,6 +46,22 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
46
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
47
|
}
|
|
37
48
|
};
|
|
49
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
+
if (!m) return o;
|
|
52
|
+
var i = m.call(o), r, ar = [], e;
|
|
53
|
+
try {
|
|
54
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
+
}
|
|
56
|
+
catch (error) { e = { error: error }; }
|
|
57
|
+
finally {
|
|
58
|
+
try {
|
|
59
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
+
}
|
|
61
|
+
finally { if (e) throw e.error; }
|
|
62
|
+
}
|
|
63
|
+
return ar;
|
|
64
|
+
};
|
|
38
65
|
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
39
66
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
40
67
|
if (ar || !(i in from)) {
|
|
@@ -61,143 +88,115 @@ var TwitterOpenApi = /** @class */ (function () {
|
|
|
61
88
|
enumerable: false,
|
|
62
89
|
configurable: true
|
|
63
90
|
});
|
|
64
|
-
TwitterOpenApi.prototype.
|
|
65
|
-
return cookie
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
.map(function (_b) {
|
|
71
|
-
var name = _b[0], value = _b[1];
|
|
72
|
-
return ({
|
|
73
|
-
name: name,
|
|
74
|
-
value: value,
|
|
75
|
-
});
|
|
76
|
-
});
|
|
91
|
+
TwitterOpenApi.prototype.cookie_normalize = function (cookie) {
|
|
92
|
+
return cookie.reduce(function (a, b) {
|
|
93
|
+
var _b;
|
|
94
|
+
var _c = __read(b.split('='), 2), key = _c[0], value = _c[1];
|
|
95
|
+
return __assign(__assign({}, a), (_b = {}, _b[key] = value, _b));
|
|
96
|
+
}, {});
|
|
77
97
|
};
|
|
78
98
|
TwitterOpenApi.prototype.cookieEncode = function (cookie) {
|
|
79
|
-
return
|
|
99
|
+
return Object.entries(cookie)
|
|
100
|
+
.map(function (_b) {
|
|
101
|
+
var _c = __read(_b, 2), key = _c[0], value = _c[1];
|
|
102
|
+
return "".concat(key, "=").concat(value);
|
|
103
|
+
})
|
|
104
|
+
.join('; ');
|
|
80
105
|
};
|
|
81
|
-
TwitterOpenApi.prototype.
|
|
106
|
+
TwitterOpenApi.prototype.setCookies = function (context, cookies) {
|
|
107
|
+
if (context.init.headers) {
|
|
108
|
+
var headers = context.init.headers;
|
|
109
|
+
headers['cookie'] = this.cookieEncode(cookies);
|
|
110
|
+
}
|
|
111
|
+
return context;
|
|
112
|
+
};
|
|
113
|
+
TwitterOpenApi.prototype.getGuestClient = function () {
|
|
82
114
|
return __awaiter(this, void 0, void 0, function () {
|
|
83
|
-
var
|
|
84
|
-
var _this = this;
|
|
115
|
+
var cookies, response, html, re, find, activate_headers, guest_token;
|
|
85
116
|
return __generator(this, function (_b) {
|
|
86
117
|
switch (_b.label) {
|
|
87
|
-
case 0:
|
|
118
|
+
case 0:
|
|
119
|
+
cookies = {};
|
|
120
|
+
return [4 /*yield*/, this.fetchApi(_a.twitter, {
|
|
121
|
+
method: 'GET',
|
|
122
|
+
redirect: 'manual',
|
|
123
|
+
headers: { Cookie: this.cookieEncode(cookies) },
|
|
124
|
+
})];
|
|
88
125
|
case 1:
|
|
89
126
|
response = _b.sent();
|
|
90
|
-
|
|
91
|
-
csrfToken = __spreadArray([], Array(32), true).reduce(function (a) { return a + chars[Math.floor(Math.random() * chars.length)]; }, '');
|
|
92
|
-
cookies = this.cookieDecode(response.headers.get('set-cookie'));
|
|
93
|
-
cookies.push({ name: 'ct0', value: csrfToken });
|
|
127
|
+
cookies = __assign(__assign({}, cookies), this.cookie_normalize(response.headers.get('set-cookie').split(', ')));
|
|
94
128
|
return [4 /*yield*/, this.fetchApi(_a.twitter, {
|
|
95
129
|
method: 'GET',
|
|
96
130
|
headers: { Cookie: this.cookieEncode(cookies) },
|
|
97
131
|
}).then(function (response) { return response.text(); })];
|
|
98
132
|
case 2:
|
|
99
133
|
html = _b.sent();
|
|
100
|
-
re = new RegExp('
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
.
|
|
109
|
-
|
|
134
|
+
re = new RegExp('document.cookie="(.*?)";', 'g');
|
|
135
|
+
find = __spreadArray([], __read(html.matchAll(re)), false).map(function (e) { return e[1]; });
|
|
136
|
+
cookies = __assign(__assign({}, cookies), this.cookie_normalize(find));
|
|
137
|
+
cookies = Object.entries(cookies)
|
|
138
|
+
.filter(function (_b) {
|
|
139
|
+
var _c = __read(_b, 2), key = _c[0], value = _c[1];
|
|
140
|
+
return key != 'ct0';
|
|
141
|
+
})
|
|
142
|
+
.reduce(function (a, _b) {
|
|
143
|
+
var _c;
|
|
144
|
+
var _d = __read(_b, 2), key = _d[0], value = _d[1];
|
|
145
|
+
return (__assign(__assign({}, a), (_c = {}, _c[key] = value, _c)));
|
|
146
|
+
}, {});
|
|
147
|
+
if (!!cookies['gt']) return [3 /*break*/, 4];
|
|
148
|
+
activate_headers = __assign(__assign({}, _a.api_key), { authorization: "Bearer ".concat(_a.bearer) });
|
|
149
|
+
return [4 /*yield*/, this.fetchApi('https://api.twitter.com/1.1/guest/activate.json', {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: activate_headers,
|
|
152
|
+
}).then(function (response) { return response.json(); })];
|
|
153
|
+
case 3:
|
|
154
|
+
guest_token = (_b.sent()).guest_token;
|
|
155
|
+
cookies['gt'] = guest_token;
|
|
156
|
+
_b.label = 4;
|
|
157
|
+
case 4:
|
|
158
|
+
// const chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
|
159
|
+
// const csrfToken = [...Array(32)].reduce((a) => a + chars[Math.floor(Math.random() * chars.length)], '');
|
|
160
|
+
// cookies.push({ name: 'ct0', value: csrfToken });
|
|
161
|
+
return [2 /*return*/, this.getClientFromCookies(cookies)];
|
|
110
162
|
}
|
|
111
163
|
});
|
|
112
164
|
});
|
|
113
165
|
};
|
|
114
|
-
TwitterOpenApi.prototype.
|
|
115
|
-
if (context.init.headers) {
|
|
116
|
-
var headers = context.init.headers;
|
|
117
|
-
headers['cookie'] = this.cookieEncode(cookies);
|
|
118
|
-
}
|
|
119
|
-
return context;
|
|
120
|
-
};
|
|
121
|
-
TwitterOpenApi.prototype.getClient = function () {
|
|
166
|
+
TwitterOpenApi.prototype.getClientFromCookies = function (cookies) {
|
|
122
167
|
return __awaiter(this, void 0, void 0, function () {
|
|
123
|
-
var
|
|
168
|
+
var api_key, config;
|
|
124
169
|
var _this = this;
|
|
125
|
-
return __generator(this, function (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
config = {
|
|
131
|
-
fetchApi: this.fetchApi,
|
|
132
|
-
middleware: [{ pre: function (context) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_b) {
|
|
133
|
-
return [2 /*return*/, this.setCookies(context, cookies)];
|
|
134
|
-
}); }); } }],
|
|
135
|
-
apiKey: function (key) {
|
|
136
|
-
var _b, _c, _d;
|
|
137
|
-
return {
|
|
138
|
-
'user-agent': _this.param.userAgent || _a.userAgent,
|
|
139
|
-
'x-twitter-client-language': (_b = _this.param.lang) !== null && _b !== void 0 ? _b : 'en',
|
|
140
|
-
'x-twitter-active-user': 'yes',
|
|
141
|
-
'x-csrf-token': (_c = cookies.find(function (cookie) { return cookie.name === 'ct0'; })) === null || _c === void 0 ? void 0 : _c.value,
|
|
142
|
-
'x-guest-token': (_d = cookies.find(function (cookie) { return cookie.name === 'gt'; })) === null || _d === void 0 ? void 0 : _d.value,
|
|
143
|
-
}[key];
|
|
144
|
-
},
|
|
145
|
-
accessToken: this.param.accessToken || _a.bearer,
|
|
146
|
-
};
|
|
147
|
-
_b = this.param.flag;
|
|
148
|
-
if (_b) return [3 /*break*/, 3];
|
|
149
|
-
return [4 /*yield*/, this.fetchApi(_a.url, { method: 'GET' }).then(function (res) { return res.json(); })];
|
|
150
|
-
case 2:
|
|
151
|
-
_b = (_c.sent());
|
|
152
|
-
_c.label = 3;
|
|
153
|
-
case 3:
|
|
154
|
-
flag = _b;
|
|
155
|
-
return [2 /*return*/, new TwitterOpenApiClient(new i.Configuration(config), flag)];
|
|
170
|
+
return __generator(this, function (_b) {
|
|
171
|
+
api_key = __assign({}, _a.api_key);
|
|
172
|
+
if (cookies['ct0']) {
|
|
173
|
+
api_key['x-twitter-auth-type'] = 'OAuth2Session';
|
|
174
|
+
api_key['x-csrf-token'] = cookies['ct0'];
|
|
156
175
|
}
|
|
176
|
+
if (cookies['gt']) {
|
|
177
|
+
api_key['x-guest-token'] = cookies['gt'];
|
|
178
|
+
}
|
|
179
|
+
config = {
|
|
180
|
+
fetchApi: this.fetchApi,
|
|
181
|
+
middleware: [{ pre: function (context) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_b) {
|
|
182
|
+
return [2 /*return*/, this.setCookies(context, cookies)];
|
|
183
|
+
}); }); } }],
|
|
184
|
+
apiKey: function (key) { return api_key[key.toLowerCase()]; },
|
|
185
|
+
accessToken: _a.bearer,
|
|
186
|
+
};
|
|
187
|
+
return [2 /*return*/, this.getClient(new i.Configuration(config))];
|
|
157
188
|
});
|
|
158
189
|
});
|
|
159
190
|
};
|
|
160
|
-
TwitterOpenApi.prototype.
|
|
191
|
+
TwitterOpenApi.prototype.getClient = function (api) {
|
|
161
192
|
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
-
var
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
case 0: return [4 /*yield*/, this.getGuestSession()];
|
|
193
|
+
var flag;
|
|
194
|
+
return __generator(this, function (_b) {
|
|
195
|
+
switch (_b.label) {
|
|
196
|
+
case 0: return [4 /*yield*/, this.fetchApi(_a.url, { method: 'GET' }).then(function (res) { return res.json(); })];
|
|
167
197
|
case 1:
|
|
168
|
-
|
|
169
|
-
[
|
|
170
|
-
{ name: 'auth_token', value: authToken },
|
|
171
|
-
{ name: 'ct0', value: ct0 },
|
|
172
|
-
]
|
|
173
|
-
.filter(function (e) { return cookies.findIndex(function (c) { return c.name == e.name; }) == -1; })
|
|
174
|
-
.forEach(function (e) { return cookies.push(e); });
|
|
175
|
-
config = {
|
|
176
|
-
fetchApi: this.param.fetchApi || fetch,
|
|
177
|
-
middleware: [{ pre: function (context) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_b) {
|
|
178
|
-
return [2 /*return*/, this.setCookies(context, cookies)];
|
|
179
|
-
}); }); } }],
|
|
180
|
-
apiKey: function (key) {
|
|
181
|
-
var _b, _c;
|
|
182
|
-
return {
|
|
183
|
-
'user-agent': _this.param.userAgent || _a.userAgent,
|
|
184
|
-
'x-twitter-client-language': (_b = _this.param.lang) !== null && _b !== void 0 ? _b : 'en',
|
|
185
|
-
'x-twitter-active-user': 'yes',
|
|
186
|
-
'x-twitter-auth-type': 'OAuth2Session',
|
|
187
|
-
'x-csrf-token': (_c = cookies.find(function (cookie) { return cookie.name === 'ct0'; })) === null || _c === void 0 ? void 0 : _c.value,
|
|
188
|
-
}[key];
|
|
189
|
-
},
|
|
190
|
-
accessToken: this.param.accessToken || _a.bearer,
|
|
191
|
-
};
|
|
192
|
-
_b = this.param.flag;
|
|
193
|
-
if (_b) return [3 /*break*/, 3];
|
|
194
|
-
return [4 /*yield*/, this.fetchApi(_a.url, { method: 'GET' }).then(function (res) { return res.json(); })];
|
|
195
|
-
case 2:
|
|
196
|
-
_b = (_c.sent());
|
|
197
|
-
_c.label = 3;
|
|
198
|
-
case 3:
|
|
199
|
-
flag = _b;
|
|
200
|
-
return [2 /*return*/, new TwitterOpenApiClient(new i.Configuration(config), flag)];
|
|
198
|
+
flag = (_b.sent());
|
|
199
|
+
return [2 /*return*/, new TwitterOpenApiClient(api, flag)];
|
|
201
200
|
}
|
|
202
201
|
});
|
|
203
202
|
});
|
|
@@ -209,6 +208,21 @@ var TwitterOpenApi = /** @class */ (function () {
|
|
|
209
208
|
TwitterOpenApi.twitter = 'https://twitter.com/home';
|
|
210
209
|
TwitterOpenApi.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36';
|
|
211
210
|
TwitterOpenApi.bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
|
|
211
|
+
TwitterOpenApi.browser_headers = {
|
|
212
|
+
accept: 'text/plain, */*; q=0.01',
|
|
213
|
+
'accept-encoding': 'gzip, deflate, br',
|
|
214
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
215
|
+
'cache-control': 'no-cache',
|
|
216
|
+
pragma: 'no-cache',
|
|
217
|
+
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
|
|
218
|
+
'sec-ch-ua-mobile': '?0',
|
|
219
|
+
'sec-ch-ua-platform': '"Windows"',
|
|
220
|
+
'sec-fetch-dest': 'empty',
|
|
221
|
+
'sec-fetch-mode': 'cors',
|
|
222
|
+
'sec-fetch-site': 'same-site',
|
|
223
|
+
'user-agent': _a.userAgent,
|
|
224
|
+
};
|
|
225
|
+
TwitterOpenApi.api_key = __assign({ 'x-twitter-client-language': 'en', 'x-twitter-active-user': 'yes' }, _a.browser_headers);
|
|
212
226
|
return TwitterOpenApi;
|
|
213
227
|
}());
|
|
214
228
|
exports.TwitterOpenApi = TwitterOpenApi;
|
package/dist/src/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAA0D;AAC1D,+BAUgB;AAEhB,4CAAgD;AAMhD;IAiCE,wBAAY,KAAgC;QAAhC,sBAAA,EAAA,UAAgC;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,sBAAI,oCAAQ;aAAZ;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;QACtC,CAAC;;;OAAA;IAED,yCAAgB,GAAhB,UAAiB,MAAgB;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC;;YAClB,IAAA,KAAA,OAAe,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAA,EAA1B,GAAG,QAAA,EAAE,KAAK,QAAgB,CAAC;YAClC,6BAAY,CAAC,gBAAG,GAAG,IAAG,KAAK,OAAG;QAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,qCAAY,GAAZ,UAAa,MAAiC;QAC5C,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aAC1B,GAAG,CAAC,UAAC,EAAY;gBAAZ,KAAA,aAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAAM,OAAA,UAAG,GAAG,cAAI,KAAK,CAAE;QAAjB,CAAiB,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,mCAAU,GAAV,UAAW,OAAyB,EAAE,OAAkC;QACtE,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;YACxB,IAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAwB,CAAC;YACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAChD;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEK,uCAAc,GAApB;;;;;;wBACM,OAAO,GAA8B,EAAE,CAAC;wBAE3B,qBAAM,IAAI,CAAC,QAAQ,CAAC,EAAc,CAAC,OAAO,EAAE;gCAC3D,MAAM,EAAE,KAAK;gCACb,QAAQ,EAAE,QAAQ;gCAClB,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;6BAChD,CAAC,EAAA;;wBAJI,QAAQ,GAAG,SAIf;wBACF,OAAO,yBAAQ,OAAO,GAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;wBAEvF,qBAAM,IAAI,CAAC,QAAQ,CAAC,EAAc,CAAC,OAAO,EAAE;gCACvD,MAAM,EAAE,KAAK;gCACb,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;6BAChD,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,IAAI,EAAE,EAAf,CAAe,CAAC,EAAA;;wBAHhC,IAAI,GAAG,SAGyB;wBAEhC,EAAE,GAAG,IAAI,MAAM,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;wBAEjD,IAAI,GAAG,yBAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAE,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,EAAJ,CAAI,CAAC,CAAC;wBACrD,OAAO,yBAAQ,OAAO,GAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAE,CAAC;wBAEzD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;6BAC9B,MAAM,CAAC,UAAC,EAAY;gCAAZ,KAAA,aAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;4BAAM,OAAA,GAAG,IAAI,KAAK;wBAAZ,CAAY,CAAC;6BACtC,MAAM,CAAC,UAAC,CAAC,EAAE,EAAY;;gCAAZ,KAAA,aAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;4BAAM,OAAA,uBAAM,CAAC,gBAAG,GAAG,IAAG,KAAK,OAAG;wBAAxB,CAAwB,EAAE,EAAE,CAAC,CAAC;6BAEzD,CAAC,OAAO,CAAC,IAAI,CAAC,EAAd,wBAAc;wBACV,gBAAgB,yBACjB,EAAc,CAAC,OAAO,KACzB,aAAa,EAAE,iBAAU,EAAc,CAAC,MAAM,CAAE,GACjD,CAAC;wBACsB,qBAAM,IAAI,CAAC,QAAQ,CAAC,iDAAiD,EAAE;gCAC7F,MAAM,EAAE,MAAM;gCACd,OAAO,EAAE,gBAAgB;6BAC1B,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,IAAI,EAAE,EAAf,CAAe,CAAC,EAAA;;wBAH9B,WAAW,GAAK,CAAA,SAGc,CAAA,YAHnB;wBAInB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;;;oBAG9B,kGAAkG;oBAClG,2GAA2G;oBAC3G,mDAAmD;oBAEnD,sBAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAC;;;;KAC3C;IAEK,6CAAoB,GAA1B,UAA2B,OAAkC;;;;;gBACvD,OAAO,gBAAmC,EAAc,CAAC,OAAO,CAAE,CAAC;gBACvE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;oBAClB,OAAO,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC;oBACjD,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;iBAC1C;gBACD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;oBACjB,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;iBAC1C;gBAEK,MAAM,GAA8B;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,UAAO,OAAO;gCAAK,sBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAA;qCAAA,EAAE,CAAC;oBAC3E,MAAM,EAAE,UAAC,GAAG,IAAK,OAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAA1B,CAA0B;oBAC3C,WAAW,EAAE,EAAc,CAAC,MAAM;iBACnC,CAAC;gBACF,sBAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAC;;;KACpD;IAEK,kCAAS,GAAf,UAAgB,GAAoB;;;;;4BACpB,qBAAM,IAAI,CAAC,QAAQ,CAAC,EAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,EAAE,EAAV,CAAU,CAAC,EAAA;;wBAA5F,IAAI,GAAG,CAAC,SAAoF,CAAgB;wBAClH,sBAAO,IAAI,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAC;;;;KAC5C;;;IA9HM,mBAAI,GAAG,0CAA0C,AAA7C,CAA8C;IAClD,kBAAG,GAAG,mEAA4D,EAAI,CAAC,IAAI,iCAA8B,AAAtG,CAAuG;IAC1G,sBAAO,GAAG,0BAA0B,AAA7B,CAA8B;IAErC,wBAAS,GACd,iHAAiH,AADnG,CACoG;IAC7G,qBAAM,GACX,0GAA0G,AAD/F,CACgG;IAEtG,8BAAe,GAAG;QACvB,MAAM,EAAE,yBAAyB;QACjC,iBAAiB,EAAE,mBAAmB;QACtC,iBAAiB,EAAE,gBAAgB;QACnC,eAAe,EAAE,UAAU;QAC3B,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,mEAAmE;QAChF,kBAAkB,EAAE,IAAI;QACxB,oBAAoB,EAAE,WAAW;QACjC,gBAAgB,EAAE,OAAO;QACzB,gBAAgB,EAAE,MAAM;QACxB,gBAAgB,EAAE,WAAW;QAC7B,YAAY,EAAE,EAAc,CAAC,SAAS;KACvC,AAbqB,CAapB;IAEK,sBAAO,cACZ,2BAA2B,EAAE,IAAI,EACjC,uBAAuB,EAAE,KAAK,IAC3B,EAAc,CAAC,eAAe,CAHrB,CAIZ;IAmGJ,qBAAC;CAAA,AAhID,IAgIC;AAhIY,wCAAc;AAkI3B;IAIE,8BAAY,MAAuB,EAAE,IAAiB;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,4CAAa,GAAb;QACE,OAAO,IAAI,sBAAe,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,0CAAW,GAAX;QACE,OAAO,IAAI,oBAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,yCAAU,GAAV;QACE,OAAO,IAAI,mBAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,0CAAW,GAAX;QACE,OAAO,IAAI,wBAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,6CAAc,GAAd;QACE,OAAO,IAAI,uBAAgB,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,yCAAU,GAAV;QACE,OAAO,IAAI,mBAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,2CAAY,GAAZ;QACE,OAAO,IAAI,qBAAc,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,4CAAa,GAAb;QACE,OAAO,IAAI,sBAAe,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,2CAAY,GAAZ;QACE,OAAO,IAAI,qBAAc,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,iDAAkB,GAAlB;QACE,OAAO,IAAI,2BAAoB,EAAE,CAAC;IACpC,CAAC;IACH,2BAAC;AAAD,CAAC,AAhDD,IAgDC;AAhDY,oDAAoB"}
|
|
@@ -137,7 +137,7 @@ var TweetApiUtils = /** @class */ (function () {
|
|
|
137
137
|
return __generator(this, function (_a) {
|
|
138
138
|
switch (_a.label) {
|
|
139
139
|
case 0:
|
|
140
|
-
args = __assign(__assign(__assign({}, (param.count == undefined ? {} : { count: param.count })), (param.
|
|
140
|
+
args = __assign(__assign(__assign({}, (param.count == undefined ? {} : { count: param.count })), (param.cursor == undefined ? {} : { cursor: param.cursor })), param.extraParam);
|
|
141
141
|
return [4 /*yield*/, this.request({
|
|
142
142
|
apiFn: this.api.getHomeTimelineRaw,
|
|
143
143
|
convertFn: function (e) { return e.data.home.homeTimelineUrt.instructions; },
|
package/package.json
CHANGED
package/src/api.ts
CHANGED
|
@@ -14,17 +14,7 @@ import { DefaultFlag } from '@/models';
|
|
|
14
14
|
import { UsersApiUtils } from './apis/usersApi';
|
|
15
15
|
|
|
16
16
|
export type TwitterOpenApiParams = {
|
|
17
|
-
lang?: string;
|
|
18
17
|
fetchApi?: i.FetchAPI;
|
|
19
|
-
|
|
20
|
-
flag?: DefaultFlag;
|
|
21
|
-
accessToken?: string;
|
|
22
|
-
userAgent?: string;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type TwitterOpenApiCookie = {
|
|
26
|
-
name: string;
|
|
27
|
-
value: string;
|
|
28
18
|
};
|
|
29
19
|
|
|
30
20
|
export class TwitterOpenApi {
|
|
@@ -36,6 +26,28 @@ export class TwitterOpenApi {
|
|
|
36
26
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36';
|
|
37
27
|
static bearer =
|
|
38
28
|
'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
|
|
29
|
+
|
|
30
|
+
static browser_headers = {
|
|
31
|
+
accept: 'text/plain, */*; q=0.01',
|
|
32
|
+
'accept-encoding': 'gzip, deflate, br',
|
|
33
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
34
|
+
'cache-control': 'no-cache',
|
|
35
|
+
pragma: 'no-cache',
|
|
36
|
+
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
|
|
37
|
+
'sec-ch-ua-mobile': '?0',
|
|
38
|
+
'sec-ch-ua-platform': '"Windows"',
|
|
39
|
+
'sec-fetch-dest': 'empty',
|
|
40
|
+
'sec-fetch-mode': 'cors',
|
|
41
|
+
'sec-fetch-site': 'same-site',
|
|
42
|
+
'user-agent': TwitterOpenApi.userAgent,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
static api_key = {
|
|
46
|
+
'x-twitter-client-language': 'en',
|
|
47
|
+
'x-twitter-active-user': 'yes',
|
|
48
|
+
...TwitterOpenApi.browser_headers,
|
|
49
|
+
};
|
|
50
|
+
|
|
39
51
|
param: TwitterOpenApiParams;
|
|
40
52
|
|
|
41
53
|
constructor(param: TwitterOpenApiParams = {}) {
|
|
@@ -46,104 +58,92 @@ export class TwitterOpenApi {
|
|
|
46
58
|
return this.param.fetchApi || fetch;
|
|
47
59
|
}
|
|
48
60
|
|
|
49
|
-
|
|
50
|
-
return cookie
|
|
51
|
-
.split('
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
})
|
|
61
|
+
cookie_normalize(cookie: string[]): { [key: string]: string } {
|
|
62
|
+
return cookie.reduce((a, b) => {
|
|
63
|
+
const [key, value] = b.split('=');
|
|
64
|
+
return { ...a, [key]: value };
|
|
65
|
+
}, {});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
cookieEncode(cookie: { [key: string]: string }): string {
|
|
69
|
+
return Object.entries(cookie)
|
|
70
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
71
|
+
.join('; ');
|
|
59
72
|
}
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
|
|
74
|
+
setCookies(context: i.RequestContext, cookies: { [key: string]: string }): i.RequestContext {
|
|
75
|
+
if (context.init.headers) {
|
|
76
|
+
const headers = context.init.headers as i.HTTPHeaders;
|
|
77
|
+
headers['cookie'] = this.cookieEncode(cookies);
|
|
78
|
+
}
|
|
79
|
+
return context;
|
|
62
80
|
}
|
|
63
81
|
|
|
64
|
-
async
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
async getGuestClient(): Promise<TwitterOpenApiClient> {
|
|
83
|
+
let cookies: { [key: string]: string } = {};
|
|
84
|
+
|
|
85
|
+
const response = await this.fetchApi(TwitterOpenApi.twitter, {
|
|
86
|
+
method: 'GET',
|
|
87
|
+
redirect: 'manual',
|
|
88
|
+
headers: { Cookie: this.cookieEncode(cookies) },
|
|
89
|
+
});
|
|
90
|
+
cookies = { ...cookies, ...this.cookie_normalize(response.headers.get('set-cookie')!.split(', ')) };
|
|
70
91
|
|
|
71
92
|
const html = await this.fetchApi(TwitterOpenApi.twitter, {
|
|
72
93
|
method: 'GET',
|
|
73
94
|
headers: { Cookie: this.cookieEncode(cookies) },
|
|
74
95
|
}).then((response) => response.text());
|
|
75
96
|
|
|
76
|
-
const re = new RegExp('
|
|
97
|
+
const re = new RegExp('document.cookie="(.*?)";', 'g');
|
|
98
|
+
|
|
99
|
+
const find = [...html.matchAll(re)].map((e) => e[1]);
|
|
100
|
+
cookies = { ...cookies, ...this.cookie_normalize(find) };
|
|
101
|
+
|
|
102
|
+
cookies = Object.entries(cookies)
|
|
103
|
+
.filter(([key, value]) => key != 'ct0')
|
|
104
|
+
.reduce((a, [key, value]) => ({ ...a, [key]: value }), {});
|
|
105
|
+
|
|
106
|
+
if (!cookies['gt']) {
|
|
107
|
+
const activate_headers = {
|
|
108
|
+
...TwitterOpenApi.api_key,
|
|
109
|
+
authorization: `Bearer ${TwitterOpenApi.bearer}`,
|
|
110
|
+
};
|
|
111
|
+
const { guest_token } = await this.fetchApi('https://api.twitter.com/1.1/guest/activate.json', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: activate_headers,
|
|
114
|
+
}).then((response) => response.json());
|
|
115
|
+
cookies['gt'] = guest_token;
|
|
116
|
+
}
|
|
77
117
|
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.slice(1)
|
|
82
|
-
.map((e) => e.replace('</script>', '').replace('";', ''))
|
|
83
|
-
.map((e) => this.cookieDecode(e)[0])
|
|
84
|
-
.filter((e) => cookies.findIndex((c) => c.name == e.name) == -1)
|
|
85
|
-
.forEach((e) => cookies.push(e));
|
|
118
|
+
// const chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
|
119
|
+
// const csrfToken = [...Array(32)].reduce((a) => a + chars[Math.floor(Math.random() * chars.length)], '');
|
|
120
|
+
// cookies.push({ name: 'ct0', value: csrfToken });
|
|
86
121
|
|
|
87
|
-
return cookies;
|
|
122
|
+
return this.getClientFromCookies(cookies);
|
|
88
123
|
}
|
|
89
124
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
125
|
+
async getClientFromCookies(cookies: { [key: string]: string }): Promise<TwitterOpenApiClient> {
|
|
126
|
+
let api_key: { [key: string]: string } = { ...TwitterOpenApi.api_key };
|
|
127
|
+
if (cookies['ct0']) {
|
|
128
|
+
api_key['x-twitter-auth-type'] = 'OAuth2Session';
|
|
129
|
+
api_key['x-csrf-token'] = cookies['ct0'];
|
|
130
|
+
}
|
|
131
|
+
if (cookies['gt']) {
|
|
132
|
+
api_key['x-guest-token'] = cookies['gt'];
|
|
94
133
|
}
|
|
95
|
-
return context;
|
|
96
|
-
}
|
|
97
134
|
|
|
98
|
-
async getClient(): Promise<TwitterOpenApiClient> {
|
|
99
|
-
const cookies: TwitterOpenApiCookie[] = await this.getGuestSession();
|
|
100
135
|
const config: i.ConfigurationParameters = {
|
|
101
136
|
fetchApi: this.fetchApi,
|
|
102
137
|
middleware: [{ pre: async (context) => this.setCookies(context, cookies) }],
|
|
103
|
-
apiKey: (key) =>
|
|
104
|
-
|
|
105
|
-
'user-agent': this.param.userAgent || TwitterOpenApi.userAgent,
|
|
106
|
-
'x-twitter-client-language': this.param.lang ?? 'en',
|
|
107
|
-
'x-twitter-active-user': 'yes',
|
|
108
|
-
'x-csrf-token': cookies.find((cookie) => cookie.name === 'ct0')?.value,
|
|
109
|
-
'x-guest-token': cookies.find((cookie) => cookie.name === 'gt')?.value,
|
|
110
|
-
}[key]!;
|
|
111
|
-
},
|
|
112
|
-
accessToken: this.param.accessToken || TwitterOpenApi.bearer,
|
|
138
|
+
apiKey: (key) => api_key[key.toLowerCase()],
|
|
139
|
+
accessToken: TwitterOpenApi.bearer,
|
|
113
140
|
};
|
|
114
|
-
|
|
115
|
-
this.param.flag ||
|
|
116
|
-
((await this.fetchApi(TwitterOpenApi.url, { method: 'GET' }).then((res) => res.json())) as DefaultFlag);
|
|
117
|
-
return new TwitterOpenApiClient(new i.Configuration(config), flag);
|
|
141
|
+
return this.getClient(new i.Configuration(config));
|
|
118
142
|
}
|
|
119
143
|
|
|
120
|
-
async
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
{ name: 'auth_token', value: authToken },
|
|
124
|
-
{ name: 'ct0', value: ct0 },
|
|
125
|
-
]
|
|
126
|
-
.filter((e) => cookies.findIndex((c) => c.name == e.name) == -1)
|
|
127
|
-
.forEach((e) => cookies.push(e));
|
|
128
|
-
|
|
129
|
-
const config: i.ConfigurationParameters = {
|
|
130
|
-
fetchApi: this.param.fetchApi || fetch,
|
|
131
|
-
middleware: [{ pre: async (context) => this.setCookies(context, cookies) }],
|
|
132
|
-
apiKey: (key) => {
|
|
133
|
-
return {
|
|
134
|
-
'user-agent': this.param.userAgent || TwitterOpenApi.userAgent,
|
|
135
|
-
'x-twitter-client-language': this.param.lang ?? 'en',
|
|
136
|
-
'x-twitter-active-user': 'yes',
|
|
137
|
-
'x-twitter-auth-type': 'OAuth2Session',
|
|
138
|
-
'x-csrf-token': cookies.find((cookie) => cookie.name === 'ct0')?.value,
|
|
139
|
-
}[key]!;
|
|
140
|
-
},
|
|
141
|
-
accessToken: this.param.accessToken || TwitterOpenApi.bearer,
|
|
142
|
-
};
|
|
143
|
-
const flag =
|
|
144
|
-
this.param.flag ||
|
|
145
|
-
((await this.fetchApi(TwitterOpenApi.url, { method: 'GET' }).then((res) => res.json())) as DefaultFlag);
|
|
146
|
-
return new TwitterOpenApiClient(new i.Configuration(config), flag);
|
|
144
|
+
async getClient(api: i.Configuration): Promise<TwitterOpenApiClient> {
|
|
145
|
+
const flag = (await this.fetchApi(TwitterOpenApi.url, { method: 'GET' }).then((res) => res.json())) as DefaultFlag;
|
|
146
|
+
return new TwitterOpenApiClient(api, flag);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
package/src/apis/tweetApi.ts
CHANGED
|
@@ -23,7 +23,7 @@ type GetSearchTimelineParam = {
|
|
|
23
23
|
extraParam?: { [key: string]: any };
|
|
24
24
|
};
|
|
25
25
|
type GetHomeTimelineParam = {
|
|
26
|
-
|
|
26
|
+
cursor?: string;
|
|
27
27
|
count?: number;
|
|
28
28
|
extraParam?: { [key: string]: any };
|
|
29
29
|
};
|
|
@@ -147,7 +147,7 @@ export class TweetApiUtils {
|
|
|
147
147
|
async getHomeTimeline(param: GetHomeTimelineParam = {}): Promise<ResponseType> {
|
|
148
148
|
const args = {
|
|
149
149
|
...(param.count == undefined ? {} : { count: param.count }),
|
|
150
|
-
...(param.
|
|
150
|
+
...(param.cursor == undefined ? {} : { cursor: param.cursor }),
|
|
151
151
|
...param.extraParam,
|
|
152
152
|
};
|
|
153
153
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getGuestClient, logger } from '@test/init';
|
|
2
|
+
import { printTweet } from '@test/util';
|
|
3
|
+
|
|
4
|
+
test('getGuestTweetResultByRestId', async () => {
|
|
5
|
+
logger.log('getGuestTweetResultByRestId');
|
|
6
|
+
const client = await getGuestClient();
|
|
7
|
+
const response = await client.getDefaultApi().getTweetResultByRestId({ tweetId: '1349129669258448897' });
|
|
8
|
+
printTweet(response.data!);
|
|
9
|
+
expect(response.raw.response.ok).toBe(true);
|
|
10
|
+
});
|
package/test/init.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as log4js from 'log4js';
|
|
|
6
6
|
dotenv.config();
|
|
7
7
|
|
|
8
8
|
const authToken = process.env.AUTH_TOKEN as string;
|
|
9
|
-
const
|
|
9
|
+
const CsrfToken = process.env.CSRF_TOKEN as string;
|
|
10
10
|
|
|
11
11
|
export const logger = log4js
|
|
12
12
|
.configure({
|
|
@@ -28,7 +28,14 @@ export const logger = log4js
|
|
|
28
28
|
|
|
29
29
|
export const getClient = async () => {
|
|
30
30
|
const api = new TwitterOpenApi({ fetchApi: fetch as any });
|
|
31
|
-
const client = await api.getClientFromCookies(
|
|
32
|
-
|
|
31
|
+
const client = await api.getClientFromCookies({
|
|
32
|
+
ct0: CsrfToken,
|
|
33
|
+
auth_token: authToken,
|
|
34
|
+
});
|
|
35
|
+
return client;
|
|
36
|
+
};
|
|
37
|
+
export const getGuestClient = async () => {
|
|
38
|
+
const api = new TwitterOpenApi({ fetchApi: fetch as any });
|
|
39
|
+
const client = await api.getGuestClient();
|
|
33
40
|
return client;
|
|
34
41
|
};
|
package/tsconfig.build.json
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"declaration": true,
|
|
4
4
|
"target": "es5",
|
|
5
|
+
"downlevelIteration": true,
|
|
5
6
|
"module": "commonjs",
|
|
6
7
|
"moduleResolution": "node",
|
|
7
8
|
"outDir": "dist",
|
|
8
|
-
"lib": ["
|
|
9
|
+
"lib": ["es2020", "dom"],
|
|
9
10
|
"typeRoots": ["node_modules/@types"],
|
|
10
11
|
"allowSyntheticDefaultImports": true,
|
|
11
12
|
"rootDir": "./",
|
package/tsconfig.json
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"declaration": true,
|
|
4
4
|
"target": "es5",
|
|
5
|
+
"downlevelIteration": true,
|
|
5
6
|
"module": "commonjs",
|
|
6
7
|
"moduleResolution": "node",
|
|
7
8
|
"outDir": "dist",
|
|
8
|
-
"lib": ["
|
|
9
|
+
"lib": ["es2020", "dom"],
|
|
9
10
|
"typeRoots": ["node_modules/@types"],
|
|
10
11
|
"allowSyntheticDefaultImports": true,
|
|
11
12
|
"rootDir": "./",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
2
|
-
import { CursorApiUtilsResponse, ApiUtilsRaw, ApiUtilsHeader } from './';
|
|
3
|
-
export type TweetListApiUtilsResponse = {
|
|
4
|
-
raw: ApiUtilsRaw;
|
|
5
|
-
header: ApiUtilsHeader;
|
|
6
|
-
cursor: CursorApiUtilsResponse;
|
|
7
|
-
data: TweetApiUtilsData[];
|
|
8
|
-
};
|
|
9
|
-
export type TweetApiUtilsData = {
|
|
10
|
-
raw: i.ItemResult;
|
|
11
|
-
tweet: i.Tweet;
|
|
12
|
-
user: i.User;
|
|
13
|
-
reply: TweetApiUtilsData[];
|
|
14
|
-
quoted?: TweetApiUtilsData;
|
|
15
|
-
retweeted?: TweetApiUtilsData;
|
|
16
|
-
promotedMetadata?: any;
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=tweet.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tweet.d.ts","sourceRoot":"","sources":["../../../src/models/tweet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/E,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC;IAClB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;IACf,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACb,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB,CAAC"}
|
package/dist/src/models/tweet.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tweet.js","sourceRoot":"","sources":["../../../src/models/tweet.ts"],"names":[],"mappings":""}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
2
|
-
import { ApiUtilsHeader } from './';
|
|
3
|
-
export type UserApiUtilsResponse = {
|
|
4
|
-
raw: UserApiUtilsRaw;
|
|
5
|
-
header: ApiUtilsHeader;
|
|
6
|
-
data: i.User;
|
|
7
|
-
};
|
|
8
|
-
export type UsersApiUtilsResponse = {
|
|
9
|
-
raw: UserApiUtilsRaw;
|
|
10
|
-
header: ApiUtilsHeader;
|
|
11
|
-
data: i.User[];
|
|
12
|
-
};
|
|
13
|
-
export type UserApiUtilsRaw = {
|
|
14
|
-
response: Response;
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/models/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,eAAe,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;CACd,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,eAAe,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC"}
|
package/dist/src/models/user.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/models/user.ts"],"names":[],"mappings":""}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
2
|
-
import { ApiUtilsRaw, CursorApiUtilsResponse, ApiUtilsHeader } from './';
|
|
3
|
-
export type UserListApiUtilsResponse = {
|
|
4
|
-
raw: ApiUtilsRaw;
|
|
5
|
-
header: ApiUtilsHeader;
|
|
6
|
-
cursor: CursorApiUtilsResponse;
|
|
7
|
-
data: UserApiUtilsData[];
|
|
8
|
-
};
|
|
9
|
-
export type UserApiUtilsData = {
|
|
10
|
-
raw: i.TimelineUser;
|
|
11
|
-
user: i.User;
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=user_list.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user_list.d.ts","sourceRoot":"","sources":["../../../src/models/user_list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;CACd,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user_list.js","sourceRoot":"","sources":["../../../src/models/user_list.ts"],"names":[],"mappings":""}
|