tweepy-self 1.10.0b3__tar.gz → 1.10.0b5__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. tweepy_self-1.10.0b5/PKG-INFO +303 -0
  2. tweepy_self-1.10.0b5/README.md +276 -0
  3. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/pyproject.toml +2 -2
  4. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/client.py +124 -84
  5. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/utils/html.py +6 -2
  6. tweepy_self-1.10.0b3/PKG-INFO +0 -225
  7. tweepy_self-1.10.0b3/README.md +0 -199
  8. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/__init__.py +0 -0
  9. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/__init__.py +0 -0
  10. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/core/__init__.py +0 -0
  11. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/core/base.py +0 -0
  12. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/core/config.py +0 -0
  13. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/core/enum.py +0 -0
  14. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/core/serializer.py +0 -0
  15. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/_capsolver/fun_captcha.py +0 -0
  16. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/account.py +0 -0
  17. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/base/__init__.py +0 -0
  18. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/base/client.py +0 -0
  19. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/base/session.py +0 -0
  20. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/enums.py +0 -0
  21. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/errors.py +0 -0
  22. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/models.py +0 -0
  23. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/utils/__init__.py +0 -0
  24. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/utils/file.py +0 -0
  25. {tweepy_self-1.10.0b3 → tweepy_self-1.10.0b5}/twitter/utils/other.py +0 -0
@@ -0,0 +1,303 @@
1
+ Metadata-Version: 2.1
2
+ Name: tweepy-self
3
+ Version: 1.10.0b5
4
+ Summary: Twitter (selfbot) for Python!
5
+ Home-page: https://github.com/alenkimov/tweepy-self
6
+ Author: Alen
7
+ Author-email: alen.kimov@gmail.com
8
+ Requires-Python: >=3.11,<4.0
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: aiohttp (>=3.9,<4.0)
13
+ Requires-Dist: beautifulsoup4 (>=4,<5)
14
+ Requires-Dist: better-proxy (>=1.1,<2.0)
15
+ Requires-Dist: curl_cffi (==0.6.2)
16
+ Requires-Dist: loguru (>=0.7,<0.8)
17
+ Requires-Dist: lxml (>=5,<6)
18
+ Requires-Dist: pydantic (>=2,<3)
19
+ Requires-Dist: pyotp (>=2,<3)
20
+ Requires-Dist: requests (>=2,<3)
21
+ Requires-Dist: tenacity (>=8,<9)
22
+ Requires-Dist: yarl (>=1,<2)
23
+ Project-URL: Repository, https://github.com/alenkimov/tweepy-self
24
+ Project-URL: Source, https://github.com/alenkimov/tweepy-self
25
+ Description-Content-Type: text/markdown
26
+
27
+ # Tweepy-self
28
+ [![Telegram channel](https://img.shields.io/endpoint?url=https://runkit.io/damiankrawczyk/telegram-badge/branches/master?url=https://t.me/cum_insider)](https://t.me/cum_insider)
29
+ [![PyPI version info](https://img.shields.io/pypi/v/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
30
+ [![PyPI supported Python versions](https://img.shields.io/pypi/pyversions/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
31
+ [![PyPI downloads per month](https://img.shields.io/pypi/dm/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
32
+
33
+ A modern, easy to use, feature-rich, and async ready API wrapper for Twitter's user API written in Python.
34
+
35
+ More libraries of the family:
36
+ - [better-proxy](https://github.com/alenkimov/better_proxy)
37
+ - [better-web3](https://github.com/alenkimov/better_web3)
38
+
39
+ Отдельное спасибо [Кузнице Ботов](https://t.me/bots_forge) за код для авторизации и разморозки! Подписывайтесь на их Telegram :)
40
+
41
+ ## Key Features
42
+ - Modern Pythonic API using async and await.
43
+ - Prevents user account automation detection.
44
+
45
+ ## Installing
46
+ ```bash
47
+ pip install tweepy-self
48
+ ```
49
+
50
+ ## Example
51
+ ```python
52
+ import asyncio
53
+ import twitter
54
+
55
+ twitter_account = twitter.Account(auth_token="auth_token")
56
+
57
+ async def main():
58
+ async with twitter.Client(twitter_account) as twitter_client:
59
+ print(f"Logged in as @{twitter_account.username} (id={twitter_account.id})")
60
+ tweet = await twitter_client.tweet("Hello tweepy-self! <3")
61
+ print(tweet)
62
+
63
+ if __name__ == "__main__":
64
+ asyncio.run(main())
65
+ ```
66
+
67
+ ## Документация
68
+ ### Некоторые истины
69
+ Имена пользователей нужно передавать БЕЗ знака `@`.
70
+ Чтобы наверняка убрать этот знак можно передать имя пользователя в функцию `twitter.utils.remove_at_sign()`
71
+
72
+ Automating user accounts is against the Twitter ToS. This library is a proof of concept and I cannot recommend using it. Do so at your own risk
73
+
74
+ ### Как включить логирование
75
+ ```python
76
+ import sys
77
+ from loguru import logger
78
+
79
+ logger.remove()
80
+ logger.add(sys.stdout, level="INFO")
81
+ logger.enable("twitter")
82
+ ```
83
+
84
+ `level="DEBUG"` позволяет увидеть информацию обо всех запросах.
85
+
86
+ ### Аккаунт
87
+ После любого взаимодействия с Twitter устанавливается статус аккаунта:
88
+ - `UNKNOWN` - Статус аккаунта не установлен. Это статус по умолчанию.
89
+ - `BAD_TOKEN` - Неверный или мертвый токен.
90
+ - `SUSPENDED` - Действие учетной записи приостановлено. Тем не менее возможен запрос данных, а также авторизация через OAuth и OAuth2.
91
+ - `LOCKED` - Учетная запись заморожена (лок). Для разморозки (анлок) требуется прохождение капчи (funcaptcha).
92
+ - `CONSENT_LOCKED` - Учетная запись заморожена (лок). Условия для разморозки неизвестны.
93
+ - `GOOD` - Аккаунт в порядке.
94
+
95
+ Не каждое взаимодействие с Twitter достоверно определяет статус аккаунта.
96
+ Например, простой запрос данных об аккаунте честно вернет данные, даже если действие вашей учетной записи приостановлено.
97
+
98
+ Для достоверной установки статуса аккаунта используйте метод `Client.establish_status()`
99
+
100
+ ### Настройка клиента
101
+ Класс `twitter.Client` может быть сконфигурирован перед работой. Он принимает в себя следующие параметры:
102
+ - `wait_on_rate_limit` Если включено, то при достижении Rate Limit будет ждать, вместо того, чтобы выбрасывать исключение. Включено по умолчанию.
103
+ - `capsolver_api_key` API ключ сервиса [CapSolver](https://dashboard.capsolver.com/passport/register?inviteCode=m-aE3NeBGZLU). Нужен для автоматической разморозки аккаунта.
104
+ - `max_unlock_attempts` Максимальное количество попыток разморозки аккаунта. По умолчанию: 5.
105
+ - `auto_relogin` Если включено, то при невалидном токене (`BAD_TOKEN`) и предоставленных данных для авторизации (имя пользователя, пароль и totp_secret) будет произведен автоматический релогин (замена токена). Включено по умолчанию.
106
+ - `update_account_info_on_startup` Если включено, то на старте будет автоматически запрошена информация об аккаунте. Включено по умолчанию.
107
+ - `**session_kwargs` Любые параметры, которые может принимать сессия `curl_cffi.requests.AsyncSession`. Например, можно передать параметр `proxy`.
108
+
109
+ Пример настройки клиента:
110
+ ```python
111
+ async with twitter.Client(
112
+ twitter_account,
113
+ capsolver_api_key="CAP-00000000000000000000000000000000",
114
+ proxy="http://login:password@ip:port", # Можно передавать в любом формате, так как используется библиотека better_proxy
115
+ ) as twitter_client:
116
+ ...
117
+ ```
118
+
119
+ ### Доступные методы
120
+ Список всех методов.
121
+
122
+ #### Запрос информации о собственном аккаунте
123
+ ```python
124
+ twitter_client.update_account_info()
125
+ print(twitter_client.account)
126
+ ```
127
+
128
+ #### Запрос пользователя по username или по ID
129
+
130
+ ```python
131
+ bro = twitter_client.request_user_by_username(bro_username)
132
+ bro = twitter_client.request_user_by_id(bro_id)
133
+ bros = twitter_client.request_users_by_ids([bro1_id, bro2_id, ...])
134
+ ```
135
+
136
+ #### Загрузка изображения на сервер, смена аватарки и баннера
137
+ ```python
138
+ image = open("image.png", "rb").read()
139
+ media = await twitter_client.upload_image(image)
140
+ avatar_image_url = await twitter_client.update_profile_avatar(media.id)
141
+ banner_image_url = await twitter_client.update_profile_banner(media.id)
142
+ ```
143
+
144
+ #### Изменения данных профиля
145
+ ```python
146
+ await twitter_client.update_birthdate(day=1, month=12, year=2000)
147
+ await twitter_client.update_profile( # Locks account!
148
+ name="New Name",
149
+ description="New description",
150
+ location="New York",
151
+ website="https://github.com/alenkimov/tweepy-self",
152
+ )
153
+ ```
154
+
155
+ #### Включение TOTP (2FA)
156
+ ```python
157
+ if await twitter_client.totp_is_enabled():
158
+ print(f"TOTP уже включен.")
159
+ return
160
+
161
+ await twitter_client.enable_totp()
162
+ ```
163
+
164
+ #### Логин, если включен TOTP (2FA)
165
+ ```python
166
+ import twitter
167
+
168
+ twitter_account = twitter.Account(auth_token="...", username="...", password="...", totp_secret="...")
169
+ await twitter_client.login()
170
+ print(f"Logged in! New auth_token: {twitter_account.auth_token}")
171
+ ```
172
+
173
+ #### Смена имени пользователя и пароля
174
+ ```python
175
+ twitter_account = twitter.Account("auth_token", password="password")
176
+ ...
177
+ await twitter_client.change_username("new_username")
178
+ await twitter_client.request_user()
179
+ print(f"New username: {twitter_account.username}")
180
+
181
+ await twitter_client.change_password("new_password")
182
+ print(f"New password: {twitter_account.password}")
183
+ print(f"New auth_token: {twitter_account.auth_token}")
184
+ ```
185
+
186
+ #### Авторизация с OAuth
187
+ ```python
188
+ auth_code = await twitter_client.oauth(oauth_token, **oauth_params)
189
+ ```
190
+
191
+ #### Авторизация с OAuth2
192
+ ```python
193
+ # Изучите запросы сервиса и найдите подобные данные для авторизации (привязки):
194
+ oauth2_data = {
195
+ 'response_type': 'code',
196
+ 'client_id': 'TjFVQm52ZDFGWEtNT0tKaktaSWU6MTpjaQ',
197
+ 'redirect_uri': 'https://waitlist.lens.xyz/tw/',
198
+ 'scope': 'users.read tweet.read offline.access',
199
+ 'state': 'state', # Может быть как статичным, так и динамическим.
200
+ 'code_challenge': 'challenge',
201
+ 'code_challenge_method': 'plain'
202
+ }
203
+
204
+ auth_code = await twitter_client.oauth2(**oauth2_data)
205
+ # Передайте код авторизации (привязки) сервису.
206
+ # Сервис также может потребовать state, если он динамический.
207
+ ```
208
+
209
+ #### Отправка сообщения:
210
+ ```python
211
+ bro = await twitter_client.request_user("bro_username")
212
+ await twitter_client.send_message(bro.id, "I love you!")
213
+ ```
214
+
215
+ #### Запрос входящих сообщений:
216
+ ```python
217
+ messages = await twitter_client.request_messages()
218
+ for message in messages:
219
+ message_data = message["message_data"]
220
+ recipient_id = message_data["recipient_id"]
221
+ sender_id = message_data["sender_id"]
222
+ text = message_data["text"]
223
+ print(f"[id {sender_id}] -> [id {recipient_id}]: {text}")
224
+ ```
225
+
226
+ Так как мне почти не приходилось работать с сообщениями, я еще не сделал для этого удобных моделей.
227
+ Поэтому приходится работать со словарем.
228
+
229
+ #### Пост (твит)
230
+ ```python
231
+ tweet = await twitter_client.tweet("I love you tweepy-self! <3")
232
+ print(f"Любовь выражена! Tweet id: {tweet.id}")
233
+ ```
234
+
235
+ #### Лайк, репост (ретвит), коммент (реплай)
236
+ ```python
237
+ # Лайк
238
+ print(f"Tweet {tweet_id} is liked: {await twitter_client.like(tweet_id)}")
239
+
240
+ # Репост (ретвит)
241
+ print(f"Tweet {tweet_id} is retweeted. Tweet id: {await twitter_client.repost(tweet_id)}")
242
+
243
+ # Коммент (реплай)
244
+ print(f"Tweet {tweet_id} is replied. Reply id: {await twitter_client.reply(tweet_id, 'tem razão')}")
245
+ ```
246
+
247
+ #### Цитата
248
+ ```python
249
+ tweet_url = 'https://twitter.com/CreamIce_Cone/status/1691735090529976489'
250
+ # Цитата (Quote tweet)
251
+ quote_tweet_id = await twitter_client.quote(tweet_url, 'oh....')
252
+ print(f"Quoted! Tweet id: {quote_tweet_id}")
253
+ ```
254
+
255
+ #### Подписка и отписка
256
+ ```python
257
+ # Подписываемся на Илона Маска
258
+ print(f"@{elonmusk.username} is followed: {await twitter_client.follow(elonmusk.id)}")
259
+
260
+ # Отписываемся от Илона Маска
261
+ print(f"@{elonmusk.username} is unfollowed: {await twitter_client.unfollow(elonmusk.id)}")
262
+ ```
263
+
264
+ #### Закрепление твита
265
+ ```python
266
+ pinned = await twitter_client.pin_tweet(tweet_id)
267
+ print(f"Tweet is pined: {pinned}")
268
+ ```
269
+
270
+ #### Запрос своих и чужих подписчиков
271
+ ```python
272
+
273
+ followers = await twitter_client.request_followers()
274
+ print("Твои подписчики:")
275
+ for user in followers:
276
+ print(user)
277
+
278
+ followings = await twitter_client.request_followings()
279
+ print(f"Ты подписан на:")
280
+ for user in followings:
281
+ print(user)
282
+
283
+ bro_followers = await twitter_client.request_followers(bro_id)
284
+ print(f"Подписчики твоего бро (id={bro_id}):")
285
+ for user in bro_followers:
286
+ print(user)
287
+
288
+ bro_followings = await twitter_client.request_followings(bro_id)
289
+ print(f"На твоего бро (id={bro_id}) подписаны:")
290
+ for user in bro_followings:
291
+ print(user)
292
+ ```
293
+
294
+ #### Голосование
295
+ ```python
296
+ vote_data = await twitter_client.vote(tweet_id, card_id, choice_number)
297
+ votes_count = vote_data["card"]["binding_values"]["choice1_count"]["string_value"]
298
+ print(f"Votes: {votes_count}")
299
+ ```
300
+
301
+ Так как мне почти не приходилось работать с голосованиями, я еще не сделал для этого удобных моделей.
302
+ Поэтому приходится работать со словарем.
303
+
@@ -0,0 +1,276 @@
1
+ # Tweepy-self
2
+ [![Telegram channel](https://img.shields.io/endpoint?url=https://runkit.io/damiankrawczyk/telegram-badge/branches/master?url=https://t.me/cum_insider)](https://t.me/cum_insider)
3
+ [![PyPI version info](https://img.shields.io/pypi/v/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
4
+ [![PyPI supported Python versions](https://img.shields.io/pypi/pyversions/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
5
+ [![PyPI downloads per month](https://img.shields.io/pypi/dm/tweepy-self.svg)](https://pypi.python.org/pypi/tweepy-self)
6
+
7
+ A modern, easy to use, feature-rich, and async ready API wrapper for Twitter's user API written in Python.
8
+
9
+ More libraries of the family:
10
+ - [better-proxy](https://github.com/alenkimov/better_proxy)
11
+ - [better-web3](https://github.com/alenkimov/better_web3)
12
+
13
+ Отдельное спасибо [Кузнице Ботов](https://t.me/bots_forge) за код для авторизации и разморозки! Подписывайтесь на их Telegram :)
14
+
15
+ ## Key Features
16
+ - Modern Pythonic API using async and await.
17
+ - Prevents user account automation detection.
18
+
19
+ ## Installing
20
+ ```bash
21
+ pip install tweepy-self
22
+ ```
23
+
24
+ ## Example
25
+ ```python
26
+ import asyncio
27
+ import twitter
28
+
29
+ twitter_account = twitter.Account(auth_token="auth_token")
30
+
31
+ async def main():
32
+ async with twitter.Client(twitter_account) as twitter_client:
33
+ print(f"Logged in as @{twitter_account.username} (id={twitter_account.id})")
34
+ tweet = await twitter_client.tweet("Hello tweepy-self! <3")
35
+ print(tweet)
36
+
37
+ if __name__ == "__main__":
38
+ asyncio.run(main())
39
+ ```
40
+
41
+ ## Документация
42
+ ### Некоторые истины
43
+ Имена пользователей нужно передавать БЕЗ знака `@`.
44
+ Чтобы наверняка убрать этот знак можно передать имя пользователя в функцию `twitter.utils.remove_at_sign()`
45
+
46
+ Automating user accounts is against the Twitter ToS. This library is a proof of concept and I cannot recommend using it. Do so at your own risk
47
+
48
+ ### Как включить логирование
49
+ ```python
50
+ import sys
51
+ from loguru import logger
52
+
53
+ logger.remove()
54
+ logger.add(sys.stdout, level="INFO")
55
+ logger.enable("twitter")
56
+ ```
57
+
58
+ `level="DEBUG"` позволяет увидеть информацию обо всех запросах.
59
+
60
+ ### Аккаунт
61
+ После любого взаимодействия с Twitter устанавливается статус аккаунта:
62
+ - `UNKNOWN` - Статус аккаунта не установлен. Это статус по умолчанию.
63
+ - `BAD_TOKEN` - Неверный или мертвый токен.
64
+ - `SUSPENDED` - Действие учетной записи приостановлено. Тем не менее возможен запрос данных, а также авторизация через OAuth и OAuth2.
65
+ - `LOCKED` - Учетная запись заморожена (лок). Для разморозки (анлок) требуется прохождение капчи (funcaptcha).
66
+ - `CONSENT_LOCKED` - Учетная запись заморожена (лок). Условия для разморозки неизвестны.
67
+ - `GOOD` - Аккаунт в порядке.
68
+
69
+ Не каждое взаимодействие с Twitter достоверно определяет статус аккаунта.
70
+ Например, простой запрос данных об аккаунте честно вернет данные, даже если действие вашей учетной записи приостановлено.
71
+
72
+ Для достоверной установки статуса аккаунта используйте метод `Client.establish_status()`
73
+
74
+ ### Настройка клиента
75
+ Класс `twitter.Client` может быть сконфигурирован перед работой. Он принимает в себя следующие параметры:
76
+ - `wait_on_rate_limit` Если включено, то при достижении Rate Limit будет ждать, вместо того, чтобы выбрасывать исключение. Включено по умолчанию.
77
+ - `capsolver_api_key` API ключ сервиса [CapSolver](https://dashboard.capsolver.com/passport/register?inviteCode=m-aE3NeBGZLU). Нужен для автоматической разморозки аккаунта.
78
+ - `max_unlock_attempts` Максимальное количество попыток разморозки аккаунта. По умолчанию: 5.
79
+ - `auto_relogin` Если включено, то при невалидном токене (`BAD_TOKEN`) и предоставленных данных для авторизации (имя пользователя, пароль и totp_secret) будет произведен автоматический релогин (замена токена). Включено по умолчанию.
80
+ - `update_account_info_on_startup` Если включено, то на старте будет автоматически запрошена информация об аккаунте. Включено по умолчанию.
81
+ - `**session_kwargs` Любые параметры, которые может принимать сессия `curl_cffi.requests.AsyncSession`. Например, можно передать параметр `proxy`.
82
+
83
+ Пример настройки клиента:
84
+ ```python
85
+ async with twitter.Client(
86
+ twitter_account,
87
+ capsolver_api_key="CAP-00000000000000000000000000000000",
88
+ proxy="http://login:password@ip:port", # Можно передавать в любом формате, так как используется библиотека better_proxy
89
+ ) as twitter_client:
90
+ ...
91
+ ```
92
+
93
+ ### Доступные методы
94
+ Список всех методов.
95
+
96
+ #### Запрос информации о собственном аккаунте
97
+ ```python
98
+ twitter_client.update_account_info()
99
+ print(twitter_client.account)
100
+ ```
101
+
102
+ #### Запрос пользователя по username или по ID
103
+
104
+ ```python
105
+ bro = twitter_client.request_user_by_username(bro_username)
106
+ bro = twitter_client.request_user_by_id(bro_id)
107
+ bros = twitter_client.request_users_by_ids([bro1_id, bro2_id, ...])
108
+ ```
109
+
110
+ #### Загрузка изображения на сервер, смена аватарки и баннера
111
+ ```python
112
+ image = open("image.png", "rb").read()
113
+ media = await twitter_client.upload_image(image)
114
+ avatar_image_url = await twitter_client.update_profile_avatar(media.id)
115
+ banner_image_url = await twitter_client.update_profile_banner(media.id)
116
+ ```
117
+
118
+ #### Изменения данных профиля
119
+ ```python
120
+ await twitter_client.update_birthdate(day=1, month=12, year=2000)
121
+ await twitter_client.update_profile( # Locks account!
122
+ name="New Name",
123
+ description="New description",
124
+ location="New York",
125
+ website="https://github.com/alenkimov/tweepy-self",
126
+ )
127
+ ```
128
+
129
+ #### Включение TOTP (2FA)
130
+ ```python
131
+ if await twitter_client.totp_is_enabled():
132
+ print(f"TOTP уже включен.")
133
+ return
134
+
135
+ await twitter_client.enable_totp()
136
+ ```
137
+
138
+ #### Логин, если включен TOTP (2FA)
139
+ ```python
140
+ import twitter
141
+
142
+ twitter_account = twitter.Account(auth_token="...", username="...", password="...", totp_secret="...")
143
+ await twitter_client.login()
144
+ print(f"Logged in! New auth_token: {twitter_account.auth_token}")
145
+ ```
146
+
147
+ #### Смена имени пользователя и пароля
148
+ ```python
149
+ twitter_account = twitter.Account("auth_token", password="password")
150
+ ...
151
+ await twitter_client.change_username("new_username")
152
+ await twitter_client.request_user()
153
+ print(f"New username: {twitter_account.username}")
154
+
155
+ await twitter_client.change_password("new_password")
156
+ print(f"New password: {twitter_account.password}")
157
+ print(f"New auth_token: {twitter_account.auth_token}")
158
+ ```
159
+
160
+ #### Авторизация с OAuth
161
+ ```python
162
+ auth_code = await twitter_client.oauth(oauth_token, **oauth_params)
163
+ ```
164
+
165
+ #### Авторизация с OAuth2
166
+ ```python
167
+ # Изучите запросы сервиса и найдите подобные данные для авторизации (привязки):
168
+ oauth2_data = {
169
+ 'response_type': 'code',
170
+ 'client_id': 'TjFVQm52ZDFGWEtNT0tKaktaSWU6MTpjaQ',
171
+ 'redirect_uri': 'https://waitlist.lens.xyz/tw/',
172
+ 'scope': 'users.read tweet.read offline.access',
173
+ 'state': 'state', # Может быть как статичным, так и динамическим.
174
+ 'code_challenge': 'challenge',
175
+ 'code_challenge_method': 'plain'
176
+ }
177
+
178
+ auth_code = await twitter_client.oauth2(**oauth2_data)
179
+ # Передайте код авторизации (привязки) сервису.
180
+ # Сервис также может потребовать state, если он динамический.
181
+ ```
182
+
183
+ #### Отправка сообщения:
184
+ ```python
185
+ bro = await twitter_client.request_user("bro_username")
186
+ await twitter_client.send_message(bro.id, "I love you!")
187
+ ```
188
+
189
+ #### Запрос входящих сообщений:
190
+ ```python
191
+ messages = await twitter_client.request_messages()
192
+ for message in messages:
193
+ message_data = message["message_data"]
194
+ recipient_id = message_data["recipient_id"]
195
+ sender_id = message_data["sender_id"]
196
+ text = message_data["text"]
197
+ print(f"[id {sender_id}] -> [id {recipient_id}]: {text}")
198
+ ```
199
+
200
+ Так как мне почти не приходилось работать с сообщениями, я еще не сделал для этого удобных моделей.
201
+ Поэтому приходится работать со словарем.
202
+
203
+ #### Пост (твит)
204
+ ```python
205
+ tweet = await twitter_client.tweet("I love you tweepy-self! <3")
206
+ print(f"Любовь выражена! Tweet id: {tweet.id}")
207
+ ```
208
+
209
+ #### Лайк, репост (ретвит), коммент (реплай)
210
+ ```python
211
+ # Лайк
212
+ print(f"Tweet {tweet_id} is liked: {await twitter_client.like(tweet_id)}")
213
+
214
+ # Репост (ретвит)
215
+ print(f"Tweet {tweet_id} is retweeted. Tweet id: {await twitter_client.repost(tweet_id)}")
216
+
217
+ # Коммент (реплай)
218
+ print(f"Tweet {tweet_id} is replied. Reply id: {await twitter_client.reply(tweet_id, 'tem razão')}")
219
+ ```
220
+
221
+ #### Цитата
222
+ ```python
223
+ tweet_url = 'https://twitter.com/CreamIce_Cone/status/1691735090529976489'
224
+ # Цитата (Quote tweet)
225
+ quote_tweet_id = await twitter_client.quote(tweet_url, 'oh....')
226
+ print(f"Quoted! Tweet id: {quote_tweet_id}")
227
+ ```
228
+
229
+ #### Подписка и отписка
230
+ ```python
231
+ # Подписываемся на Илона Маска
232
+ print(f"@{elonmusk.username} is followed: {await twitter_client.follow(elonmusk.id)}")
233
+
234
+ # Отписываемся от Илона Маска
235
+ print(f"@{elonmusk.username} is unfollowed: {await twitter_client.unfollow(elonmusk.id)}")
236
+ ```
237
+
238
+ #### Закрепление твита
239
+ ```python
240
+ pinned = await twitter_client.pin_tweet(tweet_id)
241
+ print(f"Tweet is pined: {pinned}")
242
+ ```
243
+
244
+ #### Запрос своих и чужих подписчиков
245
+ ```python
246
+
247
+ followers = await twitter_client.request_followers()
248
+ print("Твои подписчики:")
249
+ for user in followers:
250
+ print(user)
251
+
252
+ followings = await twitter_client.request_followings()
253
+ print(f"Ты подписан на:")
254
+ for user in followings:
255
+ print(user)
256
+
257
+ bro_followers = await twitter_client.request_followers(bro_id)
258
+ print(f"Подписчики твоего бро (id={bro_id}):")
259
+ for user in bro_followers:
260
+ print(user)
261
+
262
+ bro_followings = await twitter_client.request_followings(bro_id)
263
+ print(f"На твоего бро (id={bro_id}) подписаны:")
264
+ for user in bro_followings:
265
+ print(user)
266
+ ```
267
+
268
+ #### Голосование
269
+ ```python
270
+ vote_data = await twitter_client.vote(tweet_id, card_id, choice_number)
271
+ votes_count = vote_data["card"]["binding_values"]["choice1_count"]["string_value"]
272
+ print(f"Votes: {votes_count}")
273
+ ```
274
+
275
+ Так как мне почти не приходилось работать с голосованиями, я еще не сделал для этого удобных моделей.
276
+ Поэтому приходится работать со словарем.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "tweepy-self"
3
- version = "1.10.0.b3"
3
+ version = "1.10.0.b5"
4
4
  description = "Twitter (selfbot) for Python!"
5
5
  authors = ["Alen <alen.kimov@gmail.com>"]
6
6
  readme = "README.md"
@@ -15,7 +15,7 @@ python = "^3.11"
15
15
  curl_cffi = "0.6.2"
16
16
  better-proxy = "^1.1"
17
17
  beautifulsoup4 = "^4"
18
- pydantic = ">=2"
18
+ pydantic = "^2"
19
19
  lxml = "^5"
20
20
  pyotp = "^2"
21
21
  yarl = "^1"