x-twitter-scraper 0.7.2 → 0.9.0

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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +3 -3
  4. data/lib/x_twitter_scraper/models/credit_topup_balance_response.rb +5 -5
  5. data/lib/x_twitter_scraper/models/draw_export_params.rb +8 -3
  6. data/lib/x_twitter_scraper/models/draw_list_params.rb +2 -2
  7. data/lib/x_twitter_scraper/models/error.rb +8 -0
  8. data/lib/x_twitter_scraper/models/event_list_params.rb +13 -5
  9. data/lib/x_twitter_scraper/models/extraction_estimate_cost_params.rb +731 -82
  10. data/lib/x_twitter_scraper/models/extraction_estimate_cost_response.rb +1 -0
  11. data/lib/x_twitter_scraper/models/extraction_export_results_params.rb +145 -1
  12. data/lib/x_twitter_scraper/models/extraction_list_params.rb +2 -2
  13. data/lib/x_twitter_scraper/models/extraction_retrieve_params.rb +70 -3
  14. data/lib/x_twitter_scraper/models/extraction_run_params.rb +662 -1
  15. data/lib/x_twitter_scraper/models/extraction_run_response.rb +27 -48
  16. data/lib/x_twitter_scraper/models/guest_wallet_create_response.rb +8 -8
  17. data/lib/x_twitter_scraper/models/guest_wallet_topup_response.rb +9 -9
  18. data/lib/x_twitter_scraper/models/monitor.rb +29 -1
  19. data/lib/x_twitter_scraper/models/paginated_tweets.rb +4 -4
  20. data/lib/x_twitter_scraper/models/paginated_users.rb +5 -5
  21. data/lib/x_twitter_scraper/models/support/attachment_download_params.rb +28 -0
  22. data/lib/x_twitter_scraper/models/x/community_retrieve_members_params.rb +113 -1
  23. data/lib/x_twitter_scraper/models/x/community_retrieve_moderators_params.rb +117 -1
  24. data/lib/x_twitter_scraper/models/x/list_retrieve_followers_params.rb +117 -6
  25. data/lib/x_twitter_scraper/models/x/list_retrieve_members_params.rb +116 -1
  26. data/lib/x_twitter_scraper/models/x/tweet_get_favoriters_params.rb +117 -6
  27. data/lib/x_twitter_scraper/models/x/tweet_get_quotes_params.rb +153 -1
  28. data/lib/x_twitter_scraper/models/x/tweet_get_replies_params.rb +246 -16
  29. data/lib/x_twitter_scraper/models/x/tweet_get_replies_response.rb +3 -2
  30. data/lib/x_twitter_scraper/models/x/tweet_get_retweeters_params.rb +117 -6
  31. data/lib/x_twitter_scraper/models/x/tweet_search_params.rb +187 -14
  32. data/lib/x_twitter_scraper/models/x/tweet_search_response.rb +299 -0
  33. data/lib/x_twitter_scraper/models/x/user_retrieve_followers_params.rb +143 -10
  34. data/lib/x_twitter_scraper/models/x/user_retrieve_followers_response.rb +241 -0
  35. data/lib/x_twitter_scraper/models/x/user_retrieve_followers_you_know_params.rb +117 -6
  36. data/lib/x_twitter_scraper/models/x/user_retrieve_following_params.rb +143 -10
  37. data/lib/x_twitter_scraper/models/x/user_retrieve_following_response.rb +241 -0
  38. data/lib/x_twitter_scraper/models/x/user_retrieve_likes_params.rb +153 -1
  39. data/lib/x_twitter_scraper/models/x/user_retrieve_media_params.rb +153 -1
  40. data/lib/x_twitter_scraper/models/x/user_retrieve_mentions_params.rb +153 -1
  41. data/lib/x_twitter_scraper/models/x/user_retrieve_replies_params.rb +159 -7
  42. data/lib/x_twitter_scraper/models/x/user_retrieve_search_params.rb +116 -1
  43. data/lib/x_twitter_scraper/models/x/user_retrieve_tweets_params.rb +159 -7
  44. data/lib/x_twitter_scraper/models/x/user_retrieve_verified_followers_params.rb +157 -8
  45. data/lib/x_twitter_scraper/models/x/user_retrieve_verified_followers_response.rb +245 -0
  46. data/lib/x_twitter_scraper/models/x/x_account.rb +7 -11
  47. data/lib/x_twitter_scraper/resources/credits.rb +2 -2
  48. data/lib/x_twitter_scraper/resources/draws.rb +5 -2
  49. data/lib/x_twitter_scraper/resources/events.rb +10 -4
  50. data/lib/x_twitter_scraper/resources/extractions.rb +383 -84
  51. data/lib/x_twitter_scraper/resources/guest_wallets.rb +9 -13
  52. data/lib/x_twitter_scraper/resources/support/attachments.rb +42 -0
  53. data/lib/x_twitter_scraper/resources/support.rb +5 -0
  54. data/lib/x_twitter_scraper/resources/x/communities.rb +95 -4
  55. data/lib/x_twitter_scraper/resources/x/lists.rb +96 -5
  56. data/lib/x_twitter_scraper/resources/x/tweets.rb +286 -28
  57. data/lib/x_twitter_scraper/resources/x/users.rb +531 -41
  58. data/lib/x_twitter_scraper/version.rb +1 -1
  59. data/lib/x_twitter_scraper.rb +7 -1
  60. data/rbi/x_twitter_scraper/models/credit_topup_balance_response.rbi +6 -6
  61. data/rbi/x_twitter_scraper/models/draw_export_params.rbi +6 -3
  62. data/rbi/x_twitter_scraper/models/draw_list_params.rbi +2 -2
  63. data/rbi/x_twitter_scraper/models/error.rbi +40 -0
  64. data/rbi/x_twitter_scraper/models/event_list_params.rbi +15 -4
  65. data/rbi/x_twitter_scraper/models/extraction_estimate_cost_params.rbi +1338 -86
  66. data/rbi/x_twitter_scraper/models/extraction_estimate_cost_response.rbi +5 -0
  67. data/rbi/x_twitter_scraper/models/extraction_export_results_params.rbi +198 -0
  68. data/rbi/x_twitter_scraper/models/extraction_list_params.rbi +2 -2
  69. data/rbi/x_twitter_scraper/models/extraction_retrieve_params.rbi +194 -2
  70. data/rbi/x_twitter_scraper/models/extraction_run_params.rbi +1221 -0
  71. data/rbi/x_twitter_scraper/models/extraction_run_response.rbi +35 -162
  72. data/rbi/x_twitter_scraper/models/guest_wallet_create_response.rbi +8 -6
  73. data/rbi/x_twitter_scraper/models/guest_wallet_topup_response.rbi +9 -7
  74. data/rbi/x_twitter_scraper/models/monitor.rbi +54 -3
  75. data/rbi/x_twitter_scraper/models/paginated_tweets.rbi +4 -4
  76. data/rbi/x_twitter_scraper/models/paginated_users.rbi +5 -5
  77. data/rbi/x_twitter_scraper/models/support/attachment_download_params.rbi +51 -0
  78. data/rbi/x_twitter_scraper/models/x/community_retrieve_members_params.rbi +154 -0
  79. data/rbi/x_twitter_scraper/models/x/community_retrieve_moderators_params.rbi +154 -0
  80. data/rbi/x_twitter_scraper/models/x/list_retrieve_followers_params.rbi +160 -8
  81. data/rbi/x_twitter_scraper/models/x/list_retrieve_members_params.rbi +154 -0
  82. data/rbi/x_twitter_scraper/models/x/tweet_get_favoriters_params.rbi +160 -8
  83. data/rbi/x_twitter_scraper/models/x/tweet_get_quotes_params.rbi +209 -0
  84. data/rbi/x_twitter_scraper/models/x/tweet_get_replies_params.rbi +403 -20
  85. data/rbi/x_twitter_scraper/models/x/tweet_get_replies_response.rbi +3 -2
  86. data/rbi/x_twitter_scraper/models/x/tweet_get_retweeters_params.rbi +160 -8
  87. data/rbi/x_twitter_scraper/models/x/tweet_search_params.rbi +279 -16
  88. data/rbi/x_twitter_scraper/models/x/tweet_search_response.rbi +543 -0
  89. data/rbi/x_twitter_scraper/models/x/user_retrieve_followers_params.rbi +228 -12
  90. data/rbi/x_twitter_scraper/models/x/user_retrieve_followers_response.rbi +440 -0
  91. data/rbi/x_twitter_scraper/models/x/user_retrieve_followers_you_know_params.rbi +160 -8
  92. data/rbi/x_twitter_scraper/models/x/user_retrieve_following_params.rbi +228 -12
  93. data/rbi/x_twitter_scraper/models/x/user_retrieve_following_response.rbi +440 -0
  94. data/rbi/x_twitter_scraper/models/x/user_retrieve_likes_params.rbi +209 -0
  95. data/rbi/x_twitter_scraper/models/x/user_retrieve_media_params.rbi +209 -0
  96. data/rbi/x_twitter_scraper/models/x/user_retrieve_mentions_params.rbi +209 -0
  97. data/rbi/x_twitter_scraper/models/x/user_retrieve_replies_params.rbi +217 -8
  98. data/rbi/x_twitter_scraper/models/x/user_retrieve_search_params.rbi +154 -0
  99. data/rbi/x_twitter_scraper/models/x/user_retrieve_tweets_params.rbi +217 -8
  100. data/rbi/x_twitter_scraper/models/x/user_retrieve_verified_followers_params.rbi +248 -10
  101. data/rbi/x_twitter_scraper/models/x/user_retrieve_verified_followers_response.rbi +440 -0
  102. data/rbi/x_twitter_scraper/models/x/x_account.rbi +9 -15
  103. data/rbi/x_twitter_scraper/resources/credits.rbi +2 -2
  104. data/rbi/x_twitter_scraper/resources/draws.rbi +3 -2
  105. data/rbi/x_twitter_scraper/resources/events.rbi +5 -2
  106. data/rbi/x_twitter_scraper/resources/extractions.rbi +525 -83
  107. data/rbi/x_twitter_scraper/resources/guest_wallets.rbi +9 -13
  108. data/rbi/x_twitter_scraper/resources/support/attachments.rbi +35 -0
  109. data/rbi/x_twitter_scraper/resources/support.rbi +4 -0
  110. data/rbi/x_twitter_scraper/resources/x/communities.rbi +84 -0
  111. data/rbi/x_twitter_scraper/resources/x/lists.rbi +87 -4
  112. data/rbi/x_twitter_scraper/resources/x/tweets.rbi +307 -31
  113. data/rbi/x_twitter_scraper/resources/x/users.rbi +558 -34
  114. data/sig/x_twitter_scraper/models/error.rbs +16 -0
  115. data/sig/x_twitter_scraper/models/event_list_params.rbs +7 -0
  116. data/sig/x_twitter_scraper/models/extraction_estimate_cost_params.rbs +605 -1
  117. data/sig/x_twitter_scraper/models/extraction_estimate_cost_response.rbs +2 -0
  118. data/sig/x_twitter_scraper/models/extraction_export_results_params.rbs +127 -1
  119. data/sig/x_twitter_scraper/models/extraction_retrieve_params.rbs +74 -1
  120. data/sig/x_twitter_scraper/models/extraction_run_params.rbs +611 -1
  121. data/sig/x_twitter_scraper/models/extraction_run_response.rbs +29 -67
  122. data/sig/x_twitter_scraper/models/guest_wallet_create_response.rbs +4 -4
  123. data/sig/x_twitter_scraper/models/guest_wallet_topup_response.rbs +4 -4
  124. data/sig/x_twitter_scraper/models/monitor.rbs +29 -3
  125. data/sig/x_twitter_scraper/models/support/attachment_download_params.rbs +32 -0
  126. data/sig/x_twitter_scraper/models/x/community_retrieve_members_params.rbs +103 -1
  127. data/sig/x_twitter_scraper/models/x/community_retrieve_moderators_params.rbs +102 -1
  128. data/sig/x_twitter_scraper/models/x/list_retrieve_followers_params.rbs +103 -1
  129. data/sig/x_twitter_scraper/models/x/list_retrieve_members_params.rbs +103 -1
  130. data/sig/x_twitter_scraper/models/x/tweet_get_favoriters_params.rbs +103 -1
  131. data/sig/x_twitter_scraper/models/x/tweet_get_quotes_params.rbs +134 -1
  132. data/sig/x_twitter_scraper/models/x/tweet_get_replies_params.rbs +207 -2
  133. data/sig/x_twitter_scraper/models/x/tweet_get_retweeters_params.rbs +103 -1
  134. data/sig/x_twitter_scraper/models/x/tweet_search_params.rbs +154 -1
  135. data/sig/x_twitter_scraper/models/x/tweet_search_response.rbs +258 -0
  136. data/sig/x_twitter_scraper/models/x/user_retrieve_followers_params.rbs +119 -1
  137. data/sig/x_twitter_scraper/models/x/user_retrieve_followers_response.rbs +216 -0
  138. data/sig/x_twitter_scraper/models/x/user_retrieve_followers_you_know_params.rbs +103 -1
  139. data/sig/x_twitter_scraper/models/x/user_retrieve_following_params.rbs +119 -1
  140. data/sig/x_twitter_scraper/models/x/user_retrieve_following_response.rbs +216 -0
  141. data/sig/x_twitter_scraper/models/x/user_retrieve_likes_params.rbs +134 -1
  142. data/sig/x_twitter_scraper/models/x/user_retrieve_media_params.rbs +134 -1
  143. data/sig/x_twitter_scraper/models/x/user_retrieve_mentions_params.rbs +134 -1
  144. data/sig/x_twitter_scraper/models/x/user_retrieve_replies_params.rbs +134 -1
  145. data/sig/x_twitter_scraper/models/x/user_retrieve_search_params.rbs +102 -1
  146. data/sig/x_twitter_scraper/models/x/user_retrieve_tweets_params.rbs +134 -1
  147. data/sig/x_twitter_scraper/models/x/user_retrieve_verified_followers_params.rbs +137 -1
  148. data/sig/x_twitter_scraper/models/x/user_retrieve_verified_followers_response.rbs +216 -0
  149. data/sig/x_twitter_scraper/resources/events.rbs +1 -0
  150. data/sig/x_twitter_scraper/resources/extractions.rbs +137 -0
  151. data/sig/x_twitter_scraper/resources/support/attachments.rbs +15 -0
  152. data/sig/x_twitter_scraper/resources/support.rbs +2 -0
  153. data/sig/x_twitter_scraper/resources/x/communities.rbs +28 -0
  154. data/sig/x_twitter_scraper/resources/x/lists.rbs +28 -0
  155. data/sig/x_twitter_scraper/resources/x/tweets.rbs +93 -1
  156. data/sig/x_twitter_scraper/resources/x/users.rbs +173 -3
  157. metadata +19 -1
@@ -0,0 +1,440 @@
1
+ # typed: strong
2
+
3
+ module XTwitterScraper
4
+ module Models
5
+ module X
6
+ # Paginated user profiles. No-mode follower, following, and verified follower
7
+ # requests merge independent views automatically. Response fields, page size,
8
+ # aliases, filters, and per-returned-profile billing stay unchanged. Existing
9
+ # unprefixed cursors retain legacy behavior. Follow next_cursor while
10
+ # has_next_page is true.
11
+ module UserRetrieveFollowersResponse
12
+ extend XTwitterScraper::Internal::Type::Union
13
+
14
+ Variants =
15
+ T.type_alias do
16
+ T.any(
17
+ XTwitterScraper::PaginatedUsers,
18
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse
19
+ )
20
+ end
21
+
22
+ class UserListCoverageResponse < XTwitterScraper::Models::PaginatedUsers
23
+ OrHash =
24
+ T.type_alias do
25
+ T.any(
26
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse,
27
+ XTwitterScraper::Internal::AnyHash
28
+ )
29
+ end
30
+
31
+ # Coverage evidence across parallel relationship strategies.
32
+ sig do
33
+ returns(
34
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic
35
+ )
36
+ end
37
+ attr_reader :diagnostic
38
+
39
+ sig do
40
+ params(
41
+ diagnostic:
42
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::OrHash
43
+ ).void
44
+ end
45
+ attr_writer :diagnostic
46
+
47
+ sig do
48
+ returns(
49
+ T.nilable(
50
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::TaggedBoolean
51
+ )
52
+ )
53
+ end
54
+ attr_reader :has_next_page
55
+
56
+ sig do
57
+ params(
58
+ has_next_page:
59
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::OrBoolean
60
+ ).void
61
+ end
62
+ attr_writer :has_next_page
63
+
64
+ sig do
65
+ returns(
66
+ T.nilable(
67
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::TaggedSymbol
68
+ )
69
+ )
70
+ end
71
+ attr_reader :next_cursor
72
+
73
+ sig do
74
+ params(
75
+ next_cursor:
76
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::OrSymbol
77
+ ).void
78
+ end
79
+ attr_writer :next_cursor
80
+
81
+ # Paginated user profiles. No-mode follower, following, and verified follower
82
+ # requests merge independent views automatically. Response fields, page size,
83
+ # aliases, filters, and per-returned-profile billing stay unchanged. Existing
84
+ # unprefixed cursors retain legacy behavior. Follow next_cursor while
85
+ # has_next_page is true.
86
+ sig do
87
+ params(
88
+ diagnostic:
89
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::OrHash,
90
+ has_next_page:
91
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::OrBoolean,
92
+ next_cursor:
93
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::OrSymbol
94
+ ).returns(T.attached_class)
95
+ end
96
+ def self.new(
97
+ # Coverage evidence across parallel relationship strategies.
98
+ diagnostic:,
99
+ has_next_page: nil,
100
+ next_cursor: nil
101
+ )
102
+ end
103
+
104
+ sig do
105
+ override.returns(
106
+ {
107
+ diagnostic:
108
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic,
109
+ has_next_page:
110
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::TaggedBoolean,
111
+ next_cursor:
112
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::TaggedSymbol
113
+ }
114
+ )
115
+ end
116
+ def to_hash
117
+ end
118
+
119
+ class Diagnostic < XTwitterScraper::Internal::Type::BaseModel
120
+ OrHash =
121
+ T.type_alias do
122
+ T.any(
123
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic,
124
+ XTwitterScraper::Internal::AnyHash
125
+ )
126
+ end
127
+
128
+ # True when every strategy exhausted its source.
129
+ sig { returns(T::Boolean) }
130
+ attr_accessor :complete
131
+
132
+ sig { returns(Integer) }
133
+ attr_accessor :cursor_failure_count
134
+
135
+ sig { returns(T::Boolean) }
136
+ attr_accessor :deadline_reached
137
+
138
+ sig { returns(Integer) }
139
+ attr_accessor :duplicate_count
140
+
141
+ sig { returns(Integer) }
142
+ attr_accessor :failed_strategy_count
143
+
144
+ sig { returns(Integer) }
145
+ attr_accessor :malformed_count
146
+
147
+ sig { returns(Integer) }
148
+ attr_accessor :pages_fetched
149
+
150
+ # Whether credits or the requested limit reduced output.
151
+ sig { returns(T::Boolean) }
152
+ attr_accessor :response_truncated
153
+
154
+ sig { returns(T::Boolean) }
155
+ attr_accessor :result_limit_reached
156
+
157
+ sig { returns(Integer) }
158
+ attr_accessor :returned_users
159
+
160
+ sig { returns(Integer) }
161
+ attr_accessor :stalled_strategy_count
162
+
163
+ sig do
164
+ returns(
165
+ T::Array[
166
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy
167
+ ]
168
+ )
169
+ end
170
+ attr_accessor :strategies
171
+
172
+ sig { returns(Integer) }
173
+ attr_accessor :strategy_count
174
+
175
+ sig { returns(Integer) }
176
+ attr_accessor :unique_users
177
+
178
+ # Coverage evidence across parallel relationship strategies.
179
+ sig do
180
+ params(
181
+ complete: T::Boolean,
182
+ cursor_failure_count: Integer,
183
+ deadline_reached: T::Boolean,
184
+ duplicate_count: Integer,
185
+ failed_strategy_count: Integer,
186
+ malformed_count: Integer,
187
+ pages_fetched: Integer,
188
+ response_truncated: T::Boolean,
189
+ result_limit_reached: T::Boolean,
190
+ returned_users: Integer,
191
+ stalled_strategy_count: Integer,
192
+ strategies:
193
+ T::Array[
194
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::OrHash
195
+ ],
196
+ strategy_count: Integer,
197
+ unique_users: Integer
198
+ ).returns(T.attached_class)
199
+ end
200
+ def self.new(
201
+ # True when every strategy exhausted its source.
202
+ complete:,
203
+ cursor_failure_count:,
204
+ deadline_reached:,
205
+ duplicate_count:,
206
+ failed_strategy_count:,
207
+ malformed_count:,
208
+ pages_fetched:,
209
+ # Whether credits or the requested limit reduced output.
210
+ response_truncated:,
211
+ result_limit_reached:,
212
+ returned_users:,
213
+ stalled_strategy_count:,
214
+ strategies:,
215
+ strategy_count:,
216
+ unique_users:
217
+ )
218
+ end
219
+
220
+ sig do
221
+ override.returns(
222
+ {
223
+ complete: T::Boolean,
224
+ cursor_failure_count: Integer,
225
+ deadline_reached: T::Boolean,
226
+ duplicate_count: Integer,
227
+ failed_strategy_count: Integer,
228
+ malformed_count: Integer,
229
+ pages_fetched: Integer,
230
+ response_truncated: T::Boolean,
231
+ result_limit_reached: T::Boolean,
232
+ returned_users: Integer,
233
+ stalled_strategy_count: Integer,
234
+ strategies:
235
+ T::Array[
236
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy
237
+ ],
238
+ strategy_count: Integer,
239
+ unique_users: Integer
240
+ }
241
+ )
242
+ end
243
+ def to_hash
244
+ end
245
+
246
+ class Strategy < XTwitterScraper::Internal::Type::BaseModel
247
+ OrHash =
248
+ T.type_alias do
249
+ T.any(
250
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy,
251
+ XTwitterScraper::Internal::AnyHash
252
+ )
253
+ end
254
+
255
+ sig { returns(Integer) }
256
+ attr_accessor :duplicate_count
257
+
258
+ sig { returns(Integer) }
259
+ attr_accessor :pages_fetched
260
+
261
+ sig do
262
+ returns(
263
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
264
+ )
265
+ end
266
+ attr_accessor :stop_reason
267
+
268
+ sig { returns(Integer) }
269
+ attr_accessor :strategy
270
+
271
+ sig { returns(Integer) }
272
+ attr_accessor :unique_added
273
+
274
+ sig do
275
+ params(
276
+ duplicate_count: Integer,
277
+ pages_fetched: Integer,
278
+ stop_reason:
279
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::OrSymbol,
280
+ strategy: Integer,
281
+ unique_added: Integer
282
+ ).returns(T.attached_class)
283
+ end
284
+ def self.new(
285
+ duplicate_count:,
286
+ pages_fetched:,
287
+ stop_reason:,
288
+ strategy:,
289
+ unique_added:
290
+ )
291
+ end
292
+
293
+ sig do
294
+ override.returns(
295
+ {
296
+ duplicate_count: Integer,
297
+ pages_fetched: Integer,
298
+ stop_reason:
299
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol,
300
+ strategy: Integer,
301
+ unique_added: Integer
302
+ }
303
+ )
304
+ end
305
+ def to_hash
306
+ end
307
+
308
+ module StopReason
309
+ extend XTwitterScraper::Internal::Type::Enum
310
+
311
+ TaggedSymbol =
312
+ T.type_alias do
313
+ T.all(
314
+ Symbol,
315
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason
316
+ )
317
+ end
318
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
319
+
320
+ CURSOR_FAILURE =
321
+ T.let(
322
+ :cursor_failure,
323
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
324
+ )
325
+ DEADLINE =
326
+ T.let(
327
+ :deadline,
328
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
329
+ )
330
+ EXHAUSTED =
331
+ T.let(
332
+ :exhausted,
333
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
334
+ )
335
+ FAILED =
336
+ T.let(
337
+ :failed,
338
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
339
+ )
340
+ PAGE_LIMIT =
341
+ T.let(
342
+ :page_limit,
343
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
344
+ )
345
+ RESULT_LIMIT =
346
+ T.let(
347
+ :result_limit,
348
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
349
+ )
350
+ STALLED =
351
+ T.let(
352
+ :stalled,
353
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
354
+ )
355
+
356
+ sig do
357
+ override.returns(
358
+ T::Array[
359
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::Diagnostic::Strategy::StopReason::TaggedSymbol
360
+ ]
361
+ )
362
+ end
363
+ def self.values
364
+ end
365
+ end
366
+ end
367
+ end
368
+
369
+ module HasNextPage
370
+ extend XTwitterScraper::Internal::Type::Enum
371
+
372
+ TaggedBoolean =
373
+ T.type_alias do
374
+ T.all(
375
+ T::Boolean,
376
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage
377
+ )
378
+ end
379
+ OrBoolean = T.type_alias { T::Boolean }
380
+
381
+ FALSE =
382
+ T.let(
383
+ false,
384
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::TaggedBoolean
385
+ )
386
+
387
+ sig do
388
+ override.returns(
389
+ T::Array[
390
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::HasNextPage::TaggedBoolean
391
+ ]
392
+ )
393
+ end
394
+ def self.values
395
+ end
396
+ end
397
+
398
+ module NextCursor
399
+ extend XTwitterScraper::Internal::Type::Enum
400
+
401
+ TaggedSymbol =
402
+ T.type_alias do
403
+ T.all(
404
+ Symbol,
405
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor
406
+ )
407
+ end
408
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
409
+
410
+ EMPTY =
411
+ T.let(
412
+ :"",
413
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::TaggedSymbol
414
+ )
415
+
416
+ sig do
417
+ override.returns(
418
+ T::Array[
419
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::UserListCoverageResponse::NextCursor::TaggedSymbol
420
+ ]
421
+ )
422
+ end
423
+ def self.values
424
+ end
425
+ end
426
+ end
427
+
428
+ sig do
429
+ override.returns(
430
+ T::Array[
431
+ XTwitterScraper::Models::X::UserRetrieveFollowersResponse::Variants
432
+ ]
433
+ )
434
+ end
435
+ def self.variants
436
+ end
437
+ end
438
+ end
439
+ end
440
+ end
@@ -22,6 +22,13 @@ module XTwitterScraper
22
22
  sig { returns(String) }
23
23
  attr_accessor :id
24
24
 
25
+ # Match any comma-separated or line-separated bio term, ignoring case.
26
+ sig { returns(T.nilable(String)) }
27
+ attr_reader :bio_contains
28
+
29
+ sig { params(bio_contains: String).void }
30
+ attr_writer :bio_contains
31
+
25
32
  # Pagination cursor for followers-you-know
26
33
  sig { returns(T.nilable(String)) }
27
34
  attr_reader :cursor
@@ -29,33 +36,164 @@ module XTwitterScraper
29
36
  sig { params(cursor: String).void }
30
37
  attr_writer :cursor
31
38
 
32
- # Maximum user profiles requested from this page (20-200, default 200). The
33
- # response can contain fewer profiles because the source returned fewer or
34
- # remaining credits cover fewer results. Keep requesting next_cursor while
35
- # has_next_page is true. The deprecated limit and count aliases remain accepted.
39
+ # Only return profiles with a location.
40
+ sig { returns(T.nilable(T::Boolean)) }
41
+ attr_reader :has_location
42
+
43
+ sig { params(has_location: T::Boolean).void }
44
+ attr_writer :has_location
45
+
46
+ # Only return profiles with a website.
47
+ sig { returns(T.nilable(T::Boolean)) }
48
+ attr_reader :has_website
49
+
50
+ sig { params(has_website: T::Boolean).void }
51
+ attr_writer :has_website
52
+
53
+ # Match a location substring, ignoring case.
54
+ sig { returns(T.nilable(String)) }
55
+ attr_reader :location_contains
56
+
57
+ sig { params(location_contains: String).void }
58
+ attr_writer :location_contains
59
+
60
+ # Maximum follower count. Missing counts pass this maximum.
61
+ sig { returns(T.nilable(Integer)) }
62
+ attr_reader :max_followers
63
+
64
+ sig { params(max_followers: Integer).void }
65
+ attr_writer :max_followers
66
+
67
+ # Maximum following count.
68
+ sig { returns(T.nilable(Integer)) }
69
+ attr_reader :max_following
70
+
71
+ sig { params(max_following: Integer).void }
72
+ attr_writer :max_following
73
+
74
+ # Maximum post count. maxPosts is also accepted.
75
+ sig { returns(T.nilable(Integer)) }
76
+ attr_reader :max_statuses
77
+
78
+ sig { params(max_statuses: Integer).void }
79
+ attr_writer :max_statuses
80
+
81
+ # Minimum account age in whole days.
82
+ sig { returns(T.nilable(Integer)) }
83
+ attr_reader :min_account_age_days
84
+
85
+ sig { params(min_account_age_days: Integer).void }
86
+ attr_writer :min_account_age_days
87
+
88
+ # Minimum follower count. Filtering happens before billing.
89
+ sig { returns(T.nilable(Integer)) }
90
+ attr_reader :min_followers
91
+
92
+ sig { params(min_followers: Integer).void }
93
+ attr_writer :min_followers
94
+
95
+ # Minimum following count.
96
+ sig { returns(T.nilable(Integer)) }
97
+ attr_reader :min_following
98
+
99
+ sig { params(min_following: Integer).void }
100
+ attr_writer :min_following
101
+
102
+ # Minimum post count. minPosts is also accepted.
103
+ sig { returns(T.nilable(Integer)) }
104
+ attr_reader :min_statuses
105
+
106
+ sig { params(min_statuses: Integer).void }
107
+ attr_writer :min_statuses
108
+
109
+ # Maximum user profiles requested from this page (20-200, default 200). Source,
110
+ # filters, or credits can return fewer profiles. Keep requesting next_cursor while
111
+ # has_next_page is true. Deprecated aliases remain accepted.
36
112
  sig { returns(T.nilable(Integer)) }
37
113
  attr_reader :page_size
38
114
 
39
115
  sig { params(page_size: Integer).void }
40
116
  attr_writer :page_size
41
117
 
118
+ # Match a username substring, ignoring case.
119
+ sig { returns(T.nilable(String)) }
120
+ attr_reader :username_contains
121
+
122
+ sig { params(username_contains: String).void }
123
+ attr_writer :username_contains
124
+
125
+ # Only return verified profiles.
126
+ sig { returns(T.nilable(T::Boolean)) }
127
+ attr_reader :verified_only
128
+
129
+ sig { params(verified_only: T::Boolean).void }
130
+ attr_writer :verified_only
131
+
132
+ # Match the verification type exactly, ignoring case.
133
+ sig { returns(T.nilable(String)) }
134
+ attr_reader :verified_type
135
+
136
+ sig { params(verified_type: String).void }
137
+ attr_writer :verified_type
138
+
42
139
  sig do
43
140
  params(
44
141
  id: String,
142
+ bio_contains: String,
45
143
  cursor: String,
144
+ has_location: T::Boolean,
145
+ has_website: T::Boolean,
146
+ location_contains: String,
147
+ max_followers: Integer,
148
+ max_following: Integer,
149
+ max_statuses: Integer,
150
+ min_account_age_days: Integer,
151
+ min_followers: Integer,
152
+ min_following: Integer,
153
+ min_statuses: Integer,
46
154
  page_size: Integer,
155
+ username_contains: String,
156
+ verified_only: T::Boolean,
157
+ verified_type: String,
47
158
  request_options: XTwitterScraper::RequestOptions::OrHash
48
159
  ).returns(T.attached_class)
49
160
  end
50
161
  def self.new(
51
162
  id:,
163
+ # Match any comma-separated or line-separated bio term, ignoring case.
164
+ bio_contains: nil,
52
165
  # Pagination cursor for followers-you-know
53
166
  cursor: nil,
54
- # Maximum user profiles requested from this page (20-200, default 200). The
55
- # response can contain fewer profiles because the source returned fewer or
56
- # remaining credits cover fewer results. Keep requesting next_cursor while
57
- # has_next_page is true. The deprecated limit and count aliases remain accepted.
167
+ # Only return profiles with a location.
168
+ has_location: nil,
169
+ # Only return profiles with a website.
170
+ has_website: nil,
171
+ # Match a location substring, ignoring case.
172
+ location_contains: nil,
173
+ # Maximum follower count. Missing counts pass this maximum.
174
+ max_followers: nil,
175
+ # Maximum following count.
176
+ max_following: nil,
177
+ # Maximum post count. maxPosts is also accepted.
178
+ max_statuses: nil,
179
+ # Minimum account age in whole days.
180
+ min_account_age_days: nil,
181
+ # Minimum follower count. Filtering happens before billing.
182
+ min_followers: nil,
183
+ # Minimum following count.
184
+ min_following: nil,
185
+ # Minimum post count. minPosts is also accepted.
186
+ min_statuses: nil,
187
+ # Maximum user profiles requested from this page (20-200, default 200). Source,
188
+ # filters, or credits can return fewer profiles. Keep requesting next_cursor while
189
+ # has_next_page is true. Deprecated aliases remain accepted.
58
190
  page_size: nil,
191
+ # Match a username substring, ignoring case.
192
+ username_contains: nil,
193
+ # Only return verified profiles.
194
+ verified_only: nil,
195
+ # Match the verification type exactly, ignoring case.
196
+ verified_type: nil,
59
197
  request_options: {}
60
198
  )
61
199
  end
@@ -64,8 +202,22 @@ module XTwitterScraper
64
202
  override.returns(
65
203
  {
66
204
  id: String,
205
+ bio_contains: String,
67
206
  cursor: String,
207
+ has_location: T::Boolean,
208
+ has_website: T::Boolean,
209
+ location_contains: String,
210
+ max_followers: Integer,
211
+ max_following: Integer,
212
+ max_statuses: Integer,
213
+ min_account_age_days: Integer,
214
+ min_followers: Integer,
215
+ min_following: Integer,
216
+ min_statuses: Integer,
68
217
  page_size: Integer,
218
+ username_contains: String,
219
+ verified_only: T::Boolean,
220
+ verified_type: String,
69
221
  request_options: XTwitterScraper::RequestOptions
70
222
  }
71
223
  )