1
Fork 0
mirror of https://github.com/thegeneralist01/twitter-openapi synced 2026-01-10 15:20:26 +01:00

add builder

Signed-off-by: ふぁ <yuki@yuki0311.com>
This commit is contained in:
ふぁ 2023-04-18 09:23:53 +09:00
parent 9052b3a16a
commit 26908878c1
No known key found for this signature in database
GPG key ID: 83A8A5E74872A8AA
31 changed files with 2886 additions and 1549 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.venv

101
dist/openapi-3.0.yaml vendored Normal file
View file

@ -0,0 +1,101 @@
components:
schemas: {}
securitySchemes:
ActiveUser:
description: 'yes'
in: header
name: x-twitter-active-user
type: apiKey
AuthType:
description: OAuth2Session
in: header
name: x-twitter-auth-type
type: apiKey
BearerAuth:
description: AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA
scheme: bearer
type: http
ClientLanguage:
description: en
in: header
name: x-twitter-client-language
type: apiKey
CookieAuthToken:
in: cookie
name: auth_token
type: apiKey
CookieCt0:
in: cookie
name: ct0
type: apiKey
CsrfToken:
in: header
name: x-csrf-token
type: apiKey
info:
contact:
email: yuki@yuki0311.com
description: Twitter OpenAPI(Swagger) specification
license:
name: GNU Affero General Public License v3.
url: https://raw.githubusercontent.com/fa0311/twitter-openapi/main/LICENSE.txt
termsOfService: https://github.com/fa0311
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths:
/2TemLyqrMpTeAmysdbnVqw/ListLatestTweetsTimeline:
$ref: ./path/timeline.yaml#/paths/~12TemLyqrMpTeAmysdbnVqw~1ListLatestTweetsTimeline
/5fmEkRT-1AdHqEsbVgehMg/Likes:
$ref: ./path/usertweets.yaml#/paths/~15fmEkRT-1AdHqEsbVgehMg~1Likes
/HCosKfLNW1AcOo3la3mMgg/HomeTimeline:
$ref: ./path/timeline.yaml#/paths/~1HCosKfLNW1AcOo3la3mMgg~1HomeTimeline
/HuTx74BxAnezK1gWvYY7zg/UserTweets:
$ref: ./path/usertweets.yaml#/paths/~1HuTx74BxAnezK1gWvYY7zg~1UserTweets
/RIWc55YCNyUJ-U3HHGYkdg/UserTweetsAndReplies:
$ref: ./path/usertweets.yaml#/paths/~1RIWc55YCNyUJ-U3HHGYkdg~1UserTweetsAndReplies
/YqiE3JL1KNgf9nSljYdxaA/UserMedia:
$ref: ./path/usertweets.yaml#/paths/~1YqiE3JL1KNgf9nSljYdxaA~1UserMedia
/sLVLhk0bGj3MVFEKTdax1w/UserByScreenName:
$ref: ./path/user.yaml#/paths/~1sLVLhk0bGj3MVFEKTdax1w~1UserByScreenName
/zhX91JE87mWvfprhYE97xA/HomeLatestTimeline:
$ref: ./path/timeline.yaml#/paths/~1zhX91JE87mWvfprhYE97xA~1HomeLatestTimeline
/{{FollowersQuery}}/Followers:
$ref: ./path/follow.yaml#/paths/~1{{FollowersQuery}}~1Followers
/{{FollowingQuery}}/Following:
$ref: ./path/follow.yaml#/paths/~1{{FollowingQuery}}~1Following
security:
- bearerAuth: []
- CsrfToken: []
- ActiveUser: []
- AuthType: []
- ClientLanguage: []
- CookieAuthToken: []
- CookieCt0: []
servers:
- url: https://twitter.com/i/api/graphql
tags:
- description: timeline
name: timeline
- description: tweet
name: tweet
- description: user
name: user
- description: follow
name: follow
- description: search
name: search
- description: dm
name: dm
- description: settings
name: settings
- description: notify
name: notify
- description: login session required
name: login required
- description: graphql
name: graphql
- description: login flow
name: login-flow
- description: report flow
name: report-flow

133
dist/path/follow.yaml vendored Normal file
View file

@ -0,0 +1,133 @@
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths:
/{{FollowersQuery}}/Followers:
get:
description: get user list of following
operationId: getFollowing
parameters:
- in: query
name: variables
required: true
schema:
example: '{{Variables}}'
type: string
- in: query
name: features
required: true
schema:
example: '{{Features}}'
type: string
- in: query
name: queryId
required: true
schema:
default: '{{Query}}'
example: '{{Query}}'
type: string
responses:
'200':
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- follow
- graphql
/{{FollowingQuery}}/Following:
get:
description: get user list of followers
operationId: getFollowers
parameters:
- in: query
name: variables
required: true
schema:
example: '{{Variables}}'
type: string
- in: query
name: features
required: true
schema:
example: '{{Features}}'
type: string
- in: query
name: queryId
required: true
schema:
default: '{{Query}}'
example: '{{Query}}'
type: string
responses:
'200':
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- follow
- graphql

258
dist/path/timeline.yaml vendored Normal file
View file

@ -0,0 +1,258 @@
components:
schemas:
HomeTimelineHome:
properties:
home_timeline_urt:
$ref: ./../schemas/timeline.yaml#/components/schemas/Timeline
required:
- home_timeline_urt
HomeTimelineResponseData:
properties:
home:
$ref: '#/components/schemas/HomeTimelineHome'
required:
- home
ListTweetsTimeline:
properties:
timeline:
$ref: ./../schemas/timeline.yaml#/components/schemas/Timeline
required:
- timeline
ListTweetsTimelineData:
properties:
home:
$ref: '#/components/schemas/ListTweetsTimelineList'
required:
- list
ListTweetsTimelineList:
properties:
tweets_timeline:
$ref: '#/components/schemas/ListTweetsTimeline'
required:
- tweets_timeline
ListTweetsTimelineResponse:
properties:
data:
$ref: '#/components/schemas/ListTweetsTimelineData'
required:
- data
TimelineResponse:
properties:
data:
$ref: '#/components/schemas/HomeTimelineResponseData'
required:
- data
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths:
/2TemLyqrMpTeAmysdbnVqw/ListLatestTweetsTimeline:
get:
description: get tweet list of timeline
operationId: getListLatestTweetsTimeline
parameters:
- in: query
name: variables
required: true
schema:
example: '{"listId": "53044119", "count": 20}'
type: string
- in: query
name: features
required: true
schema:
example: '{{Features}}'
type: string
- in: query
name: queryId
required: true
schema:
default: 2TemLyqrMpTeAmysdbnVqw
example: 2TemLyqrMpTeAmysdbnVqw
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ListTweetsTimelineResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- timeline
- login-required
- graphql
/HCosKfLNW1AcOo3la3mMgg/HomeTimeline:
get:
description: get tweet list of timeline
operationId: getHomeTimeline
parameters:
- in: query
name: variables
required: true
schema:
example: '{"count": 40, "includePromotedContent": true, "latestControlAvailable":
true, "withCommunity": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{{Features}}'
type: string
- in: query
name: queryId
required: true
schema:
default: HCosKfLNW1AcOo3la3mMgg
example: HCosKfLNW1AcOo3la3mMgg
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TimelineResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- timeline
- login-required
- graphql
/zhX91JE87mWvfprhYE97xA/HomeLatestTimeline:
get:
description: get tweet list of timeline
operationId: getHomeLatestTimeline
parameters:
- in: query
name: variables
required: true
schema:
example: '{"count": 20, "includePromotedContent": true, "latestControlAvailable":
true, "requestContext": "launch"}'
type: string
- in: query
name: features
required: true
schema:
example: '{{Features}}'
type: string
- in: query
name: queryId
required: true
schema:
default: zhX91JE87mWvfprhYE97xA
example: zhX91JE87mWvfprhYE97xA
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TimelineResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- timeline
- login-required
- graphql

89
dist/path/user.yaml vendored Normal file
View file

@ -0,0 +1,89 @@
components:
schemas:
UserResponse:
properties:
data:
$ref: '#/components/schemas/UserResponseData'
required:
- data
UserResponseData:
properties:
user:
$ref: ./../schemas/user.yaml#/components/schemas/UserResults
required:
- user
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths:
/sLVLhk0bGj3MVFEKTdax1w/UserByScreenName:
get:
description: get user by screen name
operationId: getUserByScreenName
parameters:
- in: query
name: variables
required: true
schema:
example: '{"screen_name": "elonmusk", "withSafetyModeUserFields": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{"blue_business_profile_image_shape_enabled": true, "responsive_web_graphql_exclude_directive_enabled":
true, "verified_phone_label_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":
false, "responsive_web_graphql_timeline_navigation_enabled": true}'
type: string
- in: query
name: queryId
required: true
schema:
default: sLVLhk0bGj3MVFEKTdax1w
example: sLVLhk0bGj3MVFEKTdax1w
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UserResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- user
- graphql

353
dist/path/usertweets.yaml vendored Normal file
View file

@ -0,0 +1,353 @@
components:
schemas:
UserTweetsData:
properties:
user:
$ref: '#/components/schemas/UserTweetsUser'
required:
- user
UserTweetsResponse:
properties:
data:
$ref: '#/components/schemas/UserTweetsData'
required:
- data
UserTweetsResult:
properties:
__typename:
$ref: ./../schemas/typename.yaml#/components/schemas/TypeName
timeline_v2:
$ref: ./../schemas/timeline.yaml#/components/schemas/TimelineV2
required:
- __typename
- timeline_v2
UserTweetsUser:
properties:
result:
$ref: '#/components/schemas/UserTweetsResult'
required:
- result
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths:
/5fmEkRT-1AdHqEsbVgehMg/Likes:
get:
description: get user likes tweets
operationId: getLikes
parameters:
- in: query
name: variables
required: true
schema:
example: '{"userId": "44196397", "count": 20, "includePromotedContent":
false, "withClientEventToken": false, "withBirdwatchNotes": false, "withVoice":
true, "withV2Timeline": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{"blue_business_profile_image_shape_enabled": true, "responsive_web_graphql_exclude_directive_enabled":
true, "verified_phone_label_enabled": false, "responsive_web_graphql_timeline_navigation_enabled":
true, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":
false, "tweetypie_unmention_optimization_enabled": true, "vibe_api_enabled":
true, "responsive_web_edit_tweet_api_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled":
true, "view_counts_everywhere_api_enabled": true, "longform_notetweets_consumption_enabled":
true, "tweet_awards_web_tipping_enabled": false, "freedom_of_speech_not_reach_fetch_enabled":
false, "standardized_nudges_misinfo": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":
false, "interactive_text_enabled": true, "responsive_web_text_conversations_enabled":
false, "longform_notetweets_rich_text_read_enabled": true, "responsive_web_enhance_cards_enabled":
false}'
type: string
- in: query
name: queryId
required: true
schema:
default: 5fmEkRT-1AdHqEsbVgehMg
example: 5fmEkRT-1AdHqEsbVgehMg
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UserTweetsResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- user
- graphql
/HuTx74BxAnezK1gWvYY7zg/UserTweets:
get:
description: get user tweets
operationId: getUserTweets
parameters:
- in: query
name: variables
required: true
schema:
example: '{"userId": "44196397", "count": 40, "includePromotedContent":
true, "withQuickPromoteEligibilityTweetFields": true, "withVoice": true,
"withV2Timeline": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{"blue_business_profile_image_shape_enabled": true, "responsive_web_graphql_exclude_directive_enabled":
true, "verified_phone_label_enabled": false, "responsive_web_graphql_timeline_navigation_enabled":
true, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":
false, "tweetypie_unmention_optimization_enabled": true, "vibe_api_enabled":
true, "responsive_web_edit_tweet_api_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled":
true, "view_counts_everywhere_api_enabled": true, "longform_notetweets_consumption_enabled":
true, "tweet_awards_web_tipping_enabled": false, "freedom_of_speech_not_reach_fetch_enabled":
false, "standardized_nudges_misinfo": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":
false, "interactive_text_enabled": true, "responsive_web_text_conversations_enabled":
false, "longform_notetweets_rich_text_read_enabled": true, "responsive_web_enhance_cards_enabled":
false}'
type: string
- in: query
name: queryId
required: true
schema:
default: HuTx74BxAnezK1gWvYY7zg
example: HuTx74BxAnezK1gWvYY7zg
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UserTweetsResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- user
- graphql
/RIWc55YCNyUJ-U3HHGYkdg/UserTweetsAndReplies:
get:
description: get user replies tweets
operationId: getUserTweetsAndReplies
parameters:
- in: query
name: variables
required: true
schema:
example: '{"userId": "44196397", "count": 40, "includePromotedContent":
true, "withCommunity": true, "withVoice": true, "withV2Timeline": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{"blue_business_profile_image_shape_enabled": true, "responsive_web_graphql_exclude_directive_enabled":
true, "verified_phone_label_enabled": false, "responsive_web_graphql_timeline_navigation_enabled":
true, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":
false, "tweetypie_unmention_optimization_enabled": true, "vibe_api_enabled":
true, "responsive_web_edit_tweet_api_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled":
true, "view_counts_everywhere_api_enabled": true, "longform_notetweets_consumption_enabled":
true, "tweet_awards_web_tipping_enabled": false, "freedom_of_speech_not_reach_fetch_enabled":
false, "standardized_nudges_misinfo": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":
false, "interactive_text_enabled": true, "responsive_web_text_conversations_enabled":
false, "longform_notetweets_rich_text_read_enabled": true, "responsive_web_enhance_cards_enabled":
false}'
type: string
- in: query
name: queryId
required: true
schema:
default: RIWc55YCNyUJ-U3HHGYkdg
example: RIWc55YCNyUJ-U3HHGYkdg
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UserTweetsResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- user
- graphql
/YqiE3JL1KNgf9nSljYdxaA/UserMedia:
get:
description: get user media tweets
operationId: getUserMedia
parameters:
- in: query
name: variables
required: true
schema:
example: '{"userId": "44196397", "count": 20, "includePromotedContent":
false, "withClientEventToken": false, "withBirdwatchNotes": false, "withVoice":
true, "withV2Timeline": true}'
type: string
- in: query
name: features
required: true
schema:
example: '{"blue_business_profile_image_shape_enabled": true, "responsive_web_graphql_exclude_directive_enabled":
true, "verified_phone_label_enabled": false, "responsive_web_graphql_timeline_navigation_enabled":
true, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":
false, "tweetypie_unmention_optimization_enabled": true, "vibe_api_enabled":
true, "responsive_web_edit_tweet_api_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled":
true, "view_counts_everywhere_api_enabled": true, "longform_notetweets_consumption_enabled":
true, "tweet_awards_web_tipping_enabled": false, "freedom_of_speech_not_reach_fetch_enabled":
false, "standardized_nudges_misinfo": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":
false, "interactive_text_enabled": true, "responsive_web_text_conversations_enabled":
false, "longform_notetweets_rich_text_read_enabled": true, "responsive_web_enhance_cards_enabled":
false}'
type: string
- in: query
name: queryId
required: true
schema:
default: YqiE3JL1KNgf9nSljYdxaA
example: YqiE3JL1KNgf9nSljYdxaA
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UserTweetsResponse'
description: Successful operation
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer
tags:
- user
- graphql

105
dist/schemas/content.yaml vendored Normal file
View file

@ -0,0 +1,105 @@
components:
schemas:
ContentEntryType:
enum:
- TimelineTimelineItem
- TimelineTimelineCursor
- TimelineTimelineModule
type: string
ContentItemType:
enum:
- TimelineTweet
type: string
ContentUnion:
discriminator:
mapping":
TimelineTimelineCursor: '#/components/schemas/TimelineTimelineCursor'
TimelineTimelineItem: '#/components/schemas/TimelineTimelineItem'
TimelineTimelineModule: '#/components/schemas/TimelineTimelineModule'
propertyName: entryType
oneOf:
- $ref: '#/components/schemas/TimelineTimelineItem'
- $ref: '#/components/schemas/TimelineTimelineCursor'
- $ref: '#/components/schemas/TimelineTimelineModule'
ItemContent:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
itemType:
$ref: '#/components/schemas/ContentItemType'
type: string
socialContext:
properties:
contextType:
type: string
text:
type: string
type:
type: string
type: object
tweetDisplayType:
type: string
tweet_results:
$ref: '#/components/schemas/ItemResult'
required:
- __typename
- itemType
- tweetDisplayType
- tweet_results
ItemResult:
properties:
result:
$ref: ./tweet.yaml#/components/schemas/TweetUnion
required:
- result
TimelineTimelineCursor:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
cursorType:
enum:
- Top
- Bottom
type: string
entryType:
$ref: '#/components/schemas/ContentEntryType'
type: string
value:
type: string
required:
- __typename
- entryType
- cursorType
- value
TimelineTimelineItem:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
clientEventInfo:
type: object
entryType:
$ref: '#/components/schemas/ContentEntryType'
type: string
feedbackInfo:
type: object
itemContent:
$ref: '#/components/schemas/ItemContent'
required:
- __typename
- entryType
- itemContent
TimelineTimelineModule:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
entryType:
$ref: '#/components/schemas/ContentEntryType'
type: string
required:
- __typename
- entryType
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

13
dist/schemas/general.yaml vendored Normal file
View file

@ -0,0 +1,13 @@
components:
schemas:
TwitterTimeFormat:
example: Sat Dec 31 23:59:59 +0000 2023
pattern: ^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])
([+-][0-9]{4}) ([0-9]{4})$
type: string
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

67
dist/schemas/instruction.yaml vendored Normal file
View file

@ -0,0 +1,67 @@
components:
schemas:
InstructionType:
enum:
- TimelineAddEntries
- TimelineClearCache
- TimelinePinEntry
type: string
InstructionUnion:
discriminator:
mapping":
TimelineAddEntries: '#/components/schemas/TimelineAddEntries'
TimelineClearCache: '#/components/schemas/TimelineClearCache'
TimelinePinEntry: '#/components/schemas/TimelinePinEntry'
propertyName: type
oneOf:
- $ref: '#/components/schemas/TimelineAddEntries'
- $ref: '#/components/schemas/TimelineClearCache'
- $ref: '#/components/schemas/TimelinePinEntry'
TimelineAddEntries:
properties:
entries:
items:
$ref: '#/components/schemas/TimelineAddEntry'
type: array
type:
$ref: '#/components/schemas/InstructionType'
type: string
required:
- type
- entries
TimelineAddEntry:
properties:
content:
$ref: ./content.yaml#/components/schemas/ContentUnion
entryId:
pattern: ^[a-z\-]+[0-9]+$
type: string
sortIndex:
pattern: '[0-9]+$'
type: string
required:
- content
- entryId
- sortIndex
TimelineClearCache:
properties:
type:
$ref: '#/components/schemas/InstructionType'
type: string
required:
- type
TimelinePinEntry:
properties:
entry:
$ref: '#/components/schemas/TimelineAddEntry'
type:
$ref: '#/components/schemas/InstructionType'
type: string
required:
- type
- entry
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

25
dist/schemas/timeline.yaml vendored Normal file
View file

@ -0,0 +1,25 @@
components:
schemas:
Timeline:
properties:
instructions:
items:
$ref: ./../schemas/instruction.yaml#/components/schemas/InstructionUnion
type: array
metadata:
type: object
responseObjects:
type: object
required:
- instructions
TimelineV2:
properties:
timeline:
$ref: '#/components/schemas/Timeline'
required:
- timeline
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

145
dist/schemas/tweet.yaml vendored Normal file
View file

@ -0,0 +1,145 @@
components:
schemas:
Tweet:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
core:
$ref: ./user.yaml#/components/schemas/UserResultCore
edit_control:
properties:
edit_tweet_ids:
items:
pattern: ^[0-9]+$
type: string
type: array
editable_until_msecs:
pattern: ^[0-9]+$
type: string
edits_remaining:
pattern: ^[0-9]+$
type: string
is_edit_eligible:
type: boolean
type: object
edit_prespective:
properties:
favorited:
type: boolean
retweeted:
type: boolean
type: object
is_translatable:
default: false
type: boolean
legacy:
$ref: '#/components/schemas/TweetLegacy'
rest_id:
pattern: ^[0-9]+$
type: string
unmention_data:
type: object
views:
properties:
count:
pattern: ^[0-9]+$
type: string
state:
type: string
type: object
required:
- rest_id
- core
- edit_control
- edit_prespective
- is_translatable
- legacy
- views
TweetLegacy:
properties:
bookmark_count:
type: integer
bookmarked:
type: boolean
conversation_id_str:
pattern: ^[0-9]+$
type: string
created_at:
$ref: ./general.yaml#/components/schemas/TwitterTimeFormat
display_text_range:
items:
type: integer
type: array
entities:
type: object
favorite_count:
type: integer
favorited:
type: boolean
full_text:
type: string
id_str:
pattern: ^[0-9]+$
type: string
is_quote_status:
type: boolean
lang:
type: string
possibly_sensitive:
default: false
type: boolean
possibly_sensitive_editable:
default: false
type: boolean
quote_count:
type: integer
reply_count:
type: integer
retweet_count:
type: integer
retweeted:
type: boolean
user_id_str:
pattern: ^[0-9]+$
type: string
required:
- bookmark_count
- bookmarked
- conversation_id_str
- created_at
- display_text_range
- entities
- favorite_count
- favorited
- full_text
- is_quote_status
- lang
- quote_count
- reply_count
- retweet_count
- retweeted
- user_id_str
- id_str
TweetUnion:
discriminator:
mapping":
Tweet: '#/components/schemas/Tweet'
TweetWithVisibilityResults: '#/components/schemas/TweetWithVisibilityResults'
propertyName: __typename
oneOf:
- $ref: '#/components/schemas/Tweet'
- $ref: '#/components/schemas/TweetWithVisibilityResults'
TweetWithVisibilityResults:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
tweet:
$ref: '#/components/schemas/Tweet'
required:
- __typename
- tweet
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

17
dist/schemas/typename.yaml vendored Normal file
View file

@ -0,0 +1,17 @@
components:
schemas:
TypeName:
enum:
- TimelineTweet
- TimelineTimelineItem
- TimelineTimelineCursor
- TweetWithVisibilityResults
- TimelineTimelineModule
- Tweet
- User
type: string
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

214
dist/schemas/user.yaml vendored Normal file
View file

@ -0,0 +1,214 @@
components:
schemas:
User:
properties:
__typename:
$ref: ./typename.yaml#/components/schemas/TypeName
affiliates_highlighted_label:
type: object
business_account:
type: object
has_graduated_access:
type: boolean
has_nft_avatar:
default: false
type: boolean
id:
pattern: ^[a-z\-]+[0-9]+$
type: string
is_blue_verified:
default: false
type: boolean
legacy:
$ref: '#/components/schemas/UserLegacy'
rest_id:
pattern: ^[0-9]+$
type: string
super_follow_eligible:
default: false
type: boolean
super_followed_by:
default: false
type: boolean
super_following:
default: false
type: boolean
required:
- __typename
- affiliates_highlighted_label
- has_graduated_access
- id
- is_blue_verified
- legacy
- rest_id
- super_follow_eligible
- super_followed_by
- super_following
UserLegacy:
properties:
blocked_by:
default: false
type: boolean
blocking:
default: false
type: boolean
can_dm:
default: false
type: boolean
can_media_tag:
default: false
type: boolean
created_at:
$ref: ./general.yaml#/components/schemas/TwitterTimeFormat
default_profile:
default: false
type: boolean
default_profile_image:
default: false
type: boolean
description:
type: string
entities:
type: object
fast_followers_count:
type: integer
favourites_count:
default: 0
type: integer
follow_request_sent:
default: false
type: boolean
followed_by:
default: false
type: boolean
followers_count:
default: 0
type: integer
following:
default: false
type: boolean
friends_count:
default: 0
type: integer
has_custom_timelines:
default: false
type: boolean
is_translator:
default: false
type: boolean
listed_count:
default: 0
type: integer
location:
type: string
media_count:
default: 0
type: integer
muting:
default: false
type: boolean
name:
type: string
normal_followers_count:
default: 0
type: integer
notifications:
default: false
type: boolean
pinned_tweet_ids_str:
items:
type: string
type: array
possibly_sensitive:
default: false
type: boolean
profile_banner_extensions:
type: object
profile_banner_url:
format: uri
type: string
profile_image_extensions:
type: object
profile_image_url_https:
format: uri
type: string
profile_interstitial_type:
type: string
protected:
default: false
type: boolean
screen_name:
type: string
statuses_count:
default: 0
type: integer
translator_type:
type: string
url:
type: string
verified:
type: boolean
want_retweets:
default: false
type: boolean
required:
- blocked_by
- blocking
- can_dm
- can_media_tag
- created_at
- default_profile
- default_profile_image
- description
- entities
- fast_followers_count
- favourites_count
- follow_request_sent
- followed_by
- followers_count
- following
- friends_count
- has_custom_timelines
- is_translator
- listed_count
- location
- media_count
- muting
- name
- normal_followers_count
- notifications
- pinned_tweet_ids_str
- possibly_sensitive
- profile_image_url_https
- profile_interstitial_type
- protected
- screen_name
- status
- statuses_count
- translator_type
- verified
- want_retweets
UserResultCore:
properties:
user_results:
$ref: '#/components/schemas/UserResults'
required:
- user_results
UserResults:
properties:
result:
$ref: '#/components/schemas/UserUnion'
required:
- result
UserUnion:
discriminator:
mapping":
User: '#/components/schemas/User'
propertyName: __typename
oneOf:
- $ref: '#/components/schemas/User'
info:
title: Twitter OpenAPI
version: 0.0.1
openapi: 3.0.3
paths: {}

File diff suppressed because it is too large Load diff

BIN
requirements.txt Normal file

Binary file not shown.

41
src/config/header.yaml Normal file
View file

@ -0,0 +1,41 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
headers:
x-connection-hash:
schema:
type: string
x-content-type-options:
schema:
type: string
x-frame-options:
schema:
type: string
x-rate-limit-limit:
schema:
type: integer
x-rate-limit-remaining:
schema:
type: integer
x-rate-limit-reset:
schema:
type: integer
x-response-time:
schema:
type: integer
x-tfe-preserve-body:
schema:
type: boolean
x-transaction-id:
schema:
type: string
x-twitter-response-tags:
schema:
type: string
x-xss-protection:
schema:
type: integer

View file

@ -0,0 +1,30 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths:
/parameters:
get:
parameters:
- name: variables
in: query
required: true
schema:
type: string
example: "{{Variables}}"
- name: features
in: query
required: true
schema:
type: string
example: "{{Features}}"
- name: queryId
in: query
required: true
schema:
type: string
default: "{{Query}}"
example: "{{Query}}"
responses:
"200":
description: ""

234
src/config/placeholder.json Normal file
View file

@ -0,0 +1,234 @@
{
"HomeTimeline": {
"Query": "HCosKfLNW1AcOo3la3mMgg",
"Variables": {
"count": 40,
"includePromotedContent": true,
"latestControlAvailable": true,
"withCommunity": true
},
"Feature": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"HomeLatestTimeline": {
"Query": "zhX91JE87mWvfprhYE97xA",
"Variables": {
"count": 20,
"includePromotedContent": true,
"latestControlAvailable": true,
"requestContext": "launch"
},
"Feature": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"ListLatestTweetsTimeline": {
"Query": "2TemLyqrMpTeAmysdbnVqw",
"Variables": {
"listId": "53044119",
"count": 20
},
"Feature": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"UserByScreenName": {
"Query": "sLVLhk0bGj3MVFEKTdax1w",
"Variables": {
"screen_name": "elonmusk",
"withSafetyModeUserFields": true
},
"Features": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true
}
},
"UserTweets": {
"Query": "HuTx74BxAnezK1gWvYY7zg",
"Variables": {
"userId": "44196397",
"count": 40,
"includePromotedContent": true,
"withQuickPromoteEligibilityTweetFields": true,
"withVoice": true,
"withV2Timeline": true
},
"Features": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"UserTweetsAndReplies": {
"Query": "RIWc55YCNyUJ-U3HHGYkdg",
"Variables": {
"userId": "44196397",
"count": 40,
"includePromotedContent": true,
"withCommunity": true,
"withVoice": true,
"withV2Timeline": true
},
"Features": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"UserMedia": {
"Query": "YqiE3JL1KNgf9nSljYdxaA",
"Variables": {
"userId": "44196397",
"count": 20,
"includePromotedContent": false,
"withClientEventToken": false,
"withBirdwatchNotes": false,
"withVoice": true,
"withV2Timeline": true
},
"Features": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
},
"Likes": {
"Query": "5fmEkRT-1AdHqEsbVgehMg",
"Variables": {
"userId": "44196397",
"count": 20,
"includePromotedContent": false,
"withClientEventToken": false,
"withBirdwatchNotes": false,
"withVoice": true,
"withV2Timeline": true
},
"Features": {
"blue_business_profile_image_shape_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"tweetypie_unmention_optimization_enabled": true,
"vibe_api_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": false,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
"interactive_text_enabled": true,
"responsive_web_text_conversations_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
}
}

View file

@ -0,0 +1,94 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
description: |-
Twitter OpenAPI(Swagger) specification
termsOfService: https://github.com/fa0311
contact:
email: yuki@yuki0311.com
license:
name: GNU Affero General Public License v3.
url: https://raw.githubusercontent.com/fa0311/twitter-openapi/main/LICENSE.txt
version: 0.0.1
servers:
- url: https://twitter.com/i/api/graphql
paths: {}
components:
schemas: {}
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
CsrfToken:
type: apiKey
in: header
name: x-csrf-token
ActiveUser:
type: apiKey
in: header
name: x-twitter-active-user
description: "yes"
AuthType:
type: apiKey
in: header
name: x-twitter-auth-type
description: "OAuth2Session"
ClientLanguage:
type: apiKey
in: header
name: x-twitter-client-language
description: "en"
CookieAuthToken:
type: apiKey
in: cookie
name: auth_token
CookieCt0:
type: apiKey
in: cookie
name: ct0
tags:
- name: timeline
description: timeline
- name: tweet
description: tweet
- name: user
description: user
- name: follow
description: follow
- name: search
description: search
- name: dm
description: dm
- name: settings
description: settings
- name: notify
description: notify
# ===
- name: login required
description: login session required
- name: graphql
description: graphql
- name: login-flow
description: login flow
- name: report-flow
description: report flow
security:
- bearerAuth: []
- CsrfToken: []
- ActiveUser: []
- AuthType: []
- ClientLanguage: []
- CookieAuthToken: []
- CookieCt0: []

View file

@ -0,0 +1,27 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths:
/{{FollowingQuery}}/Following:
get:
operationId: getFollowers
description: get user list of followers
responses:
"200":
description: Successful operation
tags:
- "follow"
- "graphql"
/{{FollowersQuery}}/Followers:
get:
operationId: getFollowing
description: get user list of following
responses:
"200":
description: Successful operation
tags:
- "follow"
- "graphql"

View file

@ -0,0 +1,104 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths:
/{{HomeTimelineQuery}}/HomeTimeline:
get:
operationId: getHomeTimeline
description: get tweet list of timeline
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/TimelineResponse"
tags:
- "timeline"
- "login-required"
- "graphql"
/{{HomeLatestTimelineQuery}}/HomeLatestTimeline:
get:
operationId: getHomeLatestTimeline
description: get tweet list of timeline
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/TimelineResponse"
tags:
- "timeline"
- "login-required"
- "graphql"
/{{ListLatestTweetsTimelineQuery}}/ListLatestTweetsTimeline:
get:
operationId: getListLatestTweetsTimeline
description: get tweet list of timeline
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/ListTweetsTimelineResponse"
tags:
- "timeline"
- "login-required"
- "graphql"
components:
schemas:
TimelineResponse:
required:
- "data"
properties:
data:
$ref: "#/components/schemas/HomeTimelineResponseData"
HomeTimelineResponseData:
required:
- "home"
properties:
home:
$ref: "#/components/schemas/HomeTimelineHome"
HomeTimelineHome:
required:
- "home_timeline_urt"
properties:
home_timeline_urt:
$ref: "./../schemas/timeline.yaml#/components/schemas/Timeline"
ListTweetsTimelineResponse:
required:
- "data"
properties:
data:
$ref: "#/components/schemas/ListTweetsTimelineData"
ListTweetsTimelineData:
required:
- "list"
properties:
home:
$ref: "#/components/schemas/ListTweetsTimelineList"
ListTweetsTimelineList:
required:
- "tweets_timeline"
properties:
tweets_timeline:
$ref: "#/components/schemas/ListTweetsTimeline"
ListTweetsTimeline:
required:
- "timeline"
properties:
timeline:
$ref: "./../schemas/timeline.yaml#/components/schemas/Timeline"

View file

@ -0,0 +1,36 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths:
/{{UserByScreenNameQuery}}/UserByScreenName:
get:
operationId: getUserByScreenName
description: "get user by screen name"
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UserResponse"
tags:
- "user"
- "graphql"
components:
schemas:
UserResponse:
required:
- "data"
properties:
data:
$ref: "#/components/schemas/UserResponseData"
UserResponseData:
required:
- "user"
properties:
user:
$ref: "./../schemas/user.yaml#/components/schemas/UserResults"

View file

@ -0,0 +1,98 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths:
/{{UserTweetsQuery}}/UserTweets:
get:
operationId: getUserTweets
description: "get user tweets"
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UserTweetsResponse"
tags:
- "user"
- "graphql"
/{{UserTweetsAndRepliesQuery}}/UserTweetsAndReplies:
get:
operationId: getUserTweetsAndReplies
description: "get user replies tweets"
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UserTweetsResponse"
tags:
- "user"
- "graphql"
/{{UserMediaQuery}}/UserMedia:
get:
operationId: getUserMedia
description: "get user media tweets"
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UserTweetsResponse"
tags:
- "user"
- "graphql"
/{{LikesQuery}}/Likes:
get:
operationId: getLikes
description: "get user likes tweets"
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UserTweetsResponse"
tags:
- "user"
- "graphql"
components:
schemas:
UserTweetsResponse:
required:
- "data"
properties:
data:
$ref: "#/components/schemas/UserTweetsData"
UserTweetsData:
required:
- "user"
properties:
user:
$ref: "#/components/schemas/UserTweetsUser"
UserTweetsUser:
required:
- "result"
properties:
result:
$ref: "#/components/schemas/UserTweetsResult"
UserTweetsResult:
required:
- "__typename"
- "timeline_v2"
properties:
__typename:
$ref: "./../schemas/typename.yaml#/components/schemas/TypeName" # User
timeline_v2:
$ref: "./../schemas/timeline.yaml#/components/schemas/TimelineV2"

View file

@ -0,0 +1,110 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
ContentUnion:
oneOf:
- $ref: "#/components/schemas/TimelineTimelineItem"
- $ref: "#/components/schemas/TimelineTimelineCursor"
- $ref: "#/components/schemas/TimelineTimelineModule"
discriminator:
propertyName: entryType
mapping": # deprecated
TimelineTimelineItem: "#/components/schemas/TimelineTimelineItem"
TimelineTimelineCursor: "#/components/schemas/TimelineTimelineCursor"
TimelineTimelineModule: "#/components/schemas/TimelineTimelineModule"
ContentEntryType:
type: string
enum:
[TimelineTimelineItem, TimelineTimelineCursor, TimelineTimelineModule]
TimelineTimelineItem:
required:
- "__typename"
- "entryType"
- "itemContent"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineItem
entryType:
type: string # enum
$ref: "#/components/schemas/ContentEntryType" # TimelineTimelineItem
itemContent:
$ref: "#/components/schemas/ItemContent"
clientEventInfo:
type: object # todo
feedbackInfo:
type: object # todo
TimelineTimelineCursor:
required:
- "__typename"
- "entryType"
- "cursorType"
- "value"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineCursor
entryType:
type: string # enum
$ref: "#/components/schemas/ContentEntryType" # TimelineTimelineCursor
cursorType:
type: string
enum: [Top, Bottom]
value:
type: string
TimelineTimelineModule:
required:
- "__typename"
- "entryType"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineModule
entryType:
type: string # enum
$ref: "#/components/schemas/ContentEntryType" # TimelineTimelineCursor
# ================= ContentItem =================
ContentItemType:
type: string
enum: [TimelineTweet]
ItemContent:
required:
- "__typename"
- "itemType"
- "tweetDisplayType"
- "tweet_results"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTweet
itemType:
type: string # enum
$ref: "#/components/schemas/ContentItemType" # TimelineTweet
tweetDisplayType:
type: string
tweet_results:
$ref: "#/components/schemas/ItemResult"
socialContext:
type: object
properties:
contextType:
type: string # enum
text:
type: string
type:
type: string # enum
ItemResult:
required:
- "result"
properties:
result:
$ref: "./tweet.yaml#/components/schemas/TweetUnion"

View file

@ -0,0 +1,12 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
TwitterTimeFormat:
type: string
pattern: "^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) ([+-][0-9]{4}) ([0-9]{4})$"
example: "Sat Dec 31 23:59:59 +0000 2023"

View file

@ -0,0 +1,70 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
InstructionUnion:
oneOf:
- $ref: "#/components/schemas/TimelineAddEntries"
- $ref: "#/components/schemas/TimelineClearCache"
- $ref: "#/components/schemas/TimelinePinEntry"
discriminator:
propertyName: type
mapping": # deprecated
TimelineAddEntries: "#/components/schemas/TimelineAddEntries"
TimelineClearCache: "#/components/schemas/TimelineClearCache"
TimelinePinEntry: "#/components/schemas/TimelinePinEntry"
InstructionType:
type: string
enum: [TimelineAddEntries, TimelineClearCache, TimelinePinEntry]
TimelineAddEntries:
required:
- type
- entries
properties:
type:
type: string
$ref: "#/components/schemas/InstructionType" # TimelineAddEntries
entries:
type: array
items:
$ref: "#/components/schemas/TimelineAddEntry"
TimelineClearCache:
required:
- type
properties:
type:
type: string
$ref: "#/components/schemas/InstructionType" # TimelineClearCache
TimelinePinEntry:
required:
- type
- entry
properties:
type:
type: string
$ref: "#/components/schemas/InstructionType" # TimelinePinEntry
entry:
$ref: "#/components/schemas/TimelineAddEntry"
TimelineAddEntry:
required:
- "content"
- "entryId"
- "sortIndex"
properties:
content:
$ref: "./content.yaml#/components/schemas/ContentUnion"
entryId:
type: string
pattern: '^[a-z\-]+[0-9]+$'
sortIndex:
type: string
pattern: "[0-9]+$"

View file

@ -0,0 +1,27 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
TimelineV2:
required:
- "timeline"
properties:
timeline:
$ref: "#/components/schemas/Timeline"
Timeline:
required:
- "instructions"
properties:
instructions:
type: array
items:
$ref: "./../schemas/instruction.yaml#/components/schemas/InstructionUnion"
metadata:
type: object # todo
responseObjects:
type: object # todo

View file

@ -0,0 +1,152 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
TweetUnion:
oneOf:
- $ref: "#/components/schemas/Tweet"
- $ref: "#/components/schemas/TweetWithVisibilityResults"
discriminator:
propertyName: __typename
mapping": # deprecated
Tweet: "#/components/schemas/Tweet"
TweetWithVisibilityResults: "#/components/schemas/TweetWithVisibilityResults"
TweetWithVisibilityResults:
required:
- "__typename"
- "tweet"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TweetWithVisibilityResults
tweet:
$ref: "#/components/schemas/Tweet"
Tweet:
required:
# - "__typename"
- "rest_id"
- "core"
- "edit_control"
- "edit_prespective"
- "is_translatable"
- "legacy"
- "views"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # Tweet
rest_id:
type: string
pattern: "^[0-9]+$"
core:
$ref: "./user.yaml#/components/schemas/UserResultCore"
unmention_data:
type: object # todo
edit_control:
type: object
properties:
edit_tweet_ids:
type: array
items:
type: string
pattern: "^[0-9]+$"
editable_until_msecs:
type: string
pattern: "^[0-9]+$"
is_edit_eligible:
type: boolean
edits_remaining:
type: string
pattern: "^[0-9]+$"
edit_prespective:
type: object
properties:
favorited:
type: boolean
retweeted:
type: boolean
is_translatable:
type: boolean
default: false
legacy:
$ref: "#/components/schemas/TweetLegacy"
views:
type: object
properties:
count:
type: string
pattern: "^[0-9]+$"
state:
type: string # enum
TweetLegacy:
required:
- "bookmark_count"
- "bookmarked"
- "conversation_id_str"
- "created_at"
- "display_text_range"
- "entities"
- "favorite_count"
- "favorited"
- "full_text"
- "is_quote_status"
- "lang"
- "quote_count"
- "reply_count"
- "retweet_count"
- "retweeted"
- "user_id_str"
- "id_str"
properties:
bookmark_count:
type: integer
bookmarked:
type: boolean
created_at:
$ref: "./general.yaml#/components/schemas/TwitterTimeFormat"
conversation_id_str:
type: string
pattern: "^[0-9]+$"
display_text_range:
type: array
items:
type: integer
entities:
type: object
favorite_count:
type: integer
favorited:
type: boolean
full_text:
type: string
is_quote_status:
type: boolean
lang:
type: string # enum
possibly_sensitive:
type: boolean
default: false
possibly_sensitive_editable:
type: boolean
default: false
quote_count:
type: integer
reply_count:
type: integer
retweet_count:
type: integer
retweeted:
type: boolean
user_id_str:
type: string
pattern: "^[0-9]+$"
id_str:
type: string
pattern: "^[0-9]+$"

View file

@ -0,0 +1,19 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
TypeName:
type: string
enum:
[
TimelineTweet,
TimelineTimelineItem,
TimelineTimelineCursor,
TweetWithVisibilityResults,
TimelineTimelineModule,
Tweet,
User,
]

View file

@ -0,0 +1,219 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
UserResultCore:
required:
- "user_results"
properties:
user_results:
$ref: "#/components/schemas/UserResults"
UserResults:
required:
- "result"
properties:
result:
$ref: "#/components/schemas/UserUnion"
UserUnion:
oneOf:
- $ref: "#/components/schemas/User"
discriminator:
propertyName: __typename
mapping": # deprecated
User: "#/components/schemas/User"
User:
required:
- "__typename"
- "affiliates_highlighted_label"
- "has_graduated_access"
- "id"
- "is_blue_verified"
- "legacy"
- "rest_id"
- "super_follow_eligible"
- "super_followed_by"
- "super_following"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # User
affiliates_highlighted_label:
type: object # todo
has_graduated_access:
type: boolean
has_nft_avatar:
type: boolean
default: false
id:
type: string
pattern: '^[a-z\-]+[0-9]+$'
is_blue_verified:
type: boolean
default: false
legacy:
$ref: "#/components/schemas/UserLegacy"
rest_id:
type: string
pattern: "^[0-9]+$"
business_account:
type: object # todo
super_follow_eligible:
type: boolean
default: false
super_followed_by:
type: boolean
default: false
super_following:
type: boolean
default: false
UserLegacy:
required:
- "blocked_by"
- "blocking"
- "can_dm"
- "can_media_tag"
- "created_at"
- "default_profile"
- "default_profile_image"
- "description"
- "entities"
- "fast_followers_count"
- "favourites_count"
- "follow_request_sent"
- "followed_by"
- "followers_count"
- "following"
- "friends_count"
- "has_custom_timelines"
- "is_translator"
- "listed_count"
- "location"
- "media_count"
- "muting"
- "name"
- "normal_followers_count"
- "notifications"
- "pinned_tweet_ids_str"
- "possibly_sensitive"
- "profile_image_url_https"
- "profile_interstitial_type"
- "protected"
- "screen_name"
- "status"
- "statuses_count"
- "translator_type"
- "verified"
- "want_retweets"
properties:
blocked_by:
type: boolean
default: false
blocking:
type: boolean
default: false
can_dm:
type: boolean
default: false
can_media_tag:
type: boolean
default: false
created_at:
$ref: "./general.yaml#/components/schemas/TwitterTimeFormat"
default_profile:
type: boolean
default: false
default_profile_image:
type: boolean
default: false
description:
type: string
entities:
type: object # todo
fast_followers_count:
type: integer
favourites_count:
type: integer
default: 0
follow_request_sent:
type: boolean
default: false
followed_by:
type: boolean
default: false
followers_count:
type: integer
default: 0
following:
type: boolean
default: false
friends_count:
type: integer
default: 0
has_custom_timelines:
type: boolean
default: false
is_translator:
type: boolean
default: false
listed_count:
type: integer
default: 0
location:
type: string
media_count:
type: integer
default: 0
muting:
type: boolean
default: false
name:
type: string
normal_followers_count:
type: integer
default: 0
notifications:
type: boolean
default: false
pinned_tweet_ids_str:
type: array
items:
type: string
possibly_sensitive:
type: boolean
default: false
profile_banner_extensions:
type: object
profile_banner_url:
type: string
format: uri
profile_image_extensions:
type: object
profile_image_url_https:
type: string
format: uri
profile_interstitial_type:
type: string
protected:
type: boolean
default: false
screen_name:
type: string
statuses_count:
type: integer
default: 0
translator_type:
type: string
url:
type: string
verified:
type: boolean
want_retweets:
type: boolean
default: false

92
tools/build.py Normal file
View file

@ -0,0 +1,92 @@
import os
import glob
import json
import yaml
import shutil
class placeholder_manager:
data: dict
config: str = "src/config/placeholder.json"
def __init__(self):
with open(self.config, mode="r", encoding="utf-8") as f:
self.data = json.load(f)
def __replace(self, file, old: str, new) -> str:
if type(new) is dict:
dump = f"'{json.dumps(new)}'"
return file.replace(f'"{old}"', dump)
else:
return file.replace(f"{old}", new)
def replace(self, file: str) -> str:
for prefix in self.data.keys():
for key in self.data[prefix]:
value = self.data[prefix][key]
file = self.__replace(file, f"{{{{{prefix}{key}}}}}", value)
return file
def replace_file(self, file: str, prefix: str) -> str:
if self.data.get(prefix, None) is None:
return file
for key in self.data[prefix].keys():
value = self.data[prefix][key]
file = self.__replace(file, f"{{{{{key}}}}}", value)
return file
OUTPUT_DIR = "dist"
INPUT_DIR = "src/openapi"
def read(file: str):
with open(file, mode="r", encoding="utf-8") as f:
return f.read()
def write(file: str, data: str) -> None:
with open(file.replace(INPUT_DIR, OUTPUT_DIR, 1), mode="w+", encoding="utf-8") as f:
f.write(data)
def get_yaml(data, key):
return yaml.safe_load(placeholder.replace_file(str(data), key))
shutil.rmtree("dist")
for dir in glob.glob(os.path.join(INPUT_DIR, "**/")):
os.makedirs(dir.replace(INPUT_DIR, OUTPUT_DIR, 1), exist_ok=True)
placeholder = placeholder_manager()
parameters = read("src/config/parameters.yaml")
header = read("src/config/header.yaml")
paths = {}
for file in glob.glob(os.path.join(INPUT_DIR, "**/*.yaml")):
file = file.replace(os.path.sep, "/")
relative = file.replace(INPUT_DIR, "", 1)
load = yaml.safe_load(placeholder.replace(read(file)))
for key in load["paths"].keys():
append = get_yaml(parameters, key.split("/")[-1])
req = load["paths"][key]["get"]
req["parameters"] = append["paths"]["/parameters"]["get"]["parameters"]
append = get_yaml(header, key.split("/")[-1])
req = load["paths"][key]["get"]
req["responses"]["200"]["headers"] = append["components"]["headers"]
escape = key.replace("/", "~1")
paths.update({key: {"$ref": f".{relative}#/paths/{escape}"}})
write(file, yaml.dump(load))
file = "src/openapi/openapi-3.0.yaml"
data = read(file)
for path in paths:
load = yaml.safe_load(placeholder.replace(data))
load["paths"] = paths
write(file, yaml.dump(load))