twitter-openapi-python 0.0.22__py3-none-any.whl → 0.0.24__py3-none-any.whl

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.
@@ -24,7 +24,8 @@ class InitialStateApiUtils:
24
24
  }
25
25
 
26
26
  def request(self, url: str) -> HTTPResponse:
27
- return self.api.rest_client.get_request(
27
+ return self.api.rest_client.request(
28
+ "GET",
28
29
  url=url,
29
30
  headers=self.header,
30
31
  )
@@ -4,7 +4,7 @@ import twitter_openapi_python_generated as twitter
4
4
  import twitter_openapi_python_generated.models as models
5
5
 
6
6
  from twitter_openapi_python.models import TwitterApiUtilsResponse
7
- from twitter_openapi_python.utils import build_response, check_error
7
+ from twitter_openapi_python.utils import build_response, check_error, non_nullable
8
8
 
9
9
  T = TypeVar("T")
10
10
  ResponseType = TwitterApiUtilsResponse[T]
@@ -31,21 +31,44 @@ class PostApiUtils:
31
31
  self,
32
32
  tweet_text: str,
33
33
  media_ids: Optional[list[str]] = None,
34
+ tagged_users: Optional[list[list[str]]] = None,
35
+ in_reply_to_tweet_id: Optional[str] = None,
36
+ attachment_url: Optional[str] = None,
37
+ conversation_control: Optional[str] = None,
34
38
  ) -> ResponseType[models.CreateTweetResponse]:
35
- variables = twitter.PostCreateTweetRequestVariables.from_dict(
36
- self.flag["CreateTweet"]["variables"]
39
+ variables = non_nullable(
40
+ twitter.PostCreateTweetRequestVariables.from_dict(
41
+ self.flag["CreateTweet"]["variables"]
42
+ )
37
43
  )
38
- features = twitter.PostCreateTweetRequestFeatures.from_dict(
39
- self.flag["CreateTweet"]["features"]
44
+ features = non_nullable(
45
+ twitter.PostCreateTweetRequestFeatures.from_dict(
46
+ self.flag["CreateTweet"]["features"]
47
+ )
40
48
  )
41
49
  variables.tweet_text = tweet_text
42
- variables.media.media_entities = [
43
- twitter.PostCreateTweetRequestVariablesMediaMediaEntitiesInner(
44
- media_id=media_id,
45
- tagged_users=[],
50
+ if media_ids:
51
+ tagged_or = tagged_users or []
52
+ variables.media.media_entities = [
53
+ twitter.PostCreateTweetRequestVariablesMediaMediaEntitiesInner(
54
+ media_id=media_id,
55
+ tagged_users=tagged_or[idx] if len(tagged_or) > idx else [],
56
+ )
57
+ for idx, media_id in enumerate(media_ids)
58
+ ]
59
+ variables.attachment_url = attachment_url
60
+ if conversation_control:
61
+ variables.conversation_control = (
62
+ twitter.PostCreateTweetRequestVariablesConversationControl(
63
+ mode=conversation_control
64
+ )
65
+ )
66
+
67
+ if in_reply_to_tweet_id:
68
+ variables.reply = twitter.PostCreateTweetRequestVariablesReply(
69
+ exclude_reply_user_ids=[],
70
+ in_reply_to_tweet_id=in_reply_to_tweet_id,
46
71
  )
47
- for media_id in media_ids or []
48
- ]
49
72
 
50
73
  res = self.api.post_create_tweet_with_http_info(
51
74
  path_query_id=self.flag["CreateTweet"]["queryId"],
@@ -62,8 +85,10 @@ class PostApiUtils:
62
85
  self,
63
86
  tweet_id: str,
64
87
  ) -> ResponseType[models.DeleteTweetResponse]:
65
- variables = twitter.PostCreateRetweetRequestVariables.from_dict(
66
- self.flag["DeleteTweet"]["variables"]
88
+ variables = non_nullable(
89
+ twitter.PostCreateRetweetRequestVariables.from_dict(
90
+ self.flag["DeleteTweet"]["variables"]
91
+ )
67
92
  )
68
93
  variables.tweet_id = tweet_id
69
94
 
@@ -81,8 +106,10 @@ class PostApiUtils:
81
106
  self,
82
107
  tweet_id: str,
83
108
  ) -> ResponseType[models.CreateRetweetResponse]:
84
- variables = twitter.PostCreateRetweetRequestVariables.from_dict(
85
- self.flag["CreateRetweet"]["variables"]
109
+ variables = non_nullable(
110
+ twitter.PostCreateRetweetRequestVariables.from_dict(
111
+ self.flag["CreateRetweet"]["variables"]
112
+ )
86
113
  )
87
114
  variables.tweet_id = tweet_id
88
115
 
@@ -100,8 +127,10 @@ class PostApiUtils:
100
127
  self,
101
128
  source_tweet_id: str,
102
129
  ) -> ResponseType[models.DeleteRetweetResponse]:
103
- variables = twitter.PostDeleteRetweetRequestVariables.from_dict(
104
- self.flag["DeleteRetweet"]["variables"]
130
+ variables = non_nullable(
131
+ twitter.PostDeleteRetweetRequestVariables.from_dict(
132
+ self.flag["DeleteRetweet"]["variables"]
133
+ )
105
134
  )
106
135
  variables.source_tweet_id = source_tweet_id
107
136
 
@@ -120,8 +149,10 @@ class PostApiUtils:
120
149
  self,
121
150
  tweet_id: str,
122
151
  ) -> ResponseType[models.FavoriteTweetResponseData]:
123
- variables = twitter.PostCreateRetweetRequestVariables.from_dict(
124
- self.flag["FavoriteTweet"]["variables"]
152
+ variables = non_nullable(
153
+ twitter.PostCreateBookmarkRequestVariables.from_dict(
154
+ self.flag["FavoriteTweet"]["variables"]
155
+ )
125
156
  )
126
157
  variables.tweet_id = tweet_id
127
158
 
@@ -139,8 +170,10 @@ class PostApiUtils:
139
170
  self,
140
171
  tweet_id: str,
141
172
  ) -> ResponseType[models.UnfavoriteTweetResponseData]:
142
- variables = twitter.PostCreateRetweetRequestVariables.from_dict(
143
- self.flag["UnfavoriteTweet"]["variables"]
173
+ variables = non_nullable(
174
+ twitter.PostCreateRetweetRequestVariables.from_dict(
175
+ self.flag["UnfavoriteTweet"]["variables"]
176
+ )
144
177
  )
145
178
  variables.tweet_id = tweet_id
146
179
 
@@ -17,6 +17,7 @@ from twitter_openapi_python.utils import (
17
17
  instruction_to_entry,
18
18
  tweet_entries_converter,
19
19
  )
20
+ from twitter_openapi_python.utils.api import non_nullable
20
21
 
21
22
  T = TypeVar("T")
22
23
  ResponseType = TwitterApiUtilsResponse[TimelineApiUtilsResponse[TweetApiUtilsData]]
@@ -199,7 +200,9 @@ class TweetApiUtils:
199
200
 
200
201
  response = self.request(
201
202
  apiFn=self.api.get_user_tweets_with_http_info,
202
- convertFn=lambda e: e.data.user.result.timeline_v2.timeline.instructions,
203
+ convertFn=lambda e: non_nullable(
204
+ e.data.user.result.timeline_v2.timeline
205
+ ).instructions,
203
206
  type=models.UserTweetsResponse,
204
207
  key="UserTweets",
205
208
  param=param,
@@ -223,7 +226,9 @@ class TweetApiUtils:
223
226
 
224
227
  response = self.request(
225
228
  apiFn=self.api.get_user_tweets_and_replies_with_http_info,
226
- convertFn=lambda e: e.data.user.result.timeline_v2.timeline.instructions,
229
+ convertFn=lambda e: non_nullable(
230
+ e.data.user.result.timeline_v2.timeline
231
+ ).instructions,
227
232
  type=models.UserTweetsResponse,
228
233
  key="UserTweetsAndReplies",
229
234
  param=param,
@@ -247,7 +252,9 @@ class TweetApiUtils:
247
252
 
248
253
  response = self.request(
249
254
  apiFn=self.api.get_user_media_with_http_info,
250
- convertFn=lambda e: e.data.user.result.timeline_v2.timeline.instructions,
255
+ convertFn=lambda e: non_nullable(
256
+ e.data.user.result.timeline_v2.timeline
257
+ ).instructions,
251
258
  type=models.UserTweetsResponse,
252
259
  key="UserMedia",
253
260
  param=param,
@@ -271,7 +278,9 @@ class TweetApiUtils:
271
278
 
272
279
  response = self.request(
273
280
  apiFn=self.api.get_likes_with_http_info,
274
- convertFn=lambda e: e.data.user.result.timeline_v2.timeline.instructions,
281
+ convertFn=lambda e: non_nullable(
282
+ e.data.user.result.timeline_v2.timeline
283
+ ).instructions,
275
284
  type=models.UserTweetsResponse,
276
285
  key="Likes",
277
286
  param=param,
@@ -15,6 +15,7 @@ from twitter_openapi_python.utils import (
15
15
  entries_cursor,
16
16
  get_kwargs,
17
17
  instruction_to_entry,
18
+ non_nullable,
18
19
  user_entries_converter,
19
20
  user_result_converter,
20
21
  )
@@ -144,7 +145,9 @@ class UserListApiUtils:
144
145
  param.update(extra_param)
145
146
  return self.request(
146
147
  apiFn=self.api.get_favoriters_with_http_info,
147
- convertFn=lambda e: e.data.favoriters_timeline.timeline.instructions,
148
+ convertFn=lambda e: non_nullable(
149
+ e.data.favoriters_timeline.timeline
150
+ ).instructions,
148
151
  type=models.TweetFavoritersResponse,
149
152
  key="Favoriters",
150
153
  param=param,
@@ -166,7 +169,9 @@ class UserListApiUtils:
166
169
  param.update(extra_param)
167
170
  return self.request(
168
171
  apiFn=self.api.get_retweeters_with_http_info,
169
- convertFn=lambda e: e.data.retweeters_timeline.timeline.instructions,
172
+ convertFn=lambda e: non_nullable(
173
+ e.data.retweeters_timeline.timeline
174
+ ).instructions,
170
175
  type=models.TweetRetweetersResponse,
171
176
  key="Retweeters",
172
177
  param=param,
@@ -58,43 +58,54 @@ class TwitterOpenapiPythonClient:
58
58
 
59
59
 
60
60
  class TwitterOpenapiPython:
61
- hash: str = "4f39fa1a95e3b03fcc64ae4c54c3d4389582fd39"
61
+ hash: str = "0c64eebbfb93b3ed69c3aba923ec8d6894a39902"
62
62
  placeholder_url = "https://raw.githubusercontent.com/fa0311/twitter-openapi/{hash}/src/config/placeholder.json"
63
- placeholder: ParamType
64
- user_agent: str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
63
+ header = "https://raw.githubusercontent.com/fa0311/latest-user-agent/refs/heads/main/header.json"
65
64
  access_token: str = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
65
+ twitter_url: str = "https://x.com/home"
66
+ additional_browser_headers = {}
67
+ additional_api_headers = {}
68
+
69
+ def get_header(self) -> tuple[dict[str, str], dict[str, str]]:
70
+ http = urllib3.PoolManager()
71
+ res = http.request("GET", self.header)
72
+ data = json.loads(res.data)
73
+ ignore = ["host", "connection"]
66
74
 
67
- api_key = {
68
- "Accept": "*/*",
69
- # "AcceptEncoding": "gzip, deflate, br",
70
- # "AcceptEncoding": "deflate, br",
71
- "AcceptLanguage": "en-US,en;q=0.9",
72
- "CacheControl": "no-cache",
73
- "Pragma": "no-cache",
74
- "SecChUa": '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
75
- "SecChUaMobile": "?0",
76
- "SecChUaPlatform": '"Windows"',
77
- "SecFetchDest": "empty",
78
- "SecFetchMode": "cors",
79
- "SecFetchSite": "same-origin",
80
- "ClientLanguage": "en",
81
- "ActiveUser": "yes",
82
- }
83
-
84
- browser_headers = {
85
- "accept": "text/plain, */*; q=0.01",
86
- "accept-encoding": "gzip, deflate, br",
87
- "accept-language": "en-US,en;q=0.9",
88
- "cache-control": "no-cache",
89
- "pragma": "no-cache",
90
- "sec-ch-ua": '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
91
- "sec-ch-ua-mobile": "?0",
92
- "sec-ch-ua-platform": '"Windows"',
93
- "sec-fetch-dest": "empty",
94
- "sec-fetch-mode": "cors",
95
- "sec-fetch-site": "same-site",
96
- "user-agent": user_agent,
97
- }
75
+ def getHader(name: str) -> dict[str, str]:
76
+ return {
77
+ key: value for key, value in data[name].items() if key not in ignore
78
+ }
79
+
80
+ return (
81
+ {
82
+ **getHader("chrome-fetch"),
83
+ "accept-encoding": "identity",
84
+ "pragma": "no-cache",
85
+ "referer": self.twitter_url,
86
+ "priority": "u=1, i",
87
+ "x-twitter-client-language": "en",
88
+ "x-twitter-active-user": "yes",
89
+ # 'x-twitter-auth-type': 'xxxx'
90
+ # 'x-csrf-token': 'xxxx',
91
+ # 'x-guest-token': 'xxxx',
92
+ "authorization": f"Bearer {self.access_token}",
93
+ **self.additional_api_headers,
94
+ },
95
+ {
96
+ **getHader("chrome"),
97
+ **self.additional_browser_headers,
98
+ },
99
+ )
100
+
101
+ def kebab_to_upper_camel(self, text: dict[str, Any]) -> dict[str, Any]:
102
+ res = {}
103
+ for key, value in text.items():
104
+ new_key = "".join(
105
+ [x.capitalize() for x in key.replace("x-twitter-", "").split("-")]
106
+ )
107
+ res[new_key] = value
108
+ return res
98
109
 
99
110
  def cookie_normalize(self, cookie: list[str]) -> dict[str, str]:
100
111
  return {
@@ -117,7 +128,7 @@ class TwitterOpenapiPython:
117
128
  self,
118
129
  cookies: dict[str, str],
119
130
  ) -> TwitterOpenapiPythonClient:
120
- api_key = self.api_key.copy()
131
+ api_key = self.kebab_to_upper_camel(self.get_header()[0])
121
132
 
122
133
  if cookies.get("ct0"):
123
134
  api_key.update({"AuthType": "OAuth2Session"})
@@ -132,27 +143,28 @@ class TwitterOpenapiPython:
132
143
  configuration=api_conf,
133
144
  cookie=self.cookie_to_str(cookies),
134
145
  )
135
- api_client.user_agent = self.user_agent
146
+ api_client.user_agent = api_key["UserAgent"]
136
147
  return self.get_twitter_openapi_python_client(api_client)
137
148
 
138
149
  def get_guest_client(self) -> TwitterOpenapiPythonClient:
139
150
  http = urllib3.PoolManager()
140
151
  session = {}
141
152
 
153
+ header = self.get_header()
154
+
142
155
  res_1 = http.request(
143
156
  "GET",
144
- "https://twitter.com",
157
+ self.twitter_url,
145
158
  redirect=False,
146
- headers=self.browser_headers.copy(),
159
+ headers=header[1],
147
160
  )
148
161
  cookie = res_1.headers._container["set-cookie"][1:]
149
162
  session.update(self.cookie_normalize(cookie))
150
163
  res_2 = http.request(
151
164
  "GET",
152
- "https://twitter.com",
165
+ self.twitter_url,
153
166
  redirect=False,
154
- headers=self.browser_headers.copy()
155
- | {"Cookie": self.cookie_to_str(session)},
167
+ headers=header[1],
156
168
  )
157
169
 
158
170
  find = re.findall(r'document.cookie="(.*?)";', res_2.data.decode())
@@ -161,15 +173,13 @@ class TwitterOpenapiPython:
161
173
  session.pop("ct0")
162
174
 
163
175
  if not session.get("gt"):
164
- activate_header = self.browser_headers.copy() | {
165
- "authorization": "Bearer {}".format(self.access_token),
166
- "x-twitter-active-user": "yes",
167
- "x-twitter-client-language": "en",
176
+ activate_header = header[0] | {
177
+ "cookie": self.cookie_to_str(session),
168
178
  }
169
179
  res_3 = http.request(
170
180
  "POST",
171
- "https://api.twitter.com/1.1/guest/activate.json",
172
- headers=activate_header | {"Cookie": self.cookie_to_str(session)},
181
+ "https://api.x.com/1.1/guest/activate.json",
182
+ headers=activate_header,
173
183
  )
174
184
  gt = json.loads(res_3.data.decode())["guest_token"]
175
185
  session.update({"gt": gt})
@@ -18,4 +18,5 @@ from twitter_openapi_python.utils.api import (
18
18
  user_entries_converter,
19
19
  user_or_null_converter,
20
20
  user_result_converter,
21
+ non_nullable,
21
22
  )
@@ -23,6 +23,11 @@ def flat(matrix: List[List[T]]) -> List[T]:
23
23
  return [x for row in matrix for x in row]
24
24
 
25
25
 
26
+ def non_nullable(x: Optional[T]) -> T:
27
+ if x is None:
28
+ raise Exception("No data")
29
+ return x
30
+
26
31
  def non_nullable_list(x: List[Optional[T]]) -> List[T]:
27
32
  def filter_fn(x: Optional[T]) -> TypeGuard[T]:
28
33
  return x is not None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: twitter-openapi-python
3
- Version: 0.0.22
3
+ Version: 0.0.24
4
4
  Summary: Twitter OpenAPI
5
5
  Home-page: https://github.com/fa0311/twitter_openapi_python
6
6
  Author: fa0311
@@ -10,7 +10,7 @@ Keywords: OpenAPI,OpenAPI-Generator,Twitter OpenAPI
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  License-File: LICENSE.AGPL
13
- Requires-Dist: twitter-openapi-python-generated ==0.0.16
13
+ Requires-Dist: twitter-openapi-python-generated ==0.0.21
14
14
  Requires-Dist: pydantic >=2.6
15
15
 
16
16
  Twitter scraping with data validation by pydantic.
@@ -1,13 +1,13 @@
1
1
  twitter_openapi_python/__init__.py,sha256=stqYIfWDqM0yC93SQNp4-b2hSz-ONWR3QxOG5g2oREg,339
2
- twitter_openapi_python/client.py,sha256=HzxtpWo-yNzIlfPIZKbAxM8QidAw2E83bwLUd7lfcQE,6500
2
+ twitter_openapi_python/client.py,sha256=i0ynE5orodZtPCLGUYmalBD7lL4HMBBItypdUmlJYJg,6673
3
3
  twitter_openapi_python/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  twitter_openapi_python/api/__init__.py,sha256=-2hoS75Fp0KvCIWKYQFpvAl0pcbFyt7Be3ood08P7n8,643
5
5
  twitter_openapi_python/api/default_api.py,sha256=PeHYaAw6xaUB9ZE3An5SKcEvW71JLTFSgyte80BBvX4,2751
6
- twitter_openapi_python/api/initial_state_api.py,sha256=b_ehegseXC3dtGEQ99QEg5g7-KGuZWM3VT4iWkkK3W8,2339
7
- twitter_openapi_python/api/post_api.py,sha256=q9v-AUZXOmrZ28seD81hOO8bIXbqB5S0vN-QkJlmuIc,5607
8
- twitter_openapi_python/api/tweet_api.py,sha256=eP1pbtCB2dV9rbI3M5R9ta_CyViBngnSLWZztMfEycU,9941
6
+ twitter_openapi_python/api/initial_state_api.py,sha256=N4yA3oXDbke7bH-XOuKQ4WVUm5sKbC2C3Dd3AvFINLY,2355
7
+ twitter_openapi_python/api/post_api.py,sha256=9xvA0LrtcxWOVBkkVwvMS-zBcJFh1ZVUF_dm1zzZq5o,6826
8
+ twitter_openapi_python/api/tweet_api.py,sha256=iZC3PlFS9SD3olb4BRrMYfyoCUf1UuD2XToXd33S-UM,10184
9
9
  twitter_openapi_python/api/user_api.py,sha256=oH5JBNemBSCyUFAbDSDbjRUOZN3bZMa_tI8PQ4C1wYk,2619
10
- twitter_openapi_python/api/user_list_api.py,sha256=nhLbqXF4nnM9ONTGa-Szh5booZk5LeEfOfR7lEYyT1M,5637
10
+ twitter_openapi_python/api/user_list_api.py,sha256=7o1dqRrXzk0F6ywQ-dhyMR0eCzsGJ6HeUHYswPDx3hI,5748
11
11
  twitter_openapi_python/api/users_api.py,sha256=82CM20-dp7JfpTRqSIzU5Lbm4xoB32Cq18ECRfVMt_I,1789
12
12
  twitter_openapi_python/api/v11_get_api.py,sha256=OimuRRA4oG2z6IGhJuzgo2CvJqpoD4-CDNZrwZRg6GQ,2254
13
13
  twitter_openapi_python/api/v11_post_api.py,sha256=d7H-ewGhLql-lQagkGLdOm9FybtjN05lCoGatDMh9rc,2051
@@ -17,11 +17,11 @@ twitter_openapi_python/models/header.py,sha256=hP0fjrm-3Mogt9IkAucQnmDletRuzMmCf
17
17
  twitter_openapi_python/models/initial_state.py,sha256=h8P3hC_tLVSmDuYxB03fuSviz22cpp-4RfSR2npP_Yo,530
18
18
  twitter_openapi_python/models/response.py,sha256=ZuaX36mKRsVx5aiJhNw3CjrvVGVaGjMCGdXy28PMFy8,480
19
19
  twitter_openapi_python/models/timeline.py,sha256=AoWfrJsonYImlweciaUSjFzmeciaX0zshi7d-FkT4LM,1392
20
- twitter_openapi_python/utils/__init__.py,sha256=U31tIEyCWa4RRnYvMXqcdtHTpbEUftNey68XmAP0lnk,430
21
- twitter_openapi_python/utils/api.py,sha256=G7h83x_BcXP9ou_XlYEFd4M4yElG7Ck-U8W8dvWkFaI,9915
22
- twitter_openapi_python-0.0.22.dist-info/LICENSE,sha256=xthyYzrtSmRlBu2gnfuIxzsZeHrqtIZgZPL9UPrYiQU,1524
23
- twitter_openapi_python-0.0.22.dist-info/LICENSE.AGPL,sha256=Nv6u1ubULm-E2y6q2-pQPK8s2BzkOltLaVlPKQ3tkcs,35182
24
- twitter_openapi_python-0.0.22.dist-info/METADATA,sha256=xZForYf3jllPiDsMYdI9hFfaiXeMgYy8Dkrgqj7qDas,551
25
- twitter_openapi_python-0.0.22.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
26
- twitter_openapi_python-0.0.22.dist-info/top_level.txt,sha256=wKFCnW_S6aWD3nFPmd65SxZIviiqQ30LqHOLLpcnTdE,23
27
- twitter_openapi_python-0.0.22.dist-info/RECORD,,
20
+ twitter_openapi_python/utils/__init__.py,sha256=QVT1eCClP9EVfcZ4QU96TVegfAUDEtJ-PVp3zv6qy6w,449
21
+ twitter_openapi_python/utils/api.py,sha256=JTSXE1Wh3AiuOb_APTDTQMrR4HTkI9AihzrXkJGV2d8,10026
22
+ twitter_openapi_python-0.0.24.dist-info/LICENSE,sha256=xthyYzrtSmRlBu2gnfuIxzsZeHrqtIZgZPL9UPrYiQU,1524
23
+ twitter_openapi_python-0.0.24.dist-info/LICENSE.AGPL,sha256=Nv6u1ubULm-E2y6q2-pQPK8s2BzkOltLaVlPKQ3tkcs,35182
24
+ twitter_openapi_python-0.0.24.dist-info/METADATA,sha256=gAfBFLyf8j_Nb0LtsAPTmWrRdaG62cbE7WdveewWmsU,551
25
+ twitter_openapi_python-0.0.24.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
26
+ twitter_openapi_python-0.0.24.dist-info/top_level.txt,sha256=wKFCnW_S6aWD3nFPmd65SxZIviiqQ30LqHOLLpcnTdE,23
27
+ twitter_openapi_python-0.0.24.dist-info/RECORD,,