twitter-openapi-typescript 0.0.43 → 0.0.44
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/apis/defaultApi.d.ts.map +1 -1
- package/dist/src/apis/defaultApi.js +8 -9
- package/dist/src/apis/defaultApi.js.map +1 -1
- package/dist/src/apis/postApi.d.ts +2 -2
- package/dist/src/apis/postApi.d.ts.map +1 -1
- package/dist/src/apis/postApi.js +48 -54
- package/dist/src/apis/postApi.js.map +1 -1
- package/dist/src/apis/tweetApi.d.ts.map +1 -1
- package/dist/src/apis/tweetApi.js +16 -17
- package/dist/src/apis/tweetApi.js.map +1 -1
- package/dist/src/apis/userApi.d.ts.map +1 -1
- package/dist/src/apis/userApi.js +8 -9
- package/dist/src/apis/userApi.js.map +1 -1
- package/dist/src/apis/userListApi.d.ts.map +1 -1
- package/dist/src/apis/userListApi.js +11 -12
- package/dist/src/apis/userListApi.js.map +1 -1
- package/dist/src/apis/usersApi.d.ts.map +1 -1
- package/dist/src/apis/usersApi.js +7 -8
- package/dist/src/apis/usersApi.js.map +1 -1
- package/dist/src/models/utils.d.ts +1 -1
- package/dist/src/models/utils.d.ts.map +1 -1
- package/dist/src/utils/api.d.ts +1 -2
- package/dist/src/utils/api.d.ts.map +1 -1
- package/dist/src/utils/api.js +9 -16
- package/dist/src/utils/api.js.map +1 -1
- package/package.json +2 -2
- package/.prettierrc +0 -8
- package/.vscode/extensions.json +0 -8
- package/.vscode/settings.json +0 -21
- package/cookies.json +0 -170
- package/jest.config.js +0 -11
- package/src/api.ts +0 -222
- package/src/apis/defaultApi.ts +0 -72
- package/src/apis/index.ts +0 -10
- package/src/apis/initialStateApi.ts +0 -3
- package/src/apis/postApi.ts +0 -208
- package/src/apis/tweetApi.ts +0 -289
- package/src/apis/userApi.ts +0 -72
- package/src/apis/userListApi.ts +0 -173
- package/src/apis/usersApi.ts +0 -50
- package/src/apis/v11GetApi.ts +0 -14
- package/src/apis/v11PostApi.ts +0 -75
- package/src/apis/v20GetApi.ts +0 -14
- package/src/index.ts +0 -4
- package/src/models/flag.ts +0 -5
- package/src/models/header.ts +0 -14
- package/src/models/index.ts +0 -5
- package/src/models/response.ts +0 -11
- package/src/models/timeline.ts +0 -32
- package/src/models/utils.ts +0 -10
- package/src/utils/api.ts +0 -230
- package/src/utils/index.ts +0 -1
- package/test/api/auth.test.ts +0 -15
- package/test/api/defaultApi.test.ts +0 -21
- package/test/api/guest.test.ts +0 -10
- package/test/api/postApi.test.ts +0 -61
- package/test/api/tweetApi.test.ts +0 -82
- package/test/api/userApi.test.ts +0 -33
- package/test/api/userListApi.test.ts +0 -42
- package/test/api/usersApi.test.ts +0 -12
- package/test/api/v11PostApi.test.ts +0 -13
- package/test/init.ts +0 -50
- package/test/raw/tweet_api.test.ts +0 -12
- package/test/util.ts +0 -29
- package/tsconfig.build.json +0 -26
- package/tsconfig.json +0 -26
package/src/models/header.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type ApiUtilsHeader = {
|
|
2
|
-
raw: Headers;
|
|
3
|
-
connectionHash: string;
|
|
4
|
-
contentTypeOptions: string;
|
|
5
|
-
frameOptions: string;
|
|
6
|
-
rateLimitLimit: number;
|
|
7
|
-
rateLimitRemaining: number;
|
|
8
|
-
rateLimitReset: number;
|
|
9
|
-
responseTime: number;
|
|
10
|
-
tfePreserveBody: boolean;
|
|
11
|
-
transactionId: string;
|
|
12
|
-
twitterResponseTags: string;
|
|
13
|
-
xssProtection: number;
|
|
14
|
-
};
|
package/src/models/index.ts
DELETED
package/src/models/response.ts
DELETED
package/src/models/timeline.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
2
|
-
|
|
3
|
-
export type CursorApiUtilsResponse = {
|
|
4
|
-
bottom?: i.TimelineTimelineCursor;
|
|
5
|
-
top?: i.TimelineTimelineCursor;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export type ApiUtilsRaw = {
|
|
9
|
-
instruction: i.InstructionUnion[];
|
|
10
|
-
entry: i.TimelineAddEntry[];
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export type TweetApiUtilsData = {
|
|
14
|
-
raw: i.ItemResult;
|
|
15
|
-
tweet: i.Tweet;
|
|
16
|
-
user: i.User;
|
|
17
|
-
replies: TweetApiUtilsData[];
|
|
18
|
-
quoted?: TweetApiUtilsData;
|
|
19
|
-
retweeted?: TweetApiUtilsData;
|
|
20
|
-
promotedMetadata?: Record<string, unknown>;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export type UserApiUtilsData = {
|
|
24
|
-
raw: i.UserResults;
|
|
25
|
-
user: i.User | undefined;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export type TimelineApiUtilsResponse<T> = {
|
|
29
|
-
raw: ApiUtilsRaw;
|
|
30
|
-
cursor: CursorApiUtilsResponse;
|
|
31
|
-
data: T[];
|
|
32
|
-
};
|
package/src/models/utils.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
2
|
-
export type initOverrides = RequestInit;
|
|
3
|
-
export type ApiFunction<T> = (requestParameters: any, initOverrides?: initOverrides) => Promise<i.ApiResponse<T>>;
|
|
4
|
-
|
|
5
|
-
export type RequestParam<T1, T2> = {
|
|
6
|
-
apiFn: ApiFunction<i.Errors | T2>;
|
|
7
|
-
convertFn: (arg0: T2) => T1;
|
|
8
|
-
key: string;
|
|
9
|
-
param: { [key: string]: any };
|
|
10
|
-
};
|
package/src/utils/api.ts
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { ApiUtilsHeader, CursorApiUtilsResponse, TweetApiUtilsData, UserApiUtilsData } from '@/models';
|
|
2
|
-
import * as i from 'twitter-openapi-typescript-generated';
|
|
3
|
-
|
|
4
|
-
export const nonNullable = <T>(x: T | undefined): T => {
|
|
5
|
-
if (x == undefined) {
|
|
6
|
-
throw Error('No data');
|
|
7
|
-
}
|
|
8
|
-
return x;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const getKwargs = (flag: { [key: string]: any }, additional: { [key: string]: any }): any => {
|
|
12
|
-
const kwargs: { [key: string]: any } = { pathQueryId: flag.queryId };
|
|
13
|
-
if (flag.variables != undefined) {
|
|
14
|
-
kwargs.variables = JSON.stringify({ ...flag.variables, ...additional });
|
|
15
|
-
}
|
|
16
|
-
if (flag.features != undefined) {
|
|
17
|
-
kwargs.features = JSON.stringify(flag.features);
|
|
18
|
-
}
|
|
19
|
-
if (flag.fieldToggles != undefined) {
|
|
20
|
-
kwargs.fieldToggles = JSON.stringify(flag.fieldToggles);
|
|
21
|
-
}
|
|
22
|
-
return kwargs;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export const errorCheck = <T>(data: i.Errors | T): T => {
|
|
26
|
-
const res: any = data;
|
|
27
|
-
if (res.data != undefined) {
|
|
28
|
-
return res;
|
|
29
|
-
} else if (res.error != undefined) {
|
|
30
|
-
throw Error(res.errors[0].message);
|
|
31
|
-
}
|
|
32
|
-
throw Error();
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export const instructionToEntry = (item: i.InstructionUnion[]): i.TimelineAddEntry[] => {
|
|
36
|
-
return item.flatMap((e) => {
|
|
37
|
-
if (e.type == i.InstructionType.TimelineAddEntries) {
|
|
38
|
-
return (e as i.TimelineAddEntries).entries;
|
|
39
|
-
} else if (e.type == i.InstructionType.TimelineAddToModule) {
|
|
40
|
-
return [];
|
|
41
|
-
} else if (e.type == i.InstructionType.TimelineReplaceEntry) {
|
|
42
|
-
return [(e as i.TimelineReplaceEntry).entry];
|
|
43
|
-
}
|
|
44
|
-
return [];
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export const instructionConverter = (item: i.InstructionUnion[]): TweetApiUtilsData[] => {
|
|
49
|
-
return item
|
|
50
|
-
.flatMap((e) => {
|
|
51
|
-
if (e.type == i.InstructionType.TimelineAddEntries) {
|
|
52
|
-
return [];
|
|
53
|
-
} else if (e.type == i.InstructionType.TimelineAddToModule) {
|
|
54
|
-
const item = (e as i.TimelineAddToModule).moduleItems ?? [];
|
|
55
|
-
return moduleConverter(item);
|
|
56
|
-
} else if (e.type == i.InstructionType.TimelineReplaceEntry) {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
return [];
|
|
60
|
-
})
|
|
61
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined)
|
|
62
|
-
.flat();
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export const tweetEntriesConverter = (item: i.TimelineAddEntry[]): TweetApiUtilsData[] => {
|
|
66
|
-
return item
|
|
67
|
-
.map((e) => {
|
|
68
|
-
if (e.content.entryType == i.ContentEntryType.TimelineTimelineItem) {
|
|
69
|
-
const item = (e.content as i.TimelineTimelineItem).itemContent;
|
|
70
|
-
const timeline = item.itemType == i.ContentItemType.TimelineTweet ? (item as i.TimelineTweet) : undefined;
|
|
71
|
-
if (timeline == undefined) return undefined;
|
|
72
|
-
return [
|
|
73
|
-
buildTweetApiUtils({
|
|
74
|
-
result: timeline.tweetResults,
|
|
75
|
-
promotedMetadata: timeline.promotedMetadata,
|
|
76
|
-
}),
|
|
77
|
-
];
|
|
78
|
-
} else if (e.content.entryType == i.ContentEntryType.TimelineTimelineModule) {
|
|
79
|
-
const item = (e.content as i.TimelineTimelineModule).items ?? [];
|
|
80
|
-
return moduleConverter(item);
|
|
81
|
-
}
|
|
82
|
-
})
|
|
83
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined)
|
|
84
|
-
.map((e) => e.filter((e): e is NonNullable<typeof e> => e != undefined))
|
|
85
|
-
.flat();
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export const moduleConverter = (item: i.ModuleItem[]): TweetApiUtilsData[] => {
|
|
89
|
-
const timelineList = item
|
|
90
|
-
.filter((e) => e.item.itemContent.itemType == i.ContentItemType.TimelineTweet)
|
|
91
|
-
.map((e) => e.item.itemContent as i.TimelineTweet);
|
|
92
|
-
if (timelineList.length == 0) return [];
|
|
93
|
-
|
|
94
|
-
if (timelineList[0].tweetDisplayType == i.TimelineTweetTweetDisplayTypeEnum.MediaGrid) {
|
|
95
|
-
return timelineList
|
|
96
|
-
.map((e) =>
|
|
97
|
-
buildTweetApiUtils({
|
|
98
|
-
result: e.tweetResults,
|
|
99
|
-
promotedMetadata: e.promotedMetadata,
|
|
100
|
-
}),
|
|
101
|
-
)
|
|
102
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined);
|
|
103
|
-
} else {
|
|
104
|
-
const timeline = timelineList[0];
|
|
105
|
-
return [
|
|
106
|
-
buildTweetApiUtils({
|
|
107
|
-
result: timeline.tweetResults,
|
|
108
|
-
promotedMetadata: timeline.promotedMetadata,
|
|
109
|
-
reply: timelineList.slice(1),
|
|
110
|
-
}),
|
|
111
|
-
].filter((e): e is NonNullable<typeof e> => e != undefined);
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
type buildTweetApiUtilsArgs = {
|
|
116
|
-
result: i.ItemResult;
|
|
117
|
-
promotedMetadata?: any;
|
|
118
|
-
reply?: i.TimelineTweet[];
|
|
119
|
-
};
|
|
120
|
-
export const buildTweetApiUtils = (args: buildTweetApiUtilsArgs): TweetApiUtilsData | undefined => {
|
|
121
|
-
const tweet = tweetResultsConverter(args.result);
|
|
122
|
-
if (tweet == undefined) return undefined;
|
|
123
|
-
const result = tweet.core?.userResults.result;
|
|
124
|
-
const user = result && userOrNullConverter(result);
|
|
125
|
-
if (user == undefined) return undefined;
|
|
126
|
-
const quoted = tweet.quotedStatusResult;
|
|
127
|
-
const retweeted = tweet.legacy?.retweetedStatusResult;
|
|
128
|
-
|
|
129
|
-
const reply =
|
|
130
|
-
args.reply
|
|
131
|
-
?.map((e) => buildTweetApiUtils({ result: e.tweetResults, promotedMetadata: e.promotedMetadata }))
|
|
132
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined) ?? [];
|
|
133
|
-
return {
|
|
134
|
-
raw: args.result,
|
|
135
|
-
promotedMetadata: args.promotedMetadata,
|
|
136
|
-
tweet: tweet,
|
|
137
|
-
user: user,
|
|
138
|
-
replies: reply,
|
|
139
|
-
retweeted: retweeted == undefined ? undefined : buildTweetApiUtils({ result: retweeted }),
|
|
140
|
-
quoted: quoted == undefined ? undefined : buildTweetApiUtils({ result: quoted }),
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
export const tweetResultsConverter = (tweetResults: i.ItemResult): i.Tweet | undefined => {
|
|
145
|
-
if (tweetResults.result == undefined) return undefined;
|
|
146
|
-
switch (tweetResults.result.typename) {
|
|
147
|
-
case i.TypeName.Tweet:
|
|
148
|
-
return tweetResults.result as i.Tweet;
|
|
149
|
-
case i.TypeName.TweetWithVisibilityResults:
|
|
150
|
-
return (tweetResults.result as i.TweetWithVisibilityResults).tweet;
|
|
151
|
-
case i.TypeName.TweetTombstone:
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
export const userOrNullConverter = (userResults: i.UserUnion): i.User | undefined => {
|
|
157
|
-
if (userResults.typename == i.TypeName.User) {
|
|
158
|
-
return userResults as i.User;
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
export const userEntriesConverter = (item: i.TimelineAddEntry[]): i.UserResults[] => {
|
|
163
|
-
return item
|
|
164
|
-
.map((e) => {
|
|
165
|
-
if (e.content.typename == i.TypeName.TimelineTimelineItem) {
|
|
166
|
-
const item = (e.content as i.TimelineTimelineItem).itemContent;
|
|
167
|
-
if (item.itemType == i.ContentItemType.TimelineUser) {
|
|
168
|
-
return (item as i.TimelineUser).userResults;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
})
|
|
172
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined);
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const a = (a: string) => {
|
|
176
|
-
return a;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
export const userResultConverter = (user: i.UserResults[]): UserApiUtilsData[] => {
|
|
180
|
-
return user
|
|
181
|
-
.map((e) => {
|
|
182
|
-
const user = e.result && userOrNullConverter(e.result);
|
|
183
|
-
if (user == undefined) return undefined;
|
|
184
|
-
return {
|
|
185
|
-
raw: e,
|
|
186
|
-
user: user,
|
|
187
|
-
};
|
|
188
|
-
})
|
|
189
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined);
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export const entriesCursor = (item: i.TimelineAddEntry[]): CursorApiUtilsResponse => {
|
|
193
|
-
const cursorList = item
|
|
194
|
-
.map((e) => {
|
|
195
|
-
if (e.content.entryType == i.ContentEntryType.TimelineTimelineCursor) {
|
|
196
|
-
return e.content as i.TimelineTimelineCursor;
|
|
197
|
-
} else if (e.content.entryType == i.ContentEntryType.TimelineTimelineItem) {
|
|
198
|
-
const item = e.content as i.TimelineTimelineItem;
|
|
199
|
-
if (item.itemContent.itemType == i.ContentItemType.TimelineTimelineCursor) {
|
|
200
|
-
return item.itemContent as i.TimelineTimelineCursor;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
})
|
|
204
|
-
.filter((e): e is NonNullable<typeof e> => e != undefined);
|
|
205
|
-
return buildCursor(cursorList);
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
export const buildCursor = (cursorList: i.TimelineTimelineCursor[]): CursorApiUtilsResponse => {
|
|
209
|
-
return {
|
|
210
|
-
top: cursorList.find((e) => e.cursorType == i.CursorType.Top),
|
|
211
|
-
bottom: cursorList.find((e) => e.cursorType == i.CursorType.Bottom),
|
|
212
|
-
};
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
export const buildHeader = (headers: Headers): ApiUtilsHeader => {
|
|
216
|
-
return {
|
|
217
|
-
raw: headers,
|
|
218
|
-
connectionHash: headers.get('x-connection-hash')!,
|
|
219
|
-
contentTypeOptions: headers.get('x-content-type-options')!,
|
|
220
|
-
frameOptions: headers.get('x-frame-options')!,
|
|
221
|
-
rateLimitLimit: Number(headers.get('x-rate-limit-limit') ?? 0),
|
|
222
|
-
rateLimitRemaining: Number(headers.get('x-rate-limit-remaining') ?? 0),
|
|
223
|
-
rateLimitReset: Number(headers.get('x-rate-limit-reset') ?? 0),
|
|
224
|
-
responseTime: Number(headers.get('x-response-time')),
|
|
225
|
-
tfePreserveBody: headers.get('x-tfe-preserve-body') == 'true',
|
|
226
|
-
transactionId: headers.get('x-transaction-id')!,
|
|
227
|
-
twitterResponseTags: headers.get('x-twitter-response-tags')!,
|
|
228
|
-
xssProtection: Number(headers.get('x-xss-protection')),
|
|
229
|
-
};
|
|
230
|
-
};
|
package/src/utils/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './api';
|
package/test/api/auth.test.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { getClient } from '@test/init';
|
|
2
|
-
import { DefaultApi } from 'twitter-openapi-typescript-generated';
|
|
3
|
-
|
|
4
|
-
test('test auth', async () => {
|
|
5
|
-
const client = await getClient();
|
|
6
|
-
const that = client.getDefaultApi();
|
|
7
|
-
const fn = DefaultApi.prototype['request'].bind(that.api);
|
|
8
|
-
|
|
9
|
-
DefaultApi.prototype['request'] = (...args) => {
|
|
10
|
-
console.log('request', args);
|
|
11
|
-
return fn(...args);
|
|
12
|
-
};
|
|
13
|
-
const response = await that.getProfileSpotlightsQuery({ screenName: 'elonmusk' });
|
|
14
|
-
console.log(response);
|
|
15
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
import { printTweet } from '@test/util';
|
|
3
|
-
|
|
4
|
-
test('getProfileSpotlightsQuery', async () => {
|
|
5
|
-
logger.log('getProfileSpotlightsQuery');
|
|
6
|
-
const client = await getClient();
|
|
7
|
-
const response = await client.getDefaultApi().getProfileSpotlightsQuery({ screenName: 'elonmusk' });
|
|
8
|
-
const legacy = response.data.result.legacy;
|
|
9
|
-
logger.log(legacy.screenName ?? 'undefined');
|
|
10
|
-
logger.log(`followedBy: ${legacy.followedBy} following: ${legacy.following}`);
|
|
11
|
-
logger.log('┄'.repeat(50));
|
|
12
|
-
expect(response.raw.response.ok).toBe(true);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('getTweetResultByRestId', async () => {
|
|
16
|
-
logger.log('getTweetResultByRestId');
|
|
17
|
-
const client = await getClient();
|
|
18
|
-
const response = await client.getDefaultApi().getTweetResultByRestId({ tweetId: '1349129669258448897' });
|
|
19
|
-
printTweet(response.data!);
|
|
20
|
-
expect(response.raw.response.ok).toBe(true);
|
|
21
|
-
});
|
package/test/api/guest.test.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
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/api/postApi.test.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
|
|
3
|
-
test('postCreateTweet', async () => {
|
|
4
|
-
logger.log('postCreateTweet');
|
|
5
|
-
const client = await getClient();
|
|
6
|
-
const time = new Date().toISOString();
|
|
7
|
-
const response = await client.getPostApi().postCreateTweet({ tweetText: `Test[${time}]` });
|
|
8
|
-
expect(response.raw.response.ok).toBe(true);
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test('postCreateReplyTweet', async () => {
|
|
12
|
-
logger.log('postCreateTweet');
|
|
13
|
-
const client = await getClient();
|
|
14
|
-
const time = new Date().toISOString();
|
|
15
|
-
const response = await client.getPostApi().postCreateTweet({
|
|
16
|
-
tweetText: `Test[${time}]`,
|
|
17
|
-
inReplyToTweetId: '1788174612037320809',
|
|
18
|
-
});
|
|
19
|
-
expect(response.raw.response.ok).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('postDeleteTweet', async () => {
|
|
23
|
-
logger.log('postDeleteTweet');
|
|
24
|
-
const client = await getClient();
|
|
25
|
-
const time = new Date().toISOString();
|
|
26
|
-
const response = await client.getPostApi().postCreateTweet({ tweetText: `Test[${time}]` });
|
|
27
|
-
expect(response.raw.response.ok).toBe(true);
|
|
28
|
-
const tweetId = response.data.data.createTweet.tweetResults.result.restId;
|
|
29
|
-
logger.log(tweetId);
|
|
30
|
-
|
|
31
|
-
const response2 = await client.getPostApi().postDeleteTweet({ tweetId: tweetId });
|
|
32
|
-
expect(response2.raw.response.ok).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('postCreateRetweet', async () => {
|
|
36
|
-
logger.log('postCreateRetweet');
|
|
37
|
-
const client = await getClient();
|
|
38
|
-
const response = await client.getPostApi().postCreateRetweet({ tweetId: '1349129669258448897' });
|
|
39
|
-
expect(response.raw.response.ok).toBe(true);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('postDeleteRetweet', async () => {
|
|
43
|
-
logger.log('postDeleteRetweet');
|
|
44
|
-
const client = await getClient();
|
|
45
|
-
const response = await client.getPostApi().postDeleteRetweet({ sourceTweetId: '1349129669258448897' });
|
|
46
|
-
expect(response.raw.response.ok).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('postFavoriteTweet', async () => {
|
|
50
|
-
logger.log('postFavoriteTweet');
|
|
51
|
-
const client = await getClient();
|
|
52
|
-
const response = await client.getPostApi().postFavoriteTweet({ tweetId: '1349129669258448897' });
|
|
53
|
-
expect(response.raw.response.ok).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('postUnfavoriteTweet', async () => {
|
|
57
|
-
logger.log('postUnfavoriteTweet');
|
|
58
|
-
const client = await getClient();
|
|
59
|
-
const response = await client.getPostApi().postUnfavoriteTweet({ tweetId: '1349129669258448897' });
|
|
60
|
-
expect(response.raw.response.ok).toBe(true);
|
|
61
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
import { printTweet } from '@test/util';
|
|
3
|
-
|
|
4
|
-
test('getTweetDetail', async () => {
|
|
5
|
-
logger.log('getTweetDetail');
|
|
6
|
-
const client = await getClient();
|
|
7
|
-
const response = await client.getTweetApi().getTweetDetail({ focalTweetId: '1349129669258448897' });
|
|
8
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
9
|
-
expect(response.raw.response.ok).toBe(true);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test('getSearchTimeline', async () => {
|
|
13
|
-
logger.log('getSearchTimeline');
|
|
14
|
-
const client = await getClient();
|
|
15
|
-
const response = await client.getTweetApi().getSearchTimeline({ rawQuery: 'elonmusk' });
|
|
16
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
17
|
-
expect(response.raw.response.ok).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test('getHomeTimeline', async () => {
|
|
21
|
-
logger.log('getHomeTimeline');
|
|
22
|
-
const client = await getClient();
|
|
23
|
-
const response = await client.getTweetApi().getHomeTimeline();
|
|
24
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
25
|
-
expect(response.raw.response.ok).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('getHomeLatestTimeline', async () => {
|
|
29
|
-
logger.log('getHomeLatestTimeline');
|
|
30
|
-
const client = await getClient();
|
|
31
|
-
const response = await client.getTweetApi().getHomeLatestTimeline();
|
|
32
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
33
|
-
expect(response.raw.response.ok).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('getListLatestTweetsTimeline', async () => {
|
|
37
|
-
logger.log('getListLatestTweetsTimeline');
|
|
38
|
-
const client = await getClient();
|
|
39
|
-
const response = await client.getTweetApi().getListLatestTweetsTimeline({ listId: '1141162794290520064' });
|
|
40
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
41
|
-
expect(response.raw.response.ok).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('getUserTweets', async () => {
|
|
45
|
-
logger.log('getUserTweets');
|
|
46
|
-
const client = await getClient();
|
|
47
|
-
const response = await client.getTweetApi().getUserTweets({ userId: '44196397' });
|
|
48
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
49
|
-
expect(response.raw.response.ok).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('getUserTweetsAndReplies', async () => {
|
|
53
|
-
logger.log('getUserTweetsAndReplies');
|
|
54
|
-
const client = await getClient();
|
|
55
|
-
const response = await client.getTweetApi().getUserTweetsAndReplies({ userId: '44196397' });
|
|
56
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
57
|
-
expect(response.raw.response.ok).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test('getUserMedia', async () => {
|
|
61
|
-
logger.log('getUserMedia');
|
|
62
|
-
const client = await getClient();
|
|
63
|
-
const response = await client.getTweetApi().getUserMedia({ userId: '44196397' });
|
|
64
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
65
|
-
expect(response.raw.response.ok).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('getLikes', async () => {
|
|
69
|
-
logger.log('getLikes');
|
|
70
|
-
const client = await getClient();
|
|
71
|
-
const response = await client.getTweetApi().getLikes({ userId: '1787148517779406848' }); //@ptcpz3
|
|
72
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
73
|
-
expect(response.raw.response.ok).toBe(true);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test('getBookmarks', async () => {
|
|
77
|
-
logger.log('getBookmarks');
|
|
78
|
-
const client = await getClient();
|
|
79
|
-
const response = await client.getTweetApi().getBookmarks();
|
|
80
|
-
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e));
|
|
81
|
-
expect(response.raw.response.ok).toBe(true);
|
|
82
|
-
});
|
package/test/api/userApi.test.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
import { printUser } from '@test/util';
|
|
3
|
-
|
|
4
|
-
test('getUserByScreenName', async () => {
|
|
5
|
-
logger.log('getUserByScreenName');
|
|
6
|
-
const client = await getClient();
|
|
7
|
-
const response = await client.getUserApi().getUserByScreenName({ screenName: 'elonmusk' });
|
|
8
|
-
printUser(response.data);
|
|
9
|
-
expect(response.raw.response.ok).toBe(true);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test('getUserByScreenNameNotFound', async () => {
|
|
13
|
-
logger.log('getUserByScreenName');
|
|
14
|
-
const client = await getClient();
|
|
15
|
-
const response = client.getUserApi().getUserByScreenName({ screenName: 'Wendoleecs' });
|
|
16
|
-
expect(response).rejects.toThrow(Error);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test('getUserByScreenNameFreezed', async () => {
|
|
20
|
-
logger.log('getUserByScreenName');
|
|
21
|
-
const client = await getClient();
|
|
22
|
-
const response = await client.getUserApi().getUserByScreenName({ screenName: 'anal' });
|
|
23
|
-
printUser(response.data);
|
|
24
|
-
expect(response.raw.response.ok).toBe(true);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test('getUserByRestId', async () => {
|
|
28
|
-
logger.log('getUserByRestId');
|
|
29
|
-
const client = await getClient();
|
|
30
|
-
const response = await client.getUserApi().getUserByRestId({ userId: '44196397' });
|
|
31
|
-
printUser(response.data);
|
|
32
|
-
expect(response.raw.response.ok).toBe(true);
|
|
33
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
import { printUser } from '@test/util';
|
|
3
|
-
|
|
4
|
-
test('getFollowers', async () => {
|
|
5
|
-
logger.log('getFollowers');
|
|
6
|
-
const client = await getClient();
|
|
7
|
-
const response = await client.getUserListApi().getFollowers({ userId: '44196397' });
|
|
8
|
-
response.data.data.forEach((e) => printUser(e));
|
|
9
|
-
expect(response.raw.response.ok).toBe(true);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test('getFollowing', async () => {
|
|
13
|
-
logger.log('getFollowing');
|
|
14
|
-
const client = await getClient();
|
|
15
|
-
const response = await client.getUserListApi().getFollowing({ userId: '44196397' });
|
|
16
|
-
response.data.data.forEach((e) => printUser(e));
|
|
17
|
-
expect(response.raw.response.ok).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test('getFollowersYouKnow', async () => {
|
|
21
|
-
logger.log('getFollowersYouKnow');
|
|
22
|
-
const client = await getClient();
|
|
23
|
-
const response = await client.getUserListApi().getFollowersYouKnow({ userId: '44196397' });
|
|
24
|
-
response.data.data.forEach((e) => printUser(e));
|
|
25
|
-
expect(response.raw.response.ok).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('getFavoriters', async () => {
|
|
29
|
-
logger.log('getFavoriters');
|
|
30
|
-
const client = await getClient();
|
|
31
|
-
const response = await client.getUserListApi().getFavoriters({ tweetId: '1811571695544860784' });
|
|
32
|
-
response.data.data.forEach((e) => printUser(e));
|
|
33
|
-
expect(response.raw.response.ok).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('getRetweeters', async () => {
|
|
37
|
-
logger.log('getRetweeters');
|
|
38
|
-
const client = await getClient();
|
|
39
|
-
const response = await client.getUserListApi().getRetweeters({ tweetId: '1349129669258448897' });
|
|
40
|
-
response.data.data.forEach((e) => printUser(e));
|
|
41
|
-
expect(response.raw.response.ok).toBe(true);
|
|
42
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { getClient, logger } from '@test/init';
|
|
2
|
-
import { printLegacyUser } from '@test/util';
|
|
3
|
-
|
|
4
|
-
test('getUserByRestId', async () => {
|
|
5
|
-
logger.log('getUserByRestId');
|
|
6
|
-
const client = await getClient();
|
|
7
|
-
const response = await client.getUsersApi().getUsersByRestIds({ userIds: ['44196397'] });
|
|
8
|
-
response.data.forEach((e) => {
|
|
9
|
-
e.user && printLegacyUser(e.user.legacy);
|
|
10
|
-
});
|
|
11
|
-
expect(response.raw.response.ok).toBe(true);
|
|
12
|
-
});
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { getClient } from '@test/init';
|
|
2
|
-
|
|
3
|
-
test('postCreateFriendships', async () => {
|
|
4
|
-
const client = await getClient();
|
|
5
|
-
const response = await client.getV11PostApi().postCreateFriendships({ userId: '44196397' });
|
|
6
|
-
expect(response.raw.response.ok).toBe(true);
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
test('postDestroyFriendships', async () => {
|
|
10
|
-
const client = await getClient();
|
|
11
|
-
const response = await client.getV11PostApi().postDestroyFriendships({ userId: '44196397' });
|
|
12
|
-
expect(response.raw.response.ok).toBe(true);
|
|
13
|
-
});
|
package/test/init.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { TwitterOpenApi } from '@/api';
|
|
2
|
-
import { promises as fs } from 'fs';
|
|
3
|
-
import * as log4js from 'log4js';
|
|
4
|
-
|
|
5
|
-
export const logger = log4js
|
|
6
|
-
.configure({
|
|
7
|
-
appenders: {
|
|
8
|
-
system: {
|
|
9
|
-
type: 'file',
|
|
10
|
-
filename: 'logs/test.log',
|
|
11
|
-
layout: {
|
|
12
|
-
type: 'pattern',
|
|
13
|
-
pattern: '[%d{hh:mm:ss}] [%p] %m',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
categories: {
|
|
18
|
-
default: { appenders: ['system'], level: 'all' },
|
|
19
|
-
},
|
|
20
|
-
})
|
|
21
|
-
.getLogger('Test');
|
|
22
|
-
|
|
23
|
-
export type Cookie = {
|
|
24
|
-
name: string;
|
|
25
|
-
domain: string;
|
|
26
|
-
value: string;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const getClient = async () => {
|
|
30
|
-
const api = new TwitterOpenApi();
|
|
31
|
-
api.setAdditionalApiHeaders({
|
|
32
|
-
'sec-ch-ua-platform': '"Windows"',
|
|
33
|
-
});
|
|
34
|
-
api.setAdditionalApiHeaders({
|
|
35
|
-
'sec-ch-ua-platform': '"Windows"',
|
|
36
|
-
});
|
|
37
|
-
const data = await fs.readFile('cookies.json', 'utf-8');
|
|
38
|
-
const parsed = JSON.parse(data);
|
|
39
|
-
const cookies = parsed as Cookie[];
|
|
40
|
-
const json = Object.fromEntries(
|
|
41
|
-
cookies.filter((e) => ['.twitter.com', '.x.com'].includes(e.domain)).map((e) => [e.name, e.value]),
|
|
42
|
-
);
|
|
43
|
-
const client = await api.getClientFromCookies(json);
|
|
44
|
-
return client;
|
|
45
|
-
};
|
|
46
|
-
export const getGuestClient = async () => {
|
|
47
|
-
const api = new TwitterOpenApi();
|
|
48
|
-
const client = await api.getGuestClient();
|
|
49
|
-
return client;
|
|
50
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { getClient } from '@test/init';
|
|
2
|
-
|
|
3
|
-
test('getHomeTimelineRaw', async () => {
|
|
4
|
-
const client = await getClient();
|
|
5
|
-
const response = await client.getTweetApi().api.getHomeTimelineRaw({
|
|
6
|
-
pathQueryId: client.flag.HomeTimeline.queryId,
|
|
7
|
-
variables: JSON.stringify(client.flag.HomeTimeline.variables),
|
|
8
|
-
features: JSON.stringify(client.flag.HomeTimeline.features),
|
|
9
|
-
});
|
|
10
|
-
const value = await response.value();
|
|
11
|
-
expect(response.raw.ok).toBe(true);
|
|
12
|
-
});
|