twitter-gengar-typescript
Advanced tools
Comparing version 0.0.26 to 0.0.27
{ | ||
"recommendations": ["orta.vscode-jest"] | ||
"recommendations": [ | ||
"orta.vscode-jest", | ||
"ms-vscode.vscode-typescript-next", | ||
"dbaeumer.vscode-eslint", | ||
"esbenp.prettier-vscode" | ||
] | ||
} |
{ | ||
"jest.autoRun": { | ||
"watch": false | ||
} | ||
}, | ||
"[typescript]": { | ||
"editor.defaultFormatter": "esbenp.prettier-vscode", | ||
"editor.codeActionsOnSave": { | ||
"source.fixAll": "explicit", | ||
"source.organizeImports": "explicit", | ||
}, | ||
"editor.formatOnSave": true, | ||
}, | ||
} |
{ | ||
"name": "twitter-gengar-typescript", | ||
"version": "0.0.26", | ||
"version": "0.0.27", | ||
"description": "Implementation of Twitter internal API in TypeScript", | ||
@@ -5,0 +5,0 @@ "scripts": { |
@@ -12,9 +12,9 @@ # twitter-openapi-typescript | ||
```typescript | ||
import { TwitterOpenApi } from "twitter-openapi-typescript"; | ||
import { TwitterOpenApi } from 'twitter-openapi-typescript'; | ||
const api = new TwitterOpenApi(); | ||
const client = await api.getGuestClient(); | ||
const response = await client.getUserApi().getUserByScreenName({ screenName: 'elonmusk' }); | ||
console.log(response.data.legacy.screenName); | ||
console.log(`followCount: ${response.data.legacy.friendsCount} followersCount: ${response.data.legacy.followersCount}`); | ||
const api = new TwitterOpenApi(); | ||
const client = await api.getGuestClient(); | ||
const response = await client.getUserApi().getUserByScreenName({ screenName: 'elonmusk' }); | ||
console.log(response.data.legacy.screenName); | ||
console.log(`followCount: ${response.data.legacy.friendsCount} followersCount: ${response.data.legacy.followersCount}`); | ||
``` | ||
@@ -25,7 +25,7 @@ | ||
```typescript | ||
// ct0 and authToken will also work but it is recommended to set all cookies. | ||
const client = await api.getClientFromCookies({ | ||
ct0: "<csrf_token>", | ||
auth_token: "<auth_token>", | ||
}); | ||
// ct0 and authToken will also work but it is recommended to set all cookies. | ||
const client = await api.getClientFromCookies({ | ||
ct0: '<csrf_token>', | ||
auth_token: '<auth_token>', | ||
}); | ||
``` | ||
@@ -36,2 +36,3 @@ | ||
You should read the Test case. | ||
aaaaa | ||
@@ -45,9 +46,9 @@ <https://github.com/fa0311/twitter-openapi-typescript/tree/master/twitter-openapi-typescript/test/api> | ||
```typescript | ||
import { TwitterOpenApi } from "twitter-openapi-typescript"; | ||
TwitterOpenApi.url = "twitter-openapi placeholder json url"; | ||
TwitterOpenApi.twitter = "twitter first access url"; | ||
TwitterOpenApi.userAgent = "user agent"; | ||
TwitterOpenApi.bearer = "bearer token"; | ||
TwitterOpenApi.browser_headers = "browser headers"; | ||
TwitterOpenApi.api_key = "api key"; | ||
import { TwitterOpenApi } from 'twitter-openapi-typescript'; | ||
TwitterOpenApi.url = 'twitter-openapi placeholder json url'; | ||
TwitterOpenApi.twitter = 'twitter first access url'; | ||
TwitterOpenApi.userAgent = 'user agent'; | ||
TwitterOpenApi.bearer = 'bearer token'; | ||
TwitterOpenApi.browser_headers = 'browser headers'; | ||
TwitterOpenApi.api_key = 'api key'; | ||
``` | ||
@@ -54,0 +55,0 @@ |
123
src/api.ts
@@ -1,3 +0,1 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { | ||
@@ -14,38 +12,50 @@ DefaultApiUtils, | ||
} from '@/apis'; | ||
import { DefaultFlag } from '@/models'; | ||
import { DefaultFlag, initOverrides } from '@/models'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
import { UsersApiUtils } from './apis/usersApi'; | ||
export class TwitterOpenApi { | ||
static hash = '7560ee63488ec9d15f5389e64867f2413701d7dd'; | ||
static hash = 'fbfe847e9b3f11e2b25e294827f3637e316d41f0'; | ||
static url = `https://raw.githubusercontent.com/fa0311/twitter-openapi/${this.hash}/src/config/placeholder.json`; | ||
static header = "https://raw.githubusercontent.com/fa0311/latest-user-agent/main/header.json" | ||
static twitter = 'https://twitter.com/home'; | ||
static userAgent = | ||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'; | ||
static bearer = | ||
'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA'; | ||
static browser_headers = { | ||
accept: 'text/plain, */*; q=0.01', | ||
'accept-encoding': 'gzip, deflate, br', | ||
'accept-language': 'en-US,en;q=0.9', | ||
'cache-control': 'no-cache', | ||
pragma: 'no-cache', | ||
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', | ||
'sec-ch-ua-mobile': '?0', | ||
'sec-ch-ua-platform': '"Windows"', | ||
'sec-fetch-dest': 'empty', | ||
'sec-fetch-mode': 'cors', | ||
'sec-fetch-site': 'same-site', | ||
'user-agent': TwitterOpenApi.userAgent, | ||
}; | ||
static api_key = { | ||
'x-twitter-client-language': 'en', | ||
'x-twitter-active-user': 'yes', | ||
...TwitterOpenApi.browser_headers, | ||
async get_browser_headers(): Promise<{ [key: string]: string }> { | ||
const raw = await TwitterOpenApi.fetchApi(TwitterOpenApi.header); | ||
const json = await raw.json(); | ||
const ignore = ["host", "connection"]; | ||
const keys = Object.keys(json["chrome-fetch"]).filter((key) => !ignore.includes(key)); | ||
return { | ||
...keys.reduce((a, b) => ({ ...a, [b]: json["chrome-fetch"][b] }), {}), | ||
'accept-encoding': 'identity', | ||
"priority": "u=1, i", | ||
"referer":"https://twitter.com/home", | ||
}; | ||
} | ||
static fetchApi: i.FetchAPI = fetch; | ||
async get_api_key(): Promise<{ [key: string]: string }> { | ||
const data = await this.get_browser_headers(); | ||
return { | ||
...data, | ||
'x-twitter-client-language': 'en', | ||
'x-twitter-active-user': 'yes', | ||
authorization: `Bearer ${TwitterOpenApi.bearer}` | ||
}; | ||
} | ||
static fetchApi: i.FetchAPI = fetch.bind(globalThis); | ||
initOverrides: initOverrides = {}; | ||
setInitOverrides(initOverrides: initOverrides): void { | ||
this.initOverrides = initOverrides; | ||
} | ||
cookie_normalize(cookie: string[]): { [key: string]: string } { | ||
@@ -79,10 +89,18 @@ return cookie.reduce((a, b) => { | ||
headers: { Cookie: this.cookieEncode(cookies) }, | ||
...this.initOverrides, | ||
}); | ||
cookies = { ...cookies, ...this.cookie_normalize(response.headers.getSetCookie()) }; | ||
const html = await TwitterOpenApi.fetchApi(TwitterOpenApi.twitter, { | ||
method: 'GET', | ||
headers: { Cookie: this.cookieEncode(cookies) }, | ||
}).then((response) => response.text()); | ||
if (response.headers.getSetCookie) { | ||
cookies = { ...cookies, ...this.cookie_normalize(response.headers.getSetCookie()) }; | ||
} else { | ||
cookies = { ...cookies, ...this.cookie_normalize(response.headers.get('set-cookie')?.split(', ') || []) }; | ||
} | ||
const html = await response.text(); | ||
// const html = await TwitterOpenApi.fetchApi(TwitterOpenApi.twitter, { | ||
// method: 'GET', | ||
// headers: { Cookie: this.cookieEncode(cookies) }, | ||
// ...this.initOverrides, | ||
// }).then((response) => response.text()); | ||
const re = new RegExp('document.cookie="(.*?)";', 'g'); | ||
@@ -98,9 +116,7 @@ | ||
if (!cookies['gt']) { | ||
const activate_headers = { | ||
...TwitterOpenApi.api_key, | ||
authorization: `Bearer ${TwitterOpenApi.bearer}`, | ||
}; | ||
const activate_headers = await this.get_api_key(); | ||
const { guest_token } = await TwitterOpenApi.fetchApi('https://api.twitter.com/1.1/guest/activate.json', { | ||
method: 'POST', | ||
headers: activate_headers, | ||
...this.initOverrides, | ||
}).then((response) => response.json()); | ||
@@ -118,3 +134,3 @@ cookies['gt'] = guest_token; | ||
async getClientFromCookies(cookies: { [key: string]: string }): Promise<TwitterOpenApiClient> { | ||
let api_key: { [key: string]: string } = { ...TwitterOpenApi.api_key }; | ||
const api_key = await this.get_api_key(); | ||
if (cookies['ct0']) { | ||
@@ -138,6 +154,7 @@ api_key['x-twitter-auth-type'] = 'OAuth2Session'; | ||
async getClient(api: i.Configuration): Promise<TwitterOpenApiClient> { | ||
const flag = (await TwitterOpenApi.fetchApi(TwitterOpenApi.url, { method: 'GET' }).then((res) => | ||
res.json(), | ||
)) as DefaultFlag; | ||
return new TwitterOpenApiClient(api, flag); | ||
const flag = (await TwitterOpenApi.fetchApi(TwitterOpenApi.url, { | ||
method: 'GET', | ||
...this.initOverrides, | ||
}).then((res) => res.json())) as DefaultFlag; | ||
return new TwitterOpenApiClient(api, flag, this.initOverrides); | ||
} | ||
@@ -147,44 +164,46 @@ } | ||
export class TwitterOpenApiClient { | ||
private config: i.Configuration; | ||
public flag: DefaultFlag; | ||
config: i.Configuration; | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(config: i.Configuration, flag: DefaultFlag) { | ||
constructor(config: i.Configuration, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.config = config; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
getDefaultApi(): DefaultApiUtils { | ||
return new DefaultApiUtils(new i.DefaultApi(this.config), this.flag); | ||
return new DefaultApiUtils(new i.DefaultApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getTweetApi(): TweetApiUtils { | ||
return new TweetApiUtils(new i.TweetApi(this.config), this.flag); | ||
return new TweetApiUtils(new i.TweetApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getUserApi(): UserApiUtils { | ||
return new UserApiUtils(new i.UserApi(this.config), this.flag); | ||
return new UserApiUtils(new i.UserApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getUsersApi(): UsersApiUtils { | ||
return new UsersApiUtils(new i.UsersApi(this.config), this.flag); | ||
return new UsersApiUtils(new i.UsersApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getUserListApi(): UserListApiUtils { | ||
return new UserListApiUtils(new i.UserListApi(this.config), this.flag); | ||
return new UserListApiUtils(new i.UserListApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getPostApi(): PostApiUtils { | ||
return new PostApiUtils(new i.PostApi(this.config), this.flag); | ||
return new PostApiUtils(new i.PostApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getV11GetApi(): V11GetApiUtils { | ||
return new V11GetApiUtils(new i.V11GetApi(this.config), this.flag); | ||
return new V11GetApiUtils(new i.V11GetApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getV11PostApi(): V11PostApiUtils { | ||
return new V11PostApiUtils(new i.V11PostApi(this.config), this.flag); | ||
return new V11PostApiUtils(new i.V11PostApi(this.config), this.flag, this.initOverrides); | ||
} | ||
getV20GetApi(): V20GetApiUtils { | ||
return new V20GetApiUtils(new i.V20GetApi(this.config), this.flag); | ||
return new V20GetApiUtils(new i.V20GetApi(this.config), this.flag, this.initOverrides); | ||
} | ||
@@ -191,0 +210,0 @@ |
@@ -1,4 +0,4 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { DefaultFlag, RequestParam, TweetApiUtilsData, TwitterApiUtilsResponse, initOverrides } from '@/models'; | ||
import { buildHeader, buildTweetApiUtils, errorCheck, getKwargs } from '@/utils'; | ||
import { RequestParam, DefaultFlag, TwitterApiUtilsResponse, TweetApiUtilsData } from '@/models'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -18,6 +18,8 @@ export type ProfileSpotlightsQueryParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.DefaultApi, flag: DefaultFlag) { | ||
constructor(api: i.DefaultApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -28,3 +30,3 @@ | ||
const args = getKwargs(this.flag[param.key], param.param); | ||
const response = await apiFn(args); | ||
const response = await apiFn(args, this.initOverrides); | ||
const checked = errorCheck(await response.value()); | ||
@@ -31,0 +33,0 @@ const data = param.convertFn(checked); |
export { DefaultApiUtils } from './defaultApi'; | ||
export { InitialStateApiUtils } from './initialStateApi'; | ||
export { PostApiUtils } from './postApi'; | ||
export { TweetApiUtils } from './tweetApi'; | ||
export { PostApiUtils } from './postApi'; | ||
export { UserApiUtils } from './userApi'; | ||
export { UserListApiUtils } from './userListApi'; | ||
export { UsersApiUtils } from './usersApi'; | ||
export { UserListApiUtils } from './userListApi'; | ||
export { V11GetApiUtils } from './v11GetApi'; | ||
export { V11PostApiUtils } from './v11PostApi'; | ||
export { V20GetApiUtils } from './v20GetApi'; | ||
export { InitialStateApiUtils } from './initialStateApi'; |
@@ -1,6 +0,4 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { DefaultFlag } from '@/models'; | ||
import { DefaultFlag, TwitterApiUtilsResponse, initOverrides } from '@/models'; | ||
import { buildHeader, errorCheck } from '@/utils'; | ||
import { TwitterApiUtilsResponse } from '@/models'; | ||
import { error } from 'console'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -39,9 +37,17 @@ type PostCreateTweetParam = { | ||
type PostConversationControlParam = { | ||
tweetId: string; | ||
mode: string; | ||
extraParam?: { [key: string]: any }; | ||
}; | ||
export class PostApiUtils { | ||
api: i.PostApi; | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.PostApi, flag: DefaultFlag) { | ||
constructor(api: i.PostApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -194,2 +200,37 @@ | ||
} | ||
async postConversationControl( | ||
param: PostConversationControlParam, | ||
): Promise<TwitterApiUtilsResponse<any>> { | ||
const args = { | ||
tweetId: param.tweetId, | ||
mode: param.mode, | ||
} | ||
// hb1elGcj6769uT8qVYqtjw | ||
// console.log(this.flag) | ||
// console.log(this.flag['ConversationControlChange']) | ||
// console.log(this.flag['ConversationControlChange']['queryId']) | ||
const queryId = 'ConversationControlChange'; | ||
const response = await this.api.postConversationControlChangeRaw({ | ||
pathQueryId: 'hb1elGcj6769uT8qVYqtjw', // this.flag[queryId]['queryId'], | ||
postConversationControlChangeRequest: { | ||
queryId: 'hb1elGcj6769uT8qVYqtjw', // this.flag[queryId]['queryId'], | ||
variables: args, | ||
} | ||
}); | ||
console.dir(response, {depth: null}) | ||
return { | ||
raw: { response: response.raw }, | ||
header: buildHeader(response.raw.headers), | ||
data: errorCheck(await response.value()), | ||
}; | ||
} | ||
} |
@@ -1,10 +0,19 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { | ||
DefaultFlag, | ||
RequestParam, | ||
TimelineApiUtilsResponse, | ||
TweetApiUtilsData, | ||
TwitterApiUtilsResponse, | ||
TweetApiUtilsData, | ||
TimelineApiUtilsResponse, | ||
initOverrides, | ||
} from '@/models'; | ||
import { buildHeader, entriesCursor, errorCheck, getKwargs, instructionToEntry, tweetEntriesConverter } from '@/utils'; | ||
import { | ||
buildHeader, | ||
entriesCursor, | ||
errorCheck, | ||
getKwargs, | ||
instructionConverter, | ||
instructionToEntry, | ||
tweetEntriesConverter, | ||
} from '@/utils'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -83,6 +92,8 @@ type GetTweetDetailParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.TweetApi, flag: DefaultFlag) { | ||
constructor(api: i.TweetApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -93,7 +104,7 @@ | ||
const args = getKwargs(this.flag[param.key], param.param); | ||
const response = await apiFn(args); | ||
const response = await apiFn(args, this.initOverrides); | ||
const checked = errorCheck(await response.value()); | ||
const instruction = param.convertFn(checked); | ||
const entry = instructionToEntry(instruction); | ||
const data = tweetEntriesConverter(entry); | ||
const data = [...tweetEntriesConverter(entry), ...instructionConverter(instruction)]; | ||
return { | ||
@@ -100,0 +111,0 @@ raw: { |
@@ -1,4 +0,4 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { RequestParam, DefaultFlag, UserApiUtilsData, TwitterApiUtilsResponse } from '@/models'; | ||
import { DefaultFlag, RequestParam, TwitterApiUtilsResponse, UserApiUtilsData, initOverrides } from '@/models'; | ||
import { buildHeader, errorCheck, getKwargs, userOrNullConverter } from '@/utils'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -20,6 +20,8 @@ type getUserByScreenNameParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.UserApi, flag: DefaultFlag) { | ||
constructor(api: i.UserApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -30,3 +32,3 @@ | ||
const args = getKwargs(this.flag[param.key], param.param); | ||
const response = await apiFn(args); | ||
const response = await apiFn(args, this.initOverrides); | ||
const checked = errorCheck(await response.value()); | ||
@@ -33,0 +35,0 @@ const result = param.convertFn(checked); |
@@ -1,20 +0,19 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { | ||
DefaultFlag, | ||
RequestParam, | ||
DefaultFlag, | ||
ApiUtilsRaw, | ||
TimelineApiUtilsResponse, | ||
TwitterApiUtilsResponse, | ||
UserApiUtilsData, | ||
TwitterApiUtilsRaw, | ||
initOverrides, | ||
} from '@/models'; | ||
import { | ||
buildHeader, | ||
userResultConverter, | ||
entriesCursor, | ||
errorCheck, | ||
getKwargs, | ||
instructionToEntry, | ||
userEntriesConverter, | ||
getKwargs, | ||
errorCheck, | ||
userResultConverter, | ||
} from '@/utils'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -61,6 +60,8 @@ type GetFollowersParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.UserListApi, flag: DefaultFlag) { | ||
constructor(api: i.UserListApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -71,3 +72,3 @@ | ||
const args = getKwargs(this.flag[param.key], param.param); | ||
const response = await apiFn(args); | ||
const response = await apiFn(args, this.initOverrides); | ||
const checked = errorCheck(await response.value()); | ||
@@ -74,0 +75,0 @@ const instruction = param.convertFn(checked); |
@@ -1,4 +0,4 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { RequestParam, DefaultFlag, UserApiUtilsData, TwitterApiUtilsResponse } from '@/models'; | ||
import { buildHeader, errorCheck, getKwargs, userOrNullConverter, userResultConverter } from '@/utils'; | ||
import { DefaultFlag, RequestParam, TwitterApiUtilsResponse, UserApiUtilsData, initOverrides } from '@/models'; | ||
import { buildHeader, errorCheck, getKwargs, userResultConverter } from '@/utils'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -15,6 +15,8 @@ type getUsersByRestIdsParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.UsersApi, flag: DefaultFlag) { | ||
constructor(api: i.UsersApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -25,3 +27,3 @@ | ||
const args = getKwargs(this.flag[param.key], param.param); | ||
const response = await apiFn(args); | ||
const response = await apiFn(args, this.initOverrides); | ||
const checked = errorCheck(await response.value()); | ||
@@ -28,0 +30,0 @@ const result = param.convertFn(checked); |
@@ -1,3 +0,3 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { DefaultFlag } from '@/models'; | ||
import { DefaultFlag, initOverrides } from '@/models'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -7,7 +7,9 @@ export class V11GetApiUtils { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.V11GetApi, flag: DefaultFlag) { | ||
constructor(api: i.V11GetApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
} |
@@ -1,4 +0,4 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { DefaultFlag, TwitterApiUtilsResponse } from '@/models'; | ||
import { DefaultFlag, TwitterApiUtilsResponse, initOverrides } from '@/models'; | ||
import { buildHeader } from '@/utils'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -18,6 +18,8 @@ type PostCreateFriendshipsParam = { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.V11PostApi, flag: DefaultFlag) { | ||
constructor(api: i.V11PostApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
@@ -24,0 +26,0 @@ |
@@ -1,3 +0,3 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { DefaultFlag } from '@/models'; | ||
import { DefaultFlag, initOverrides } from '@/models'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -7,7 +7,9 @@ export class V20GetApiUtils { | ||
flag: DefaultFlag; | ||
initOverrides: initOverrides; | ||
constructor(api: i.V20GetApi, flag: DefaultFlag) { | ||
constructor(api: i.V20GetApi, flag: DefaultFlag, initOverrides: initOverrides) { | ||
this.api = api; | ||
this.flag = flag; | ||
this.initOverrides = initOverrides; | ||
} | ||
} |
@@ -0,4 +1,3 @@ | ||
export * from '@/api'; | ||
export * from '@/apis'; | ||
export * from '@/models'; | ||
export * from '@/models'; | ||
export * from '@/api'; |
export * from './flag'; | ||
export * from './header'; | ||
export * from './response'; | ||
export * from './timeline'; | ||
export * from './response'; | ||
export * from './utils'; |
@@ -1,2 +0,2 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -3,0 +3,0 @@ export type CursorApiUtilsResponse = { |
@@ -1,4 +0,5 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
export type ApiFunction<T> = (requestParameters: any) => Promise<i.ApiResponse<T>>; | ||
export type initOverrides = RequestInit | i.InitOverrideFunction; | ||
export type ApiFunction<T> = (requestParameters: any, initOverrides?: initOverrides) => Promise<i.ApiResponse<T>>; | ||
@@ -5,0 +6,0 @@ export type RequestParam<T1, T2> = { |
@@ -1,3 +0,3 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import { TweetApiUtilsData, UserApiUtilsData, CursorApiUtilsResponse, ApiUtilsHeader } from '@/models'; | ||
import { ApiUtilsHeader, CursorApiUtilsResponse, TweetApiUtilsData, UserApiUtilsData } from '@/models'; | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -32,2 +32,4 @@ export const getKwargs = (flag: { [key: string]: any }, additional: { [key: string]: any }): any => { | ||
return (e as i.TimelineAddEntries).entries; | ||
} else if (e.type == i.InstructionType.TimelineAddToModule) { | ||
return []; | ||
} else if (e.type == i.InstructionType.TimelineReplaceEntry) { | ||
@@ -40,2 +42,19 @@ return [(e as i.TimelineReplaceEntry).entry]; | ||
export const instructionConverter = (item: i.InstructionUnion[]): TweetApiUtilsData[] => { | ||
return item | ||
.flatMap((e) => { | ||
if (e.type == i.InstructionType.TimelineAddEntries) { | ||
return []; | ||
} else if (e.type == i.InstructionType.TimelineAddToModule) { | ||
const item = (e as i.TimelineAddToModule).moduleItems ?? []; | ||
return moduleConverter(item); | ||
} else if (e.type == i.InstructionType.TimelineReplaceEntry) { | ||
return []; | ||
} | ||
return []; | ||
}) | ||
.filter((e): e is NonNullable<typeof e> => e != undefined) | ||
.flat(); | ||
}; | ||
export const tweetEntriesConverter = (item: i.TimelineAddEntry[]): TweetApiUtilsData[] => { | ||
@@ -48,23 +67,45 @@ return item | ||
if (timeline == undefined) return undefined; | ||
return buildTweetApiUtils({ | ||
result: timeline.tweetResults, | ||
promotedMetadata: timeline.promotedMetadata, | ||
}); | ||
return [ | ||
buildTweetApiUtils({ | ||
result: timeline.tweetResults, | ||
promotedMetadata: timeline.promotedMetadata, | ||
}), | ||
]; | ||
} else if (e.content.entryType == i.ContentEntryType.TimelineTimelineModule) { | ||
const item = (e.content as i.TimelineTimelineModule).items ?? []; | ||
const timelineList = item | ||
.filter((e) => e.item.itemContent.itemType == i.ContentItemType.TimelineTweet) | ||
.map((e) => e.item.itemContent as i.TimelineTweet); | ||
if (timelineList.length == 0) return undefined; | ||
const timeline = timelineList[0]; | ||
return buildTweetApiUtils({ | ||
result: timeline.tweetResults, | ||
promotedMetadata: timeline.promotedMetadata, | ||
reply: timelineList.slice(1), | ||
}); | ||
return moduleConverter(item); | ||
} | ||
}) | ||
.filter((e): e is NonNullable<typeof e> => e != undefined); | ||
.filter((e): e is NonNullable<typeof e> => e != undefined) | ||
.map((e) => e.filter((e): e is NonNullable<typeof e> => e != undefined)) | ||
.flat(); | ||
}; | ||
export const moduleConverter = (item: i.ModuleItem[]): TweetApiUtilsData[] => { | ||
const timelineList = item | ||
.filter((e) => e.item.itemContent.itemType == i.ContentItemType.TimelineTweet) | ||
.map((e) => e.item.itemContent as i.TimelineTweet); | ||
if (timelineList.length == 0) return []; | ||
if (timelineList[0].tweetDisplayType == i.TimelineTweetTweetDisplayTypeEnum.MediaGrid) { | ||
return timelineList | ||
.map((e) => | ||
buildTweetApiUtils({ | ||
result: e.tweetResults, | ||
promotedMetadata: e.promotedMetadata, | ||
}), | ||
) | ||
.filter((e): e is NonNullable<typeof e> => e != undefined); | ||
} else { | ||
const timeline = timelineList[0]; | ||
return [ | ||
buildTweetApiUtils({ | ||
result: timeline.tweetResults, | ||
promotedMetadata: timeline.promotedMetadata, | ||
reply: timelineList.slice(1), | ||
}), | ||
].filter((e): e is NonNullable<typeof e> => e != undefined); | ||
} | ||
}; | ||
type buildTweetApiUtilsArgs = { | ||
@@ -109,3 +150,2 @@ result: i.ItemResult; | ||
} | ||
throw Error(); | ||
}; | ||
@@ -112,0 +152,0 @@ |
@@ -7,3 +7,2 @@ import { getClient, logger } from '@test/init'; | ||
const client = await getClient(); | ||
console.dir(client, { depth: 10 }) | ||
const response = await client.getDefaultApi().getProfileSpotlightsQuery({ screenName: 'elonmusk' }); | ||
@@ -10,0 +9,0 @@ const legacy = response.data.result.legacy; |
@@ -62,1 +62,10 @@ import { getClient, logger } from '@test/init'; | ||
}); | ||
test('postConverastionControll', async () => { | ||
logger.log('postConversationControll'); | ||
console.log("Hello"); | ||
const client = await getClient(); | ||
const response = await client.getPostApi().postConversationControl({ tweetId: '1818655939634807035', mode: 'ByInvitation' }); | ||
expect(response.raw.response.ok).toBe(true); | ||
}); | ||
@@ -7,3 +7,3 @@ import { getClient, logger } from '@test/init'; | ||
const client = await getClient(); | ||
const response = await client.getTweetApi().getTweetDetail({ focalTweetId: '1736190945207505116' }); | ||
const response = await client.getTweetApi().getTweetDetail({ focalTweetId: '1349129669258448897' }); | ||
response.data.data.filter((e) => !e.promotedMetadata).forEach((e) => printTweet(e)); | ||
@@ -10,0 +10,0 @@ expect(response.raw.response.ok).toBe(true); |
@@ -1,2 +0,2 @@ | ||
import { getClient, logger } from '@test/init'; | ||
import { getClient } from '@test/init'; | ||
@@ -3,0 +3,0 @@ test('postCreateFriendships', async () => { |
import { TwitterOpenApi } from '@/api'; | ||
import * as dotenv from 'dotenv'; | ||
import * as log4js from 'log4js'; | ||
dotenv.config(); | ||
const authToken = 'ede342a1204c000f4709b031d3a43cf15ce20a79' | ||
const CsrfToken = '59a0f47a02729ed3a002838dfcf3a13ea15cd6dfa99c602e761cad1f25594d165f2226a513d9d956e6011e3fdddf5da76ebc4b59fdccc0349207dfa860672ef52b37230520791cc3a93c647451c0d8ae' | ||
const authToken = '30c0d12b9d3d24ceb4b0850745db0bad3cd6bf54' | ||
const CsrfToken = 'fbcec026e53d657acc7b5d652333f68c2b388952b76bfcda0a7ba0166f23d2664bb8d0b7c8a717626e360b76aae9e01ae2af289fd0910ac1f0d969624798c8c61856dabe340b14ec608bbc07cab13992' | ||
export const logger = log4js | ||
@@ -28,2 +25,8 @@ .configure({ | ||
export type Cookie = { | ||
name: string; | ||
domain: string; | ||
value: string; | ||
}; | ||
export const getClient = async () => { | ||
@@ -30,0 +33,0 @@ const api = new TwitterOpenApi(); |
@@ -1,2 +0,2 @@ | ||
import { getClient, logger } from '@test/init'; | ||
import { getClient } from '@test/init'; | ||
@@ -3,0 +3,0 @@ test('getHomeTimelineRaw', async () => { |
@@ -1,2 +0,2 @@ | ||
import * as i from 'twitter-gengar-generated' | ||
import * as i from 'twitter-openapi-typescript-generated'; | ||
@@ -3,0 +3,0 @@ import { TweetApiUtilsData, UserApiUtilsData } from '@/models'; |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
58
0
103420
42
1740